From f8181343594322ceb740e3237bb1b9260e433a48 Mon Sep 17 00:00:00 2001 From: zhangzhuo Date: Mon, 21 Mar 2022 18:03:52 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BB=A3=E7=A0=81=E6=89=93=E6=8D=9E&?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + CMakeLists.txt | 9 - IRIS_FODIS/CMakeLists.txt | 44 +- .../CMakeSettings.json | 2 +- IRIS_FODIS/IRIS_FODIS.cpp | 12 - IRIS_FODIS/IRIS_FODIS.h | 8 - IRIS_FODIS/Settings/DeviceSettings.ini | 0 IRIS_FODIS/Source/FS/ATPControl_Serial_QT.cpp | 784 +++++ IRIS_FODIS/Source/FS/ATPControl_Serial_QT.h | 94 + IRIS_FODIS/Source/FS/DataFileProcessor.cpp | 260 ++ IRIS_FODIS/Source/FS/DataFileProcessor.h | 39 + .../Source/FS/IrisFiberSpectrometerBase.h | 45 + IRIS_FODIS/Source/FS/OControl_USB.cpp | 559 ++++ IRIS_FODIS/Source/FS/OControl_USB.h | 57 + IRIS_FODIS/Source/FS/ZZ_Types.h | 349 +++ IRIS_FODIS/Source/Logger/Logger.h | 90 + IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.dll | Bin 0 -> 2670080 bytes IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.lib | Bin 0 -> 129806 bytes .../Source/OSIF/include/api/DeviceFactory.h | 63 + IRIS_FODIS/Source/OSIF/include/api/DllDecl.h | 56 + .../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 + IRIS_FODIS/Source/OSIF/include/common/Data.h | 62 + .../Source/OSIF/include/common/DoubleVector.h | 62 + .../Source/OSIF/include/common/FloatVector.h | 62 + IRIS_FODIS/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 + .../OSIF/include/common/UnitDescriptor.h | 46 + .../Source/OSIF/include/common/buses/Bus.h | 66 + .../OSIF/include/common/buses/BusFamilies.h | 86 + .../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 + .../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 + .../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 + .../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 + .../OSIF/include/native/system/System.h | 51 + .../OSIF/include/native/usb/NativeUSB.h | 226 ++ .../Source/OSIF/include/native/usb/USB.h | 84 + .../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 + IRIS_FODIS/Source/Settings/SysConfigger.cpp | 19 + IRIS_FODIS/Source/Settings/SysConfigger.h | 19 + IRIS_FODIS/Source/ZZ_SDK/ZZ_Math_HDRONLY.h | 84 + IRIS_FODIS/Source/pch.h | 34 + IRIS_FODIS/main.cpp | 8 + .../v1/query/client-MicrosoftVS/query.json | 1 + .../reply/cache-v2-f72cb0af4748b9873246.json | 1191 ++++++++ .../cmakeFiles-v1-1a4c0b26d3929f2ab476.json | 177 ++ .../codemodel-v2-4b51f020c0a09a8b9c98.json | 68 + .../reply/index-2022-03-21T05-03-37-0384.json | 117 + ...IRIS_FODIS-Debug-30e14700b6a329269cef.json | 2686 +++++++++++++++++ ...IS_autogen-Debug-71767491ed4237dcb02c.json | 58 + .../out/build/Linux-GCC-Debug/IRIS_FODIS | Bin 0 -> 1232484 bytes .../Linux-GCC-Debug/isenseconfig/iconfig.json | 811 +++++ .../v1/query/client-MicrosoftVS/query.json | 1 + IRIS_FODIS/out/build/x64-Debug/CMakeCache.txt | 350 +++ .../3.21.21080301-MSVC_2/CMakeCCompiler.cmake | 80 + .../CMakeCXXCompiler.cmake | 91 + .../CMakeDetermineCompilerABI_C.bin | Bin 0 -> 51200 bytes .../CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 51200 bytes .../CMakeRCCompiler.cmake | 6 + .../3.21.21080301-MSVC_2/CMakeSystem.cmake | 15 + .../CompilerIdC/CMakeCCompilerId.c | 807 +++++ .../CompilerIdC/CMakeCCompilerId.exe | Bin 0 -> 96256 bytes .../CompilerIdC/CMakeCCompilerId.obj | Bin 0 -> 1819 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 795 +++++ .../CompilerIdCXX/CMakeCXXCompilerId.exe | Bin 0 -> 96256 bytes .../CompilerIdCXX/CMakeCXXCompilerId.obj | Bin 0 -> 1840 bytes .../x64-Debug/CMakeFiles/CMakeOutput.log | 65 + .../x64-Debug/CMakeFiles/ShowIncludes/foo.h | 1 + .../x64-Debug/CMakeFiles/ShowIncludes/main.c | 2 + .../CMakeFiles/ShowIncludes/main.obj | Bin 0 -> 654 bytes .../x64-Debug/CMakeFiles/cmake.check_cache | 1 + .../build/x64-Debug/VSInheritEnvironments.txt | 1 + 436 files changed, 35754 insertions(+), 35 deletions(-) delete mode 100644 CMakeLists.txt rename CMakeSettings.json => IRIS_FODIS/CMakeSettings.json (95%) delete mode 100644 IRIS_FODIS/IRIS_FODIS.cpp delete mode 100644 IRIS_FODIS/IRIS_FODIS.h create mode 100644 IRIS_FODIS/Settings/DeviceSettings.ini create mode 100644 IRIS_FODIS/Source/FS/ATPControl_Serial_QT.cpp create mode 100644 IRIS_FODIS/Source/FS/ATPControl_Serial_QT.h create mode 100644 IRIS_FODIS/Source/FS/DataFileProcessor.cpp create mode 100644 IRIS_FODIS/Source/FS/DataFileProcessor.h create mode 100644 IRIS_FODIS/Source/FS/IrisFiberSpectrometerBase.h create mode 100644 IRIS_FODIS/Source/FS/OControl_USB.cpp create mode 100644 IRIS_FODIS/Source/FS/OControl_USB.h create mode 100644 IRIS_FODIS/Source/FS/ZZ_Types.h create mode 100644 IRIS_FODIS/Source/Logger/Logger.h create mode 100644 IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.dll create mode 100644 IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.lib create mode 100644 IRIS_FODIS/Source/OSIF/include/api/DeviceFactory.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/DllDecl.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/SeaBreezeWrapper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DeviceAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureFamilies.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/ByteVector.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/Data.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/DoubleVector.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/FloatVector.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/Log.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/SeaBreeze.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/U32Vector.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/UShortVector.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/UnitDescriptor.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/Bus.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/BusFamilies.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/BusFamily.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocationProberInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocatorInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/TransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232Interface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232TransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBDeviceLocator.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/devices/Device.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/BusConnectException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/BusException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/BusTransferException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureControlException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/IllegalArgumentException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/NumberFormatException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolFormatException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolTransactionException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/features/Feature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/features/FeatureFamily.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/features/FeatureImpl.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/globals.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/Exchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/Protocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolFamily.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHint.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/Transaction.h create mode 100644 IRIS_FODIS/Source/OSIF/include/common/protocols/Transfer.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/Inet4Address.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/Socket.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/SocketException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/SocketTimeoutException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/UnknownHostException.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/posix/NativeSocketPOSIX.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/network/windows/NativeSocketWindows.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/rs232/NativeRS232.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/rs232/RS232.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/rs232/windows/NativeRS232Windows.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/system/NativeSystem.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/system/System.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/usb/NativeUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/usb/USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/usb/USBDiscovery.h create mode 100644 IRIS_FODIS/Source/OSIF/include/native/usb/winusb/WindowsGUID.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Apex.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Blaze.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR4000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Jaz.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QE65000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QEPro.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/STS.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Spark.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Torus.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB4000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Ventana.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h create mode 100644 IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h create mode 100644 IRIS_FODIS/Source/Settings/SysConfigger.cpp create mode 100644 IRIS_FODIS/Source/Settings/SysConfigger.h create mode 100644 IRIS_FODIS/Source/ZZ_SDK/ZZ_Math_HDRONLY.h create mode 100644 IRIS_FODIS/Source/pch.h create mode 100644 IRIS_FODIS/main.cpp create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cache-v2-f72cb0af4748b9873246.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cmakeFiles-v1-1a4c0b26d3929f2ab476.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/codemodel-v2-4b51f020c0a09a8b9c98.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/index-2022-03-21T05-03-37-0384.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS-Debug-30e14700b6a329269cef.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS_autogen-Debug-71767491ed4237dcb02c.json create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/IRIS_FODIS create mode 100644 IRIS_FODIS/out/build/Linux-GCC-Debug/isenseconfig/iconfig.json create mode 100644 IRIS_FODIS/out/build/x64-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeCache.txt create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeCCompiler.cmake create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeCXXCompiler.cmake create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeDetermineCompilerABI_C.bin create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeRCCompiler.cmake create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CMakeSystem.cmake create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.c create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.exe create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.obj create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.obj create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeOutput.log create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/foo.h create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.c create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.obj create mode 100644 IRIS_FODIS/out/build/x64-Debug/CMakeFiles/cmake.check_cache create mode 100644 IRIS_FODIS/out/build/x64-Debug/VSInheritEnvironments.txt diff --git a/.gitignore b/.gitignore index f14b74d..b66fe93 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ ################################################################################ /.vs +/out/build/Linux-GCC-Debug +/out/build/x64-Debug diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 6a1a7e9..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,9 +0,0 @@ -# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置 -# 并包含子项目。 -# -cmake_minimum_required (VERSION 3.8) - -project ("IRIS_FODIS") - -# 包含子项目。 -add_subdirectory ("IRIS_FODIS") diff --git a/IRIS_FODIS/CMakeLists.txt b/IRIS_FODIS/CMakeLists.txt index 204b9e6..1fc56de 100644 --- a/IRIS_FODIS/CMakeLists.txt +++ b/IRIS_FODIS/CMakeLists.txt @@ -1,9 +1,43 @@ -# CMakeList.txt: IRIS_FODIS 的 CMake 项目,在此处包括源代码并定义 -# 项目特定的逻辑。 +# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置 +# 并包含子项目。 # cmake_minimum_required (VERSION 3.8) -# 将源代码添加到此项目的可执行文件。 -add_executable (IRIS_FODIS "IRIS_FODIS.cpp" "IRIS_FODIS.h") +project ("IRIS_FODIS") -# TODO: 如有需要,请添加测试并安装目标。 +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) +set(QT Core SerialPort) +set(CMAKE_CXX_STANDARD 14) + +find_package(Qt5 REQUIRED ${QT}) + +file(GLOB_RECURSE HDR_LIST "Source/*.h") +file(GLOB_RECURSE SRC_LIST "Source/*.cpp") + +include_directories("Source") +include_directories("Source/FS") +include_directories("Source/OSIF/include") +include_directories("Source/ZZ_SDK") + +link_directories("source/OSIF/DLib") +link_directories("/home/pi/SeaBrease/lib") + +add_executable( IRIS_FODIS + main.cpp + ${HDR_LIST} + ${SRC_LIST} +) + +IF (WIN32) +target_link_libraries(IRIS_FODIS SeaBreeze) +ELSE () +target_link_libraries(IRIS_FODIS seabreeze usb stdc++ m) +ENDIF () + +qt5_use_modules(IRIS_FODIS ${QT}) +set_target_properties(IRIS_FODIS PROPERTIES AUTOMOC ON) + +# 包含子项目。 +#add_subdirectory ("IRIS_FODIS") diff --git a/CMakeSettings.json b/IRIS_FODIS/CMakeSettings.json similarity index 95% rename from CMakeSettings.json rename to IRIS_FODIS/CMakeSettings.json index ef8d6db..c11d63b 100644 --- a/CMakeSettings.json +++ b/IRIS_FODIS/CMakeSettings.json @@ -11,7 +11,7 @@ "inheritEnvironments": [ "linux_arm" ], "intelliSenseMode": "linux-gcc-arm", "remoteMachineName": "243120617;172.16.0.232 (username=root, port=22, authentication=Password)", - "remoteCMakeListsRoot": "/home/pi/FODIS/src", + "remoteCMakeListsRoot": "/home/pi/FODIS/src/", "remoteBuildRoot": "/home/pi/FODIS/build_d/${name}", "remoteInstallRoot": "/home/pi/FODIS/out/install/${name}", "remoteCopySources": true, diff --git a/IRIS_FODIS/IRIS_FODIS.cpp b/IRIS_FODIS/IRIS_FODIS.cpp deleted file mode 100644 index d2f294a..0000000 --- a/IRIS_FODIS/IRIS_FODIS.cpp +++ /dev/null @@ -1,12 +0,0 @@ -// IRIS_FODIS.cpp: 定义应用程序的入口点。 -// - -#include "IRIS_FODIS.h" - -using namespace std; - -int main() -{ - cout << "Hello CMake." << endl; - return 0; -} diff --git a/IRIS_FODIS/IRIS_FODIS.h b/IRIS_FODIS/IRIS_FODIS.h deleted file mode 100644 index 63cf503..0000000 --- a/IRIS_FODIS/IRIS_FODIS.h +++ /dev/null @@ -1,8 +0,0 @@ -// IRIS_FODIS.h: 标准系统包含文件的包含文件 -// 或项目特定的包含文件。 - -#pragma once - -#include - -// TODO: 在此处引用程序需要的其他标头。 diff --git a/IRIS_FODIS/Settings/DeviceSettings.ini b/IRIS_FODIS/Settings/DeviceSettings.ini new file mode 100644 index 0000000..e69de29 diff --git a/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.cpp b/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.cpp new file mode 100644 index 0000000..a3c7003 --- /dev/null +++ b/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.cpp @@ -0,0 +1,784 @@ +#include "pch.h" +#include "ATPControl_Serial_QT.h" +#include "ZZ_Math_HDRONLY.h" + +ZZ_ATPControl_Serial_Qt::ZZ_ATPControl_Serial_Qt(QObject* parent /*= nullptr*/) +{ + m_pSerialPort = new QSerialPort; + m_iBaudRate = 115200; + //emit SignalInit_Self(); +} + +ZZ_ATPControl_Serial_Qt::~ZZ_ATPControl_Serial_Qt() +{ + if (m_pSerialPort != NULL) + { + delete m_pSerialPort; + } + +} + +// int ZZ_ATPControl_Serial_Qt::ReInit() +// { +// m_pSerialPort->close(); +// delete m_pSerialPort; +// +// m_pSerialPort = new QSerialPort; +// +// m_pSerialPort->setPortName("COM7"); +// m_pSerialPort->setReadBufferSize(512); +// bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate); +// bRes = m_pSerialPort->open(QIODevice::ReadWrite); +// } + +// int ZZ_ATPControl_Serial_Qt::SetBaudRate(int iBaud) +// { +// m_iBaudRate = iBaud; +// return 0; +// } + + +int ZZ_ATPControl_Serial_Qt::Initialize(bool bIsUSBMode, std::string ucPortNumber, std::string strDeviceName) +{ + //connect(this, &ZZ_ATPControl_Serial_Qt::SignalInit_Self, this, &ZZ_ATPControl_Serial_Qt::Init_Self); + //emit SignalInit_Self(); + + QString qstrPortName = QString::fromStdString(ucPortNumber); + + m_pSerialPort->setPortName(qstrPortName); + m_pSerialPort->setReadBufferSize(512); + bool bRes = m_pSerialPort->setBaudRate(m_iBaudRate); + if (!bRes) + { + qDebug() << "Err:setBaudRate Failed.Exit Code:1"; + //std::cout << "Err.setBaudRate Failed" << std::endl; + return 1; + } + + bRes = m_pSerialPort->open(QIODevice::ReadWrite); + if (!bRes) + { + qDebug() << "Err:open Failed.Exit Code:2"; + //std::cout << "Err.open Failed" << std::endl; + return 2; + } + + // int testi; + // GetDeviceAttribute(m_daDeviceAttr); + // GetExposureTime(testi); + // SetExposureTime(10000); + // DataFrame test; + // SingleShot(test); + + GetDeviceInfo(m_diDeviceInfo); + GetExposureTime_Init(); + + std::string::size_type szPostion = m_diDeviceInfo.strSN.find(strDeviceName); + if (szPostion == std::string::npos) + { + qDebug() << "Err:FS serial number not match.Exit Code:3"; + return 3; + } + else + { + return 0; + } + return 0; +} + +void ZZ_ATPControl_Serial_Qt::Close() +{ + m_pSerialPort->close(); +} +int ZZ_ATPControl_Serial_Qt::GetDeviceInfo(DeviceInfo& Info) +{ + QByteArray qbSend, qbRecv; + + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_PN_NUMBER); + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + m_diDeviceInfo.strPN = qbRecv.data(); + + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_SN_NUMBER); + iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceInfo Failed,Communication error.Exit Code:1"; + return 1; + } + m_diDeviceInfo.strSN = qbRecv.data(); + + + Info = m_diDeviceInfo; + return 0; +} + +int ZZ_ATPControl_Serial_Qt::GetDeviceAttribute(DeviceAttribute& Attr) +{ + QByteArray qbSend, qbRecv; + + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_MIN_INTEGRATION_TIME); + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + m_daDeviceAttr.iMinIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_MAX_INTEGRATION_TIME); + iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + m_daDeviceAttr.iMaxIntegrationTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + + /// + int iTempExpTime = 0; + GetExposureTime(iTempExpTime); + + iRes = SetExposureTime(m_daDeviceAttr.iMinIntegrationTimeInMS); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Call SetExposureTime error.Exit Code:2"; + //return 2; + } + iRes = SingleShot(m_daDeviceAttr.iPixels); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Call SingleShot error.Exit Code:3"; + return 3; + } + + SetExposureTime(iTempExpTime); + /// + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_WAVELENGTH_CALIBRATION_COEF); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceAttribute Failed,Communication error.Exit Code:1"; + return 1; + } + float fWaveLengthCoef[4]; + memcpy(fWaveLengthCoef, qbRecv.data() + 16, 4 * sizeof(float)); + for (int i = 0; i < m_daDeviceAttr.iPixels; i++) + { + m_daDeviceAttr.fWaveLengthInNM[i] = fWaveLengthCoef[0] * i * i * i + fWaveLengthCoef[1] * i * i + fWaveLengthCoef[2] * i + fWaveLengthCoef[3]; + } + + Attr = m_daDeviceAttr; + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SetDeviceTemperature(float fTemperature) +{ + return 0; +} + +int ZZ_ATPControl_Serial_Qt::GetExposureTime_Init() +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_INTEGRATION_TIME); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetExposureTime Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetExposureTime Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetExposureTime Failed.Exit Code:3"; + return 3; + } + + m_iExposureTime = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SendCommand(QByteArray qbCommand) +{ + int iSize = qbCommand.size() + 3; + QByteArray qbSend; + qbSend.resize(4); + qbSend[0] = (ZZ_U8)0xAA; + qbSend[1] = 0x55; + qbSend[2] = iSize / 256; + qbSend[3] = iSize % 256; + qbSend.append(qbCommand); + + int iSum = 0; + for (int i = 0; i < iSize - 1; i++) + { + iSum = iSum + qbSend[i + 2]; + } + + qbSend.append(iSum % 256); + + qint64 qi64Write = m_pSerialPort->write(qbSend); + if (qi64Write != qbSend.size()) + { + qDebug() << "Err:write Failed.Exit Code:1" << qi64Write; + return 1; + } + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::RecvData(QByteArray& qbData) +{ + qbData.clear(); + qbData = m_pSerialPort->readAll(); + + int iCounter = 0; + while (qbData.size() < 4) + { + m_pSerialPort->waitForReadyRead(1000); + QByteArray qbTemp = m_pSerialPort->readAll(); + qbData.append(qbTemp); + + if (iCounter > 150) + { + qDebug() << "Err:RecvData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + return 1; + } + iCounter++; + } + + if ((ZZ_U8)qbData[0] != (ZZ_U8)0xaa || (ZZ_U8)qbData[1] != (ZZ_U8)0x55) + { + qDebug() << "Err:RecvData Failed,Wrong Header.Exit Code:2" << qbData.size(); + return 2; + } + + iCounter = 0; + int iLength = qbData[2] * 256 + qbData[3] + 2; + while (qbData.size() < iLength) + { + m_pSerialPort->waitForReadyRead(5000); + qbData.append(m_pSerialPort->readAll()); + + if (iCounter > 200) + { + qDebug() << "Err:RecvData Failed,Incomplete Data.Exit Code:3" << qbData.size(); + return 3; + } + iCounter++; + } + + if (qbData.size() > iLength) + { + qbData.remove(iLength - 1, qbData.size() - iLength); + } + int iCheckSumLength = iLength - 3; + ZZ_U16 usCheckSum = 0; + for (int i = 0; i < iCheckSumLength; i++) + { + usCheckSum += qbData[i + 2]; + } + usCheckSum = usCheckSum % 256; + ZZ_U8 ucTemp = qbData[qbData.size() - 1]; + if ((ZZ_U8)usCheckSum != ucTemp) + { + /*char cTemp[5]; + cTemp[0] = qbData[1026]; + qDebug()<< cTemp[0]; + cTemp[1] = qbData[1027]; + qDebug()<< cTemp[1]; + cTemp[2] = qbData[1028]; + qDebug()<< cTemp[2]; + cTemp[3] = qbData[1029]; + qDebug()<< cTemp[3]; + cTemp[4] = qbData[1030]; + qDebug()<< cTemp[4];*/ + + qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << "Total Recv:" << qbData.size() << "Check Sum:" << usCheckSum << "Not Equal To" << ucTemp; + //qbData.clear(); + //return 4; + return 0; + } + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::ParseData(QByteArray& qbData) +{ + if (qbData.size() < 6) + { + qDebug() << "Err:ParseData Failed,Not Enough Data.Exit Code:1" << qbData.size(); + return 1; + } + qbData.remove(0, 5); + qbData.remove(qbData.size() - 1, 1); + return 0; +} + +int ZZ_ATPControl_Serial_Qt::Init_Self() +{ + m_pSerialPort = new QSerialPort; + return 0; +} + +int ZZ_ATPControl_Serial_Qt::PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float& fPredictedExposureTime) +{ + using namespace ZZ_MATH; + int iDeviceDepth = 65535; + + bool bFlagIsOverTrying = false; + bool bFlagIsLowerMinExposureTime = false; + bool bFlagIsOverMaxExposureTime = false; + bool bFlagIsAutoExposureOK = false; + bool bFlagIsAutoExposureFailed = false; + + bool bIsValueOverflow = false; + bool bIsLastValueOverflow = false; + + float fExposureTime = 0; + float fTempExposureTime = 0; + double fLastExposureTime = 0.1; + int iRepeatCount = 0; + + int iRes = SetExposureTime(2000);//need change to load from files + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:1"; + return 1; + } + + while (!bFlagIsAutoExposureOK && !bFlagIsAutoExposureFailed) + { + DataFrame dfTemp; + + if (iRepeatCount++ > 30) + { + bFlagIsAutoExposureFailed = true; + bFlagIsOverTrying = true; + break; + } + + fExposureTime = (float)m_daDeviceAttr.iMinIntegrationTimeInMS; + fTempExposureTime = fExposureTime; + + iRes = SingleShot(dfTemp); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:2"; + return 2; + } + + HeapSort(dfTemp.lData, m_daDeviceAttr.iPixels); + + double dSum = 0; + int iCount = m_daDeviceAttr.iPixels / 100; + for (int i = 0; i < iCount; i++) + { + dSum += dfTemp.lData[i]; + } + double dTemp = dSum / iCount; + + if (dTemp >= iDeviceDepth * 0.99) + { + bIsValueOverflow = true; + if (!bIsLastValueOverflow) + { + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; + } + else + { + fExposureTime = fExposureTime / 2; + } + } + + else if (iDeviceDepth * fMaxScaleFactor >= dTemp && dTemp >= iDeviceDepth * fMinScaleFactor) + { + bFlagIsAutoExposureOK = 1; + } + else if (dTemp > iDeviceDepth * fMaxScaleFactor) + { + bIsValueOverflow = true; + if (!bIsLastValueOverflow) + { + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; + } + else + { + fExposureTime = fExposureTime * 3 / 4; + } + } + else if (dTemp < iDeviceDepth * fMinScaleFactor) + { + bIsValueOverflow = false; + if (bIsLastValueOverflow) + { + fExposureTime = (float)(fLastExposureTime + fExposureTime) / 2; + } + else + { + double dFactor; + dFactor = dTemp / (iDeviceDepth * fMaxScaleFactor); + fExposureTime = (float)(fExposureTime / dFactor); + } + if (/*fExposureTime > 100 || */fExposureTime < 10) + { + bFlagIsAutoExposureOK = false; + bFlagIsAutoExposureFailed = true; + bFlagIsLowerMinExposureTime = true; + } + } + bIsLastValueOverflow = bIsValueOverflow; + fLastExposureTime = fTempExposureTime; + + if (fExposureTime > 13000) + { + bFlagIsAutoExposureOK = false; + bFlagIsAutoExposureFailed = true; + fPredictedExposureTime = 13000; + iRes = SetExposureTime(13000); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:3"; + return 3; + } + bFlagIsOverMaxExposureTime = true; + break; + } + + iRes = SetExposureTime((int)fExposureTime); + if (iRes != 0) + { + qDebug() << "Err:PerformAutoExposure Failed.Exit Code:4"; + return 3; + } + } + fPredictedExposureTime = fExposureTime; + return 0; +} + + + +// int ZZ_ATPControl_Serial_Qt::SetExtShutter(int iShutterUP0, int iShutterDOWN1, int iShutterDOWN2, int iShutterDOWN3) +// { +// qDebug() << "stub code not implemented"; +// return -1; +// } + +int ZZ_ATPControl_Serial_Qt::SetExposureTime(int iExposureTimeInMS) +{ + m_iExposureTime = iExposureTimeInMS; + + QByteArray qbExposureTime, qbRecv; + //qbExposureTime.append(SET_INTEGRATION_TIME); + qbExposureTime.resize(3); + qbExposureTime[0] = SET_INTEGRATION_TIME; + qbExposureTime[1] = iExposureTimeInMS >> 8; + qbExposureTime[2] = iExposureTimeInMS & 0xFF; + + int iRes = SendCommand(qbExposureTime); + if (iRes != 0) + { + qDebug() << "Err:SetExposureTime Failed.Exit Code:2"; + return 2; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetExposureTime Failed.Exit Code:3"; + return 3; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SetExposureTime Failed.Exit Code:4"; + return 4; + } + + if ((ZZ_U8)qbRecv[0] != 0) + { + qDebug() << "Err:SetExposureTime Failed.Exit Code:1"; + return 1; + } + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::GetExposureTime(int& iExposureTimeInMS) +{ + // QByteArray qbSend, qbRecv; + // qbSend.clear(); + // qbRecv.clear(); + // qbSend.append(GET_INTEGRATION_TIME); + // qbSend.resize(3); + // qbSend[1] = 0x00; + // qbSend[2] = 0x01; + // int iRes = SendCommand(qbSend); + // if (iRes != 0) + // { + // qDebug() << "Err:GetExposureTime Failed.Exit Code:1"; + // return 1; + // } + // iRes = RecvData(qbRecv); + // if (iRes != 0) + // { + // qDebug() << "Err:GetExposureTime Failed.Exit Code:2"; + // return 2; + // } + // iRes = ParseData(qbRecv); + // if (iRes != 0) + // { + // qDebug() << "Err:GetExposureTime Failed.Exit Code:3"; + // return 3; + // } + // + // iExposureTimeInMS = (ZZ_U8)qbRecv[1] + (ZZ_U8)qbRecv[0] * 256; + iExposureTimeInMS = m_iExposureTime; + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SingleShot(DataFrame& dfData) +{ + + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(SYNC_GET_DATA); + qbSend.resize(3); + // qbSend[1] = 0x00; + // qbSend[2] = 0x01; + qbSend[1] = m_iExposureTime >> 8;; + qbSend[2] = m_iExposureTime & 0xFF; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:3"; + return 3; + } + + ZZ_U16 usData[4096] = { 0 }; + + if ((ZZ_U8)qbRecv[0] != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:1"; + return 1; + } + else + { + //int aaa = qbRecv.size(); + int iDataSizeInPixel = (qbRecv.size() - 1) / 2; + memcpy(usData, qbRecv.data() + 1, iDataSizeInPixel * 2); + for (size_t i = 0; i < iDataSizeInPixel; i++) + { + dfData.lData[i] = qToBigEndian(usData[i]); + + + } + // for (int i = 0; i < iDataSizeInPixel; i++) + // { + // dfData.lData[i] = usData[i]; + // } + } + + return 0; +} + +int ZZ_ATPControl_Serial_Qt::SingleShot(int& iPixels) +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(SYNC_GET_DATA); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:SingleShotP Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SingleShotP Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:3"; + return 3; + } + + if ((ZZ_U8)qbRecv[0] != 0) + { + qDebug() << "Err:SingleShotP Failed.Exit Code:4"; + return 4; + } + else + { + iPixels = (qbRecv.size() - 1) / 2; + + } + return 0; +} + +// int ZZ_ATPControl_Serial_Qt::SingleShotDark(ATPDataFrame &dfData) +// { +// SetExtShutter(0,0,0,0); +// SingleShot(dfData); +// return 0; +// } + +int ZZ_ATPControl_Serial_Qt::GetDeviceTemperature(float& fTemperature) +{ + fTemperature = 0; + + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_TEC_TEMP); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + int iRes = SendCommand(qbSend); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:1"; + return 1; + } + iRes = RecvData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:2"; + return 2; + } + iRes = ParseData(qbRecv); + if (iRes != 0) + { + qDebug() << "Err:GetDeviceTemperature Failed.Exit Code:3"; + return 3; + } + + QString qstrTemp = qbRecv.data(); + fTemperature = qstrTemp.toFloat(); + + return 0; +} + +//void ZZ_ATPControl_Serial_Qt::ReadMessage() +//{ +// QByteArray qbTemp, qbTemp1; +// qbTemp = m_pSerialPort->readAll(); +// while (qbTemp.size()<2) +// { +// m_pSerialPort->waitForReadyRead(50); +// qbTemp1 = m_pSerialPort->readAll(); +// qbTemp.append(qbTemp1); +// } + + + + //return; + // } diff --git a/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.h b/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.h new file mode 100644 index 0000000..063bdb7 --- /dev/null +++ b/IRIS_FODIS/Source/FS/ATPControl_Serial_QT.h @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////////////////// +//ATP豸ͨ +////////////////////////////////////////////////////////////////////////// +#pragma once +#include "pch.h" +#include "ZZ_Types.h" +#include "IrisFiberSpectrometerBase.h" + +using namespace ZZ_MISCDEF; +using namespace ZZ_MISCDEF::ATP; +using namespace ZZ_MISCDEF::IRIS::FS; + +class ZZ_ATPControl_Serial_Qt :public CIrisFSBase +{ + Q_OBJECT +public: + ZZ_ATPControl_Serial_Qt(QObject* parent = nullptr); + virtual ~ZZ_ATPControl_Serial_Qt(); + +public: + //do not call + //int ReInit(); + //ò + //int SetBaudRate(int iBaud); + //ʼ豸 + int Initialize(bool bIsUSBMode, std::string ucPortNumber, std::string strDeviceName); + + //ر豸 + void Close(); + + //βԲɼ ȷ豸 + int SingleShot(int& iPixels); + + //ݲɼ + int SingleShot(DataFrame& dfData); + + //ΰɼ + //int SingleShotDark(ATPDataFrame &dfData); + + //int SingleShotDeducted(ATPDataFrame &dfData); + //عʱ + int SetExposureTime(int iExposureTimeInMS); + + //ȡعʱ + int GetExposureTime(int& iExposureTimeInMS); + + //int GetWaveLength(float *pfWaveLength); + + //ȡ豸Ϣ + int GetDeviceInfo(DeviceInfo& Info); + + //ȡ豸 + int GetDeviceAttribute(DeviceAttribute& Attr); + + //int GetDeviceListInfo(); //use type name to enum + + //¶ + int SetDeviceTemperature(float fTemperature); + + //ȡ¶ + int GetDeviceTemperature(float& fTemperature); + + //Զع + int PerformAutoExposure(float fMinScaleFactor, float fMaxScaleFactor, float& fPredictedExposureTime); + +#ifdef _DEBUG +public: +#else // +private: +#endif + //port + int m_iBaudRate; + QSerialPort* m_pSerialPort; + + //ATP + DeviceInfo m_diDeviceInfo; + DeviceAttribute m_daDeviceAttr; + + //Attr + int m_iExposureTime; + //////////////////////////////////////////////////////////////////////////shutter control stub code s + //int SetExtShutter(int iShutterUP0, int iShutterDOWN1,int iShutterDOWN2,int iShutterDOWN3); //0:close 1:open + //////////////////////////////////////////////////////////////////////////shutter control stub code e + int GetExposureTime_Init(); + int SendCommand(QByteArray qbCommand); + int RecvData(QByteArray& qbData); + int ParseData(QByteArray& qbData); +public slots: + int Init_Self(); +signals: + void SignalInit_Self(); + //private slots : + //void ReadMessage(); +}; \ No newline at end of file diff --git a/IRIS_FODIS/Source/FS/DataFileProcessor.cpp b/IRIS_FODIS/Source/FS/DataFileProcessor.cpp new file mode 100644 index 0000000..d4f92bb --- /dev/null +++ b/IRIS_FODIS/Source/FS/DataFileProcessor.cpp @@ -0,0 +1,260 @@ +#include "DataFileProcessor.h" + +DataFileProcessor::DataFileProcessor(QObject* parent /*= nullptr*/) +{ +#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; +} + +void DataFileProcessor::SetDeviceInfo(FSContext struDeviceContext) +{ + m_struDeviceContext = struDeviceContext; +} + +void DataFileProcessor::SetData(std::vector> vecData) +{ + m_vecData.clear(); + m_vecData = vecData; +} + +bool DataFileProcessor::WriteDataFile() +{ + GenerateFilePath(); + WriteEnvironmentInfo(); + WriteDeviceInfo(); + WriteData(); + return 1; +} + +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; + QString qstrTemp= m_qstrFullFileName; + if (m_struEC.qstrLocation=="") + { + m_struEC.qstrLocation = "Unknown"; + } + m_qstrFullFileName= m_qstrFullFileName+"/"+m_struEC.qstrLocation + qstrAddHMS+".csv"; + + QDir qdirPath(qstrTemp); + if (!qdirPath.exists()) + { + bool bRes = qdirPath.mkdir(qstrTemp); + if (!bRes) + { + qDebug() << "DataFileProcessor mkdir Failed."; + } + } +} + +bool DataFileProcessor::WriteEnvironmentInfo() +{ + bool bRes = true; + QFile qfData(m_qstrFullFileName); + bRes = qfData.open(QFile::WriteOnly|QFile::Text|QFile::Truncate); + if (!bRes) + { + qDebug() << "WriteEnvironmentInfo open Failed."; + return bRes; + } + qDebug() << m_qstrFullFileName; + //EC + qfData.write("EnvironmentalContext,"); + qfData.write("DEV_SN,"); + qfData.write(m_struEC.qstrDEV_SN.toLatin1()); + qfData.write(","); + 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; +} + +void DataFileProcessor::WriteDeviceInfo() +{ + QFile qfData(m_qstrFullFileName); + bool bRes = qfData.open(QFile::WriteOnly | QFile::Text | QIODevice::Append); + if (!bRes) + { + qDebug() << "WriteDeviceInfo open Failed."; + return; + } + QString qstrTemp; + + qfData.write("\n"); + qfData.write("TotalSpectrometer,"); + qstrTemp = QString::number(m_struDeviceContext.ucDeviceNumber); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + qfData.write("TotalScanPoints,"); + qstrTemp = QString::number(m_vecData[0].size()); + qfData.write(qstrTemp.toLatin1()); + qfData.write("\n"); + + for (int i=0;i< m_struDeviceContext.ucDeviceNumber;i++) + { + qstrTemp = QString("FS%1_Info").arg(i + 1); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + + qfData.write("Model,"); + using namespace ZZ_MISCDEF::IRIS; + qstrTemp = QString::fromStdString(GetDeviceModelName(m_struDeviceContext.ucDeviceModel[i])); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + + qfData.write("SN,"); + qstrTemp = QString::fromStdString(m_struDeviceContext.strSN[i]); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + + qfData.write("Pixels,"); + qstrTemp = QString::number(m_struDeviceContext.usPixels[i]); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + + qfData.write("Depth,"); + qstrTemp = QString::number(m_struDeviceContext.lDepth[i]); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + + qfData.write("TEC Temperature,"); + qstrTemp = QString::number(m_vecData[i][0].fTemperature); + qfData.write(qstrTemp.toLatin1()); + + qfData.write("\n"); + + qfData.write("Wavelength,"); + for (unsigned short j = 0; j < m_struDeviceContext.usPixels[i]-1; j++) + { + qstrTemp = QString::number(m_struDeviceContext.fWavelength[i][j]); + qfData.write(qstrTemp.toLatin1()); + qfData.write(","); + } + + qstrTemp = QString::number(m_struDeviceContext.fWavelength[i][m_struDeviceContext.usPixels[i] - 1]); + qfData.write(qstrTemp.toLatin1()); + + qfData.write("\n"); + } + qfData.close(); +} + +bool DataFileProcessor::WriteData() +{ + QFile qfData(m_qstrFullFileName); + bool bRes = qfData.open(QFile::WriteOnly | QFile::Text | QIODevice::Append); + if (!bRes) + { + qDebug() << "WriteData open Failed."; + return 0; + } + QString qstrTemp; + qfData.write("Data Section"); + qfData.write("\n"); + + using namespace ZZ_MISCDEF::IRIS; + for (int i=0;i -5)*/) + { + qfData.write("valid"); + } + else + { + qfData.write("invalid"); + } + + qfData.write(","); + qstrTemp = QString::number(m_vecData[i][j].usExposureTimeInMS); + qfData.write(qstrTemp.toLatin1()); + for (int k=0;k< m_struDeviceContext.usPixels[i];k++) + { + qfData.write(","); + qstrTemp = QString::number(m_vecData[i][j].lData[k]); + qfData.write(qstrTemp.toLatin1()); + } + qfData.write("\n"); + } + + } + bool res = true; + return res; +} + + diff --git a/IRIS_FODIS/Source/FS/DataFileProcessor.h b/IRIS_FODIS/Source/FS/DataFileProcessor.h new file mode 100644 index 0000000..c4cf510 --- /dev/null +++ b/IRIS_FODIS/Source/FS/DataFileProcessor.h @@ -0,0 +1,39 @@ +#pragma once +#include "pch.h" +#include "ZZ_Types.h" +using namespace ZZ_MISCDEF::ZZ_DATAFILE; +using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; +using namespace ZZ_MISCDEF::IRIS::FS; +class DataFileProcessor :public QObject +{ + Q_OBJECT +public: + DataFileProcessor(QObject* parent = nullptr); + virtual ~DataFileProcessor(); +public: +public: + void SetEnvironmentContex(EContext struEC); + void SetManmadeEnviromentalContext(MEContext struMEC); + void SetDeviceInfo(FSContext struDeviceContext); + void SetData(std::vector> vecData); + bool WriteDataFile(); +private: + void GenerateFilePath(); + bool WriteEnvironmentInfo(); + void WriteDeviceInfo(); + bool WriteData(); + + +public: +private: + QString m_qstrFullFileName; + QString m_qstrFileName; + QString m_qstrFilePath; + + QDateTime m_qdtTime; + + EContext m_struEC; + MEContext m_struMEC; + FSContext m_struDeviceContext; + std::vector> m_vecData; +}; \ No newline at end of file diff --git a/IRIS_FODIS/Source/FS/IrisFiberSpectrometerBase.h b/IRIS_FODIS/Source/FS/IrisFiberSpectrometerBase.h new file mode 100644 index 0000000..720262f --- /dev/null +++ b/IRIS_FODIS/Source/FS/IrisFiberSpectrometerBase.h @@ -0,0 +1,45 @@ +#include +#include "ZZ_Types.h" +#include "pch.h" +#pragma once +using namespace ZZ_MISCDEF; +using namespace ZZ_MISCDEF::IRIS::FS; + +class CIrisFSBase:public QObject +{ +public: + //CIrisFSBase(); + //virtual ~CIrisFSBase()= 0; +private: + //int m_iMaxDepth = 65535; +public: + //ʼ豸 + //˴stringΪָĸoceanǵIJиΪc/c++׼ + //0Ϊ޴󣬲ͬ뷵زֵͬ + virtual int Initialize(bool bIsUSBMode, std::string ucPortNumber,std::string strDeviceName) = 0; + + //ر豸 + virtual void Close() = 0; + + //ݲɼ + virtual int SingleShot(DataFrame &dfData) = 0; + + //عʱ + virtual int SetExposureTime(int iExposureTimeInMS) = 0; + + //ȡعʱ + virtual int GetExposureTime(int &iExposureTimeInMS) = 0; + + //Ŀ¶ + virtual int SetDeviceTemperature(float fTemperature) = 0; + + //ȡ¶ + virtual int GetDeviceTemperature(float &fTemperature) = 0; + + //ȡ豸Ϣ + virtual int GetDeviceInfo(DeviceInfo &Info) = 0; + + //ȡ豸 + virtual int GetDeviceAttribute(DeviceAttribute &Attr) = 0; + +}; diff --git a/IRIS_FODIS/Source/FS/OControl_USB.cpp b/IRIS_FODIS/Source/FS/OControl_USB.cpp new file mode 100644 index 0000000..517cc20 --- /dev/null +++ b/IRIS_FODIS/Source/FS/OControl_USB.cpp @@ -0,0 +1,559 @@ +#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, std::string 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++; + } + else + { + continue; + } + 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; + } + + seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + + + long test = seabreeze_get_buffer_capacity_minimum(m_iSpectralmeterHandle, &error); + seabreeze_set_buffer_capacity(m_iSpectralmeterHandle, &error, test); + //seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + //seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + // printf("seabreeze_set_trigger_mode: Result is [%s]\n", get_error_string(error)); + + + + //óʼʱ + 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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + // printf("\n-------------------ûɹ\n"); + return 1; + } + + 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 / 1000); + + 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; + } + else + { + continue; + } + } + + if (m_iSpectralmeterHandle == -100) + { + printf("\nNo!!!!!!!!!!!!\n"); + return 1; + } + + seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + seabreeze_set_trigger_mode(m_iSpectralmeterHandle, &error, 0); + // printf("seabreeze_set_trigger_mode: Result is [%s]\n", get_error_string(error)); + + //óʼʱ + 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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + // printf("\n-------------------ûɹ\n"); + return 1; + } + + 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 / 1000); + + 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; + bool ret; + + // 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)); + ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + if (spec_length > 0) + { + spectrum = (double *)calloc((size_t)spec_length, sizeof(double)); + + + + seabreeze_clear_buffer(m_iSpectralmeterHandle, &error); + + + + + printf("\nGetting a formatted spectrum.\n"); + flag = seabreeze_get_formatted_spectrum(m_iSpectralmeterHandle, &error, spectrum, spec_length); + printf("\nGetting a formatted spectrum------------------------------.\n"); + // printf("Get formatted spectrum result is (%d) [%s]\n", flag, get_error_string(error)); + // printf("\tPixel value 20 is %1.2f\n", spectrum[20]); + ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + for (int tmp = 0; tmp < spec_length; tmp++) + { + dfData.lData[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) +{ + if (m_iSpectralmeterHandle == -100) + { + printf("\nNo!!!!!!!!!!!!\n"); + return 1; + } + + int error; + + seabreeze_set_integration_time_microsec(m_iSpectralmeterHandle, &error, iExposureTimeInMS * 1000); + printf("Set integration time result is [%s]\n", get_error_string(error)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + m_iExposureTime = iExposureTimeInMS; + + + + // //---------------------------------------------------------------------------------------------------------------- + // int error; + // long *spectrometer_ids; + // int number_of_spectrometers; + // + // number_of_spectrometers = sbapi_get_number_of_spectrometer_features(m_iSpectralmeterHandle, &error); + // printf("\t\t\tResult is %d [%s]\n", number_of_spectrometers, sbapi_get_error_string(error)); + // spectrometer_ids = (long *)calloc(number_of_spectrometers, sizeof(long)); + // number_of_spectrometers = sbapi_get_spectrometer_features(m_iSpectralmeterHandle, &error, spectrometer_ids, number_of_spectrometers); + // printf("\t\t\tResult is %d [%s]\n", number_of_spectrometers, sbapi_get_error_string(error)); + // + // sbapi_spectrometer_set_integration_time_micros(m_iSpectralmeterHandle, spectrometer_ids[0], &error, iExposureTimeInMS*1000); + // printf("\t\t\t\tResult is [%s]\n", sbapi_get_error_string(error)); + + 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) +{ + bool ret; + + 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)); + ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + + // 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)); + ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + return 0; +} + +//ȡ¶ +int OceanOptics_lib::GetDeviceTemperature(float &fTemperature) +{ + fTemperature = 0; + + 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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + 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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + Attr.iPixels = spec_length; + + long minimum_time; + minimum_time = seabreeze_get_min_integration_time_microsec(m_iSpectralmeterHandle, &error); + Attr.iMinIntegrationTimeInMS = (int)((double)minimum_time / (double)1000); + 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]); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return 1; + } + + 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 false; + } + else//ڡ + { + //cout <<"found\n"; // + return true; + } +} + +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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return ""; + } + + 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)); + bool ret = isSuccess((char*)get_error_string(error)); + if (!ret) + { + return ""; + } + + serial_number[31] = '\0'; + if (flag > 0) { + printf("\tSerial number: [%s]\n", serial_number); + } + + string sn = serial_number; + + return sn; +} diff --git a/IRIS_FODIS/Source/FS/OControl_USB.h b/IRIS_FODIS/Source/FS/OControl_USB.h new file mode 100644 index 0000000..4815cef --- /dev/null +++ b/IRIS_FODIS/Source/FS/OControl_USB.h @@ -0,0 +1,57 @@ +#pragma once +#include +#include +#include +#include "api/SeaBreezeWrapper.h" +#include "IrisFiberSpectrometerBase.h" + +using namespace std; + +class OceanOptics_lib :public CIrisFSBase +{ +public: + OceanOptics_lib(); + virtual ~OceanOptics_lib(); +public: + //初始化设备 + //此处string为指明连接哪个ocean光谱仪的参数,可自行更换为其他c/c++标准类型 + //0为无错误,不同错误请返回不同值(不能确定:当不成功时SeaBreeze返回的错误代码error不为0 → 不敢将error直接返回) + int Initialize(bool bIsUSBMode, std::string ucPortNumber, std::string strDeviceName);//ok + int Initialize();//ok + + //关闭设备 + void Close();//ok + + //单次数据采集 + int SingleShot(DataFrame &dfData); + + //设置曝光时间 + int SetExposureTime(int iExposureTimeInMS);//ok + + //获取曝光时间设置 + int GetExposureTime(int &iExposureTimeInMS);//ok + + //设置目标温度 + int SetDeviceTemperature(float fTemperature);//ok + + //获取温度设置 + int GetDeviceTemperature(float &fTemperature);//ok + + //获取设备信息 + int GetDeviceInfo(DeviceInfo &Info);//ok + + //获取设备特征数据 + int GetDeviceAttribute(DeviceAttribute &Attr);//ok + + //tc + static const char* get_error_string(int error); +private: + int m_iSpectralmeterHandle; + DeviceInfo m_deviceInfo; + int m_iExposureTime; + + bool isSuccess(char* resultStr); + + string GetDeviceType(int index); + string GetSerialNumber(int index); +}; diff --git a/IRIS_FODIS/Source/FS/ZZ_Types.h b/IRIS_FODIS/Source/FS/ZZ_Types.h new file mode 100644 index 0000000..6a940da --- /dev/null +++ b/IRIS_FODIS/Source/FS/ZZ_Types.h @@ -0,0 +1,349 @@ + ////////////////////////////////////////////////////////////////////////// +//˵ļ +////////////////////////////////////////////////////////////////////////// +#pragma once +#include "pch.h" +#include +#define MAX_DEVICENUMBER_FS 2 +#define MAX_LINEARSHUTTER_POSITION 12 +#define ZZ_Enum2String(x) #x + +namespace ZZ_MISCDEF +{ + typedef unsigned char ZZ_U8; + typedef unsigned short int ZZ_U16; + typedef unsigned int ZZ_U32; + typedef int ZZ_S32; + + + namespace IRIS + { + //Fiber Spectrometer + namespace FS + { + typedef struct tagDataFrame + { + ZZ_U32 usExposureTimeInMS; + ZZ_S32 lData[4096]; + float fTemperature = 0; + double dTimes = 0; + }DataFrame; + + + + typedef struct tagDeviceInfo + { + std::string strPN; + std::string strSN; + }DeviceInfo; + + typedef struct tagDeviceAttribute + { + int iPixels; + int iMaxIntegrationTimeInMS; + int iMinIntegrationTimeInMS; + float fWaveLengthInNM[4096]; + + }DeviceAttribute; + +// inline DataFrame GetIndex(DataFrame dfDark, DataFrame dfSignal) +// { +// +// } + } + + enum DeviceModel + { + OSIFAlpha=0, + OSIFBeta, + ISIF, + IS1, + IS2 + }; + + + + inline std::string GetDeviceModelName(int iModel) + { + switch (iModel) + { + case DeviceModel::OSIFAlpha: return "OSIFAlpha"; break; + case DeviceModel::OSIFBeta: return "OSIFBeta"; break; + case DeviceModel::ISIF: return "ISIF"; break; + case DeviceModel::IS1: return "IS1"; break; + case DeviceModel::IS2: return "IS2"; break; + default: return "error"; break; + } + } + + inline int GetIndex(std::string strDeviceModelName) + { + if (strDeviceModelName == "OSIFAlpha") + { + return DeviceModel::OSIFAlpha; + } + else if (strDeviceModelName == "OSIFBeta") + { + return DeviceModel::OSIFBeta; + } + else if (strDeviceModelName == "ISIF") + { + return DeviceModel::ISIF; + } + else if (strDeviceModelName == "IS1") + { + return DeviceModel::IS1; + } + else if (strDeviceModelName == "IS2") + { + return DeviceModel::IS2; + } + else + { + return -1; + } + } + + }; + + //ATPָת + namespace ATP + { + const int MAX_SPECTRUM_SIZE = 4096; + + const int GET_MODULECIRCUIT_TEMP = 0x01; + const int GET_PN_NUMBER = 0x03; + const int GET_SN_NUMBER = 0x04; + const int GET_MANUFACTURE_DATA = 0x06; + const int GET_MANUFACTURE_INFO = 0x09; + const int GET_PIXEL_LENGTH = 0x0a; + const int GET_TEC_TEMP = 0x13; + const int SET_TEC_TEMP = 0x12; + const int GET_OPTICS_TEMP = 0x35; + const int GET_CIRCUITBOARD_TEMP = 0x36; + const int SET_INTEGRATION_TIME = 0x14; + const int GET_INTEGRATION_TIME = 0x41; + const int GET_MAX_INTEGRATION_TIME = 0x42; + const int GET_MIN_INTEGRATION_TIME = 0x43; + const int ASYNC_COLLECT_DARK = 0x23; + const int ASYNC_START_COLLECTION = 0x16; + const int ASYNC_READ_DATA = 0x17; + const int SET_AVERAGE_NUMBER = 0x28; + const int SYNC_GET_DATA = 0x1e; + const int SYNC_GET_DARK = 0x2f; + const int EXTERNAL_TRIGGER_ENABLE = 0x1f; + const int SET_XENON_LAMP_DELAY_TIME = 0x24; + const int GET_WAVELENGTH_CALIBRATION_COEF = 0x55; + const int GET_STAT_LAMPOUT = 0x60; + const int SET_GPIO = 0x61; + //const int SYNCHRONIZATION_GET_DARK = 0x23 + + //////////////////////////////////////////////////////////////////////////device + enum Model + { + ATP1010 = 0, + ATP6500 + }; + + //֡ + typedef struct tagATPDataFrame + { + unsigned short usExposureTime; + ZZ_U16 usData[4096]; + float fTemperature; + double dTimes = 0; + }ATPDataFrame; + + //豸Ϣ + typedef struct tagATPDeviceInfo + { + std::string strPN; + std::string strSN; + }ATPDeviceInfo; + + //豸 + typedef struct tagATPDeviceAttribute + { + int iPixels; + int iMaxIntegrationTime; + int iMinIntegrationTime; + float fWaveLength[4096]; + + }ATPDeviceAttribute; + //////////////////////////////////////////////////////////////////////////config file + + + + } + + //в + namespace ZZ_RUNPARAMS + { + typedef struct tagErrorInfo + { + int iDataTransferErr = -1000; + float fTecTempErr = -1000; + int iShutterErr = -1000; + float fChassisTempErr = -1000; + }ErrInfo; + + typedef struct tagFiberSpecContext + { + ZZ_U8 ucDeviceNumber; + ZZ_U8 ucDeviceModel[MAX_DEVICENUMBER_FS]; + std::string strInterface[MAX_DEVICENUMBER_FS]; + std::string strSN[MAX_DEVICENUMBER_FS]; + long lDepth[MAX_DEVICENUMBER_FS]; + float fMinFactor[MAX_DEVICENUMBER_FS]; + float fMaxFactor[MAX_DEVICENUMBER_FS]; + ZZ_U16 usPixels[MAX_DEVICENUMBER_FS]; + float fWavelength[MAX_DEVICENUMBER_FS][4096]; + }FSContext; + + typedef struct tagLinearShutterContext + { + std::string strInterface; + ZZ_U8 ucProtocolType; + ZZ_U8 ucCmdID; + }LSContext; + + typedef struct tagAcquisitionTimeSettings + { + QTime qtStartTime; + QTime qtStopTime; + QTime qtInterval; + }AcqTimeSettings; + + typedef struct tagAcquisitionPositionSettings + { + int iTotalPosition; + int iPosition[MAX_LINEARSHUTTER_POSITION]; + }AcqPosSettings; + + typedef struct tagRunTimeGrabberParams + { + LSContext lscParam; + FSContext fscParams; + AcqTimeSettings atsParams; + AcqPosSettings apsParams; + }RunTimeGrabberParams; + + typedef struct tagATPCalibrationSettings + { + //Up0 Down1,2,3 + QString qsISIF_CalibrationFilePath[4]; + QString qsIS1_CalibrationFilePath[4]; + }ATPCalibrationSettings; + } + + //ϵͳļṹ + namespace ZZ_DATAFILE + { + typedef struct tagEnvironmentalContext + { + QString qstrUTCDateTime; + QString qstrLocation; + QString qstrGPS_Longtitude; + QString qstrGPS_Latitude; + QString qstrGPS_Altitude; + QString qstrGPS_North; + QString qstrCaseTemperature; + QString qstrCaseHumidity; + QString qstrDEV_SN; + }EContext; + + typedef struct tagManmadeEnviromentalContext + { + QString qstrOriFileName; + QString qstrInstallationTime; + QString qstrISIFCalibrationTime; + QString qstrIS1CalibrationTime; + QString qstrNameOfMaintenanceStaff; + QString qstrPhoneNumberOfMaintenanceStaff; + QString qstrDownloadUserID; + QString qstrDownlaodAddress; + QString qstrHTTPServer; + }MEContext; + + + typedef struct tagIS1Information + { + QString qstrSN_ATP; + QString qstrSN_IRIS; + + QString qstrCalFile_U0; + QString qstrCalFile_D1; + QString qstrCalFile_D2; + QString qstrCalFile_D3; + + int iPixelCount; + + int iExposureTimeInMS_U0; + int iExposureTimeInMS_D1; + int iExposureTimeInMS_D2; + int iExposureTimeInMS_D3; + + float fTemperature_U0; + float fTemperature_D1; + float fTemperature_D2; + float fTemperature_D3; + }IS1Info; + + typedef struct tagISIFInformation + { + QString qstrSN_ATP; + QString qstrSN_IRIS; + + QString qstrCalFile_U0; + QString qstrCalFile_D1; + QString qstrCalFile_D2; + QString qstrCalFile_D3; + + int iPixelCount; + + int iExposureTimeInMS_U0; + int iExposureTimeInMS_D1; + int iExposureTimeInMS_D2; + int iExposureTimeInMS_D3; + + float fTemperature_U0; + float fTemperature_D1; + float fTemperature_D2; + float fTemperature_D3; + }ISIFInfo; + + typedef struct tagATPDataHeader + { + + + }ATPDataHeader; + + typedef struct tagCalibrationFrame + { + ZZ_U32 uiExposureTimeInMS; + float fTemperature; + int iPixels; + float fWaveLength[4096] = { 0 }; + double dCal_Gain[4096] = { 0 }; + double dCal_Offset[4096] = { 0 }; + }CalFrame; + + typedef struct tagCalDataFrame + { + ZZ_U32 usExposureTimeInMS; + float fTemperature = 0; + int iPixels; + float fData[4096]; + QString qstrGrabDate; + }CalDataFrame; + } + + //misc detector + namespace MISC_DETECTOR + { + typedef struct tagHumitureDeviceInfo + { + QString qstrInterfaceName; + }HumitureDeviceInfo; + } +}; diff --git a/IRIS_FODIS/Source/Logger/Logger.h b/IRIS_FODIS/Source/Logger/Logger.h new file mode 100644 index 0000000..cfbcf02 --- /dev/null +++ b/IRIS_FODIS/Source/Logger/Logger.h @@ -0,0 +1,90 @@ +// +// Created by xin on 2021/8/17. +//edit by zz. +//fixed code page problem;added a new initialize function; --20211101 +#pragma once + +#include +#include +#include +#include "qmutex.h" +#include "QtMsgHandler" + +namespace QT_LOG +{ + static int m_LogLevel = 1; + static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss")); + QMutex m_LogMutex; + + void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) + { + if (type < m_LogLevel) + { + return; + } + + QString log_info; + switch (type) + { + case QtDebugMsg: + log_info = QString("%1:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtWarningMsg: + log_info = QString("%1[Warning]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtCriticalMsg: + log_info = QString("%1[Critical]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + break; + + case QtFatalMsg: + log_info = QString("%1[Fatal]:%2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"),msg); + abort(); + } + + m_LogMutex.lock(); + + QFile outFile(m_LogFile); + outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text); + QTextStream ts(&outFile); + ts << log_info << endl; + outFile.close(); + + m_LogMutex.unlock(); + } + void logInit(QString logFile = "",int logLevel = 0) + { + +#ifndef DEBUG + if ((logLevel < 0) || (logLevel > 3)) + { + m_LogLevel = 1; + } + else + { + m_LogLevel = logLevel; + } + + if (!logFile.isEmpty()) + { + m_LogFile = logFile+"/"+m_LogFile; + } + + qInstallMessageHandler(customMessageHandler); + //qInstallMsgHandler(customMessageHandler); +#endif + } + + //added by IRIS_ZZ initialize from main + void ZZ_InitLogger(QString qstrDir) + { + QDir qdLogFolder; + qdLogFolder.mkdir(qstrDir); + qDebug() << QT_LOG::m_LogFile; + QT_LOG::logInit(qstrDir); + } +}; + + + diff --git a/IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.dll b/IRIS_FODIS/Source/OSIF/DLib/SeaBreeze.dll new file mode 100644 index 0000000000000000000000000000000000000000..66bc74c7275bdbbb154cba9fe216d8e8b13f5bd0 GIT binary patch literal 2670080 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
9qc1yVLHuZQ!5 z{V8q@wm%NO>5n7d*vA0-oG}pcIewcXjUK~lr;&N}aB!%?T#bd->rhvd>y%D#Rn?A4eL6b9lRa)v$5b#Szv05pp%so6dc$seDKIx!0h|cdH zHiP``&mo4DUhKTLL9Zm$_8D&Lv^ojIUq6ModpUpn$~O%}RY8fyKY;SGg{VwjK3aC} zH%K-1b^M&*6A!zGp{lVRkgtDL{A?KvQZxDh$&{xdWY_X2d$b04r1n5uco$H9mAiO5 z_JjNyo{sLrDZd6EpRCFU&TG@Aj+_KiWx1zb@)eM8(-(ZV2ZKtf1Y{oaC&~`sa}#^5 zs9^8O$a1X-64ua#8FB?wzS#?Of8eg*1nyAy4jEJZsgE#p=-%YWEYkh2?`(OV05n`DTw9Cs4QBKLgRe z2f(c;C!0=tkS}u>$QNVH*MA0a`|UvHxU~?n;Vjg*-c#UPo6k!IFN7>hXy$d3jL-@>b;7Yotu?uW`m4a8mJvJkTT8^|}C@7al?6YCKDge~ZPdXipU z%OKoUqbIQBi=a}3PlD{Hx4ZIa#BJo}#^@d>mbn$o&#nh9|Jj6}*=(cEy&>)cJTLIV z!zl3@-Qbb;LB6>!;HMc!q`{p*uSYs~T%3-(jr0W#*nqNr9{{VfKZ50s2k=vxTl<|k z{2$`FY$T1;1qsL(OP}gX+Yx-8j^tZE%Vul z2zKV90pFAdqZhbV3+xC|X%FD8B@Y~Ic>sWIV70DfK!VB@ApI+^gVAVy2X!wksAGZn zx&KAvEB!u5bsmSGhQB~*ioS=R^Gm=Zb`q-Ek%P=HJZxDr6{u~W3)GHtn`k5DI}nX( zEux>gVl2qt&l9V+a?KR75kJ#^g9K~2J+R6Kslx6?gLb4RYZwi*BTJBZKOHWmdZ1co zxEtAtCX+1~WouDI-{SCfnQoxs^^k8YHz?L}XXVKal#f36yke;N!!sf2U}Bm=BY)wG z2v#TsdZ}-L)GR;Xk~kK{dKN|MWv-O^Oh>SnflAk_jC`xAqS9HHkom{UNNqL@j5d4+ z@=I4CZfiSKu;@UrOsx-Y34FHsiBk~m8cn)>9G~Y8M3!FkebxIJ!FFvxCG8CICDUY| zSPc0#)C1Aa-bV1QA3^jLTHIgLGMdbN&fay9+Or5!yK&O|cqB+Y+8;v7`$5`qUa(Zf z&r3X2GLfIEeC%lu9rYkceewtxZ9EFVKHvb5Fdk*U;F~GRKMb(z-h;SZ{UOluS|~eb z1gNayD-A3>yIQRlc+}~Kgc)2i-ogpIFLxw1mH^SKT&Yif7ztl+TVg#O5L0;IC4?`u z7!=NS<0+}1O99Do9l+=%&H*K@$kONm6uUhYl1^F+fj*=g=x#pX5>*uB-`#_<>p5c1 zu8X)$b0Nmqi74A*2S_cTuPP%HS@JkvuD*Y!P_PKdT92XUL8z|ZIGN8R5=KYH?6{8$!)Wm$e^>jIBK{7xrP0~t^0 zOB=#nw@y5$6vNhU%nki9JY(IB-i1ngAnDt*MyB#rkrQY@T3-c$mfwQM#5C5o3huU7 zg9Kfx;%*+#uHIb~3A0{6zIT`6=OFt>^YsAiV>+Gkxzeo4S3B;W3Lde1PN^lWxz)b| z*jp!{RZq?Uu#X%>*=K(P5ClZCd~jYucYATYE%3e9{{0>W59CRQ>a$Ab0{14HL7*Uf}ifM zLh#r4*6hQzLF&i-;L(MBVMBe8x`od}T;v0xMYn;yKLAKMkbXw*i4l zFM#sr*AVwZb=0@%yP%wtin#hb=s%N>gA5*np9U>}!F_yd=fvG$`9T1(gmW{o<9?7I z_%#wrbIZ9Br=175ig|%YxfYB>mNW|}_vd#(FYs*vMYtK;Y7=B0eh@NOsDjL+v+Z&Sk-^R-m%_yRofw|`X!gTjTeK(Y}R65HvldE^k=<9Ud- zj%^u3ZF+Yd?%v{z-S0_c>C7SH&@+fz+Z-%wvvZE)3oWX(hE%uF7rtQ+?ow7G?vvdp z@ycB&k-7kxL+KkyF==afNwwdgh;I@=tMAIoA8_%RjvZsRkGZPHMW zlgp4W{2Bb*OPR0owBh99VBRP@NlR;02c%vZ50(qL^nLjp=ym!Qf(Ok2(V;s~nd)DoMDBLn#jQo=Lp(G!hh4HM z_t~>fLyZ1BvN@55QEsK7B;Wt-Iv%QWhGW>%2XGfkm-o4Z-71zOktFRV0Mc zt#piUf|4~y3@n=QRJg0iw4oGz*7(9CLQ2IqWF7NaM zl>>Yr;1YcW@8;odOaq8kx*^K8r49TWt-i&zS>KN!OYj`r`QHv%x=@zE^nrf11aZed z1gQ#KQN78b-p>Lpesw(v99#|N{dOVsr&f?}>@XzE*@uKc*4IKu#h>#*s>@7}no$jL zZ_seP_!=bGIRHPcJ3xX(d@Vumr6^mT2GzdHAQi%MWcl34T}x-7yss~yFRGtRPoUUW zx3)wB?B_o5)@ryr+86n*z6*hDG>MO~Bktf!AFA*?VfqeK>wy?Z(1Bj2z~KmvOG3ij zI1t#<5!^O#2-?prgGuj!)EOJ@J~)QEOFVVey9fjy_&ws9KL#G>MuBCGOGqd~fu7{D zB{~gvdBZ{ed7h^K{V1~B-VT%>;mCUD5Re+M3aQ~dANCMOhPUXpu2L7(`ibu7K~+(r z9?vek#`RV(AK6*bAC;+d5(&4~0{I9oRX^d=STEm(62H=V2&eUWj2-(e8fg8vDk{Di zTJpd%VAMSiEYE)fMp-=MS&b&nM83`7nfH*8@;*u&pN`CDA`v%$E1M{u{T=!f@(q;p z&-bEk`!|8_^vBf$6JK#=>QvL*AEGUI)Lcnmyz%@dwj<8AoUeb8rR`)*ys!xHDCku!NPV0K(XLhpm4uoQt>Sp3t}l&XX|5alaEbf?4X+mTQ`hFapV0|?Kc%t#Js(Lu z(g^L=isRaGZZz+#h@a6B2--N5z8e4@Z#6>&FQ0^bo9+j6k3NemBfBGE)mM--Y$x*7 z=k9f#F_7RL9#&l%0`d!aOuXnYWbVZM#;85WJTw<^r`TE;`Z2$8q+Z?~B}Ve`gYyeP zAcIe%=FvIuJauxz#~{_?0;t@@1;X@$C5H5Jv-G%!4O#{(a zGmyFGAW-f%3G(gYQ2O>CDE0^E{SsW;k7M^+vIqojYY8BV@ZGMhD&uZz2V{BqAgVAR z3&F|FAn7qaX*=duh;}&-l-u$o%peYK-G9f=c}@wZ&x2IiP_W$c9zc9&Ig0Hk&U-iq z?4+OYDl>=Af*zbLi_}veL#nzwxYLKPyJ*O5)D|Qae-zBE-{NNpN0pg;LSf}QkmZdX zpi-Hp!8{I7soX*|!XQg;o+fx}JhJrThGnG>5nLVu@>7rC?q|;8)h{Wx{>X$vZ2>F9ZZ+ab^01|ic9B5n!$ zLNm6^O1gzpIOFu4jS8OOS)4Z)AehNPtJoUQTgIh+^H4AfSqB~sIo8!129^u>LQHEr zG)h@M7t`z@QX91f^B#NAD39zyiH-cC-PfGUCi9I?#b$ui`W~RXj~f8H7|iD|vX~0D zigkPejW%M;S-T5MIr9RZD2lRFO+8VCX@~Bi{M9J0jq(p;%-De z5Ix5k><|soIebg$c^)n}y#~N`q#L74K2itI0=*ue1Exp#*xWpBH{7}uK*Ssd(OP7F zzky=?uCcza;OFz2h?~l-idFQR1)M{PC9xp-{hg@MJM`f-D2^%|=LX)+ZAiVFe52@$ zE5=n|b)GqCPS0oCgCI4XPo?~@5eXAELZH)e_^Hn!=wZ6Ni+qb>`+06;&ks<6JBy++ zqklqWV(1NhmA;WNT;=cMIokQ0f4`Xq(YCz?zN_d83pjyR_>?E-OFjc`8|X2-(iipZ zO8aV_738mu!_TEXC|m16NPmqWmi`<+yZ8X-*fQXIf@{BcHkqX+;_AoXXILi?7{3Dv zFY?tOrT7N8m-)C}xpiQ)XaR!9=rsNhr<2Re!8e`Wfc#f+*Ww&%^c-Izo6`%KJ4S%- z%n;lSrZSx5d~M}kJ}UI?Y}Dwj?I^o%FY@)F_wvz60Ja|WpeZLqD^>KXQn-6K4A8Bl(!3at zEXVn@?8Y`oc)B!1+smE)FX%H`-yV0}jv}rP-S30w#$C%%YWGo)Ur_|9W$Cr=!gcrf zOeC}l0UBFB2FsVZy>|y~z06EN@&q@6cKm?UDX)V{+zZI^HVvS)bV@8(4_P8BA>W@Q zbsLYA*5o;l9&aP_UBQr`=s++kmka_4w1J-(fGh{!0MX0*x_A1|$hSNKfNgsUd|%^N zQY}2{Gj{+e4|^Gu-u5H4RPx$Aayo0oa=(4CmQ)3Rh^OMwr(~Qfbr9bR`+_j;}d2%3{cHt+aM}OGpP~?ju%a5oQ)wxeM zA`6uJ^g)&fcpz-*Gx(`ZH@M|NluhOy?yw2?d4}qkQWLFEc_m7GxC&KBor`=12a4Vq zsOtSS@FV`0K0Md=`Ku^Vk3QAiWEuS?e)2NFs2R7)X3RmcRywsbpvOReAZA5vnZ1OUiVi09H5e?>>UqR~OO8DuYgW!8@f&B~~Zce!k!L1ung~vIy zy~%zQbQs)v?*rfRZINXLAMC319kNXChM%>3ezo=nWDcXQRn6(QtQ?%0)h5GB$$9rveC=J}HNS;=Qn zQl3M?ec$5l%q-OWYj)!B*+@N>i>fZ;!GuQBA?_|N0p6x>?vDge-b{C|r3>Fokws>s8UHJ45Ga;H3g}GHIR@-|8xIb z@c5-GsLc2iar?7SZ0mkxd6|1GvOg2l59n6p2vVJ{mwl^&OA}gny}F>-Vm3h2EvRZ5 zzs30!bz|6hP#OFdqH|%A?49oL`oEg$KgEwt!nUT_B0;z`Xhv1ZO`90!=tH zKd=u~sK--;wO4{$^chfDvL12G>Ve8TbUI!61F#QYi)zg)4v1Ux_*5+S2!`_f)%_g$ zs<3HyEx}zcKHyi6j<-O*XCjO(SnV(pCVq)(eVd89h_66?;VC3kD2`$S_?%{@A4omK zh10YcNYMOtkZ;Q^ml`_((+g{n`ZEbwzQtXAx+iAd3i37S8b7%mwLH#2YaWk}UVRS1 zr~m|?cm?^UwE(b1xLb9O?yLv6C$jAr#F%gf!C1a4hgVLi3suIhd#mx%q_^TKlDM`R#q`sh(G|VExB_D#L70p z^T2UJ*03t9uQPhgJ^%@d4j>XYg}GGSh28j*D<~N_HgM&b5|YK}tw|wixJs+o1;8~F zaVV3dGNpC~=8)y&=xh0DdAGM~oMl5)lr1$PB;4q-4g%sX%BY-#JC`yEEc2gLL@X&} zmL@1ygfk?ZuC7Apz4#DCpDYmvzkU3H{ zRGvTEEI*6Qm)nyHCIlyegwm4aOSa_gw$#ADr-Cd-(c_HXY8$_az_@_s(pMc#6;5cAC3^TKi!ML@WL9y7eHe7e(b_2?IgAGOnYaq}sG-Dx=%}}WvMsg5 zi9tjT4IGimR!$8p+bzh#nuQvH(^v&XCL&o{0}b&VBBkO7mhi5`C&v_lC=x(x1@4Se z1fq?OTM7|~H3Bt(SmO;vppHQTN<$)2)fHsk7BVT)q{hIl1t_J5ECQ@X_D;m7rl>%K zqL({M(PLYZ98I#j()4%*z22Ihr5MV6HKGu`0LDjYdJ@==p%nGKd#0inh79ZO-zOgJ1wUn3s%l|Y1|x8-p~&!*|| z3VIixQ20f%+zEDdcln|jpP=bU;K~9LFYzK_#P~c;)8iHNmTP*GS#C~Ydb1cGs_98! zDd?qf>XtcZ{H84A@H{cP%#r4;iNJpgfyu7svKJc+hM2KQMlWrRHR6z;%z!78%uQ5Z z>3=%UP7;RMXc;MnusH*R5?~n+qvNnD< z!) zFX}(v(a{|B|DW>j+s9s8JO7;z+hhJG_2(Mhz5V|-e|Srz6Z$sNT8+N6M<9dED9x1$ zrSV@KV8r%i;D!TF1Y9c~_*n~jpg=Z~UWG6?8iL#UuZ{?56anfnbhkv4X{2%OA;mG$ zt1}1Vi~G>-)t?h8YkOI~CtqruB_DJ>yO z$DRLmrj{$RoUwN;uQLcsbj4=06ej2n@Mj6?#z&Zg(o_$r0+qt8?>(gLWczsFE{WG#h8r)&vSP6E z#N-nN%`vJ;Q?uJ_wT8kCW${g2eHtH>hnEAux_7VTPskcwh7MTxRxEjbc2_LNs$d^R zg&X)Q$BzmLvjkWyLvE3dX|%wApLZL*?O~QU9d~~`;)=qxdn4PD`s?5q$)>FYnH|o} z2o9ue@spUl_ghYh==y zU~j0fEmmL!>bR+bo0O2r0K@oz-cn-2m~o65ouFcDL?gi{9if8I2X>vr4Z%h+dV)|U ziczt~COUg?XQl20^UfBL{3WlE5y=~PMaFO01M{&0O3PDH0Mlrfdj3@?-BCd;+&88u z1W|E}N0G+7`AT|7iY{nJ1vf;6yB%-PL8f41eOTjL#lI-iAT5cVdLxbD<>i6k? z9Q8vvZ(CN^t*Y*S5KT?h?)8JrZXc4Tz+pBF0^u?U_;dFr+?I++_Nvo$uqUjV(nxa&Z#yjx%!IXokh@S~r{z`4 zVbP63CjZs!@@jnPHOM)>e8W8zw4xecx+w=*`R@QOetSG*bybmAp@KLznRhz%D#9#<=S zJ-kZD4p!iW0fJWz(9I9rSLT0!S6e7a0e_4~{o)`HCPSlrF3Bq+LzLn7gz6|-@k%9Y zjN<%dfUxCfi5lghheMlq57U;T!2F@wjEOR4;4e1D21-9XH7L|grsE>pK7gy9RK`>(fF zK}VagTL^Y$EfrIv+yqj!@9gTxxiDQL;8;Ga`De&ghQTRa><|VhP?D{(p&gnxoZ)cA zDeejOWG9z}+++rqMVg>&8a5RJS#37TV5>F_IhoXQa6v;7delqR#8E>KSC!ALDwc_p zcVz|8t`{^wNg*r1Hc#XQ5tLFfbe%JWBn3hZQ~VHj;ZGzg;WJ%@PY~}{N(dth2><+( zc8FyA-&J@ma$flY*o{{rS8PMvv&cS-BfZVI6Rn)45-(UCi82i&7$uO%UE%~z4K_CE zUPxmUhhqX&qXH#n7eQrtM{)_q*D#l{OHIlf#d1!PA~yS0d-q4N)&BZc0>`cPEEN0) z=5ddM;r}4geZI4Lnwng!Dw%$=jXO6B;yFYq#Q1u(gqWt6!bRQEKX6TlhGiQ^H@TKi zWx8`x#eP1i{(!j+t;)j zDIQ|$kC8=svY$%=?Em0lV*mRwC$-iOau)J56cR-u9P14){2QykVh;Y1?26#;NcemF z#lH4+62a6F4umZ1Y>~$CChYTiu#GfAXCs)OEgjL;vQ5D7YV4y4D(_2gAThPv^Zn71 zGq+R{3OJ3i!qHuIzD6?@O&M!~F^L(HYJ>c|&N!MB^|{Qxc4EFMFSqwI~i16unw5^zxdx7P3J? za-5e&`tGHsNt|6SJzj^gG=8jpm=l6H`z(iT>4=odfg*B%SQ|h83115Ox{OLza|`5# z@QO-&O9us*_p*eGvEK+Y7PK4wjtH4G@}74TMWz5*+{WMGj6-vy0Eb?w=x;q)Q7z7m zSVZdf;MkeFv2aCXlKH3V@ti{}-4J2dsYVGI&2O?AXP-tjTEP-gP)w2ahDCuuCFs<{ zq1>U&5@qy+BLZNBbH>qgHHOTaG?+XOBmZY&J+J4-pN!;*28_VFpcgJiUo@j(>DkaN zw9#kf>I;9ICc=#zv_jgJwjrHSIwgeJjYq?vlmIwNp}x60gGq9JiFxEONAwp|+!Phr za)Vw!9eUom9+)1X?$!F~;gVz+xC1khUJsPb5B21qVMeT<&Lbo8uP4FOa(7|a%MbkW zTBzIl>1mlQw9vUNAP^REFHx!lR%7fECE_?j0MCNhNEq)>v4~`wUz-)^*y(a&#ZmJm zuZvYfgp^goJ6kGox`^$DG-j0Q=ORSYj^|u*2L<5gTYrlP=b!XTDVFKXkxk>fnEik-6}3q2SW%{QaX>lhl|NP0YqE%*6e3rE zoF?IPebpf6JS_E^g*1Z9D=;4?y+S*-dUqq#Dw6(#szQguP;t#ELt?P3k*gEo>f!*y zLPX*Vw9kVXN=zQfbI88`UIo9sgi6ddK1O3gu1w^mD78#MY`8ExdL0?*(RqDa;Sb>IjH_=`bG-sVRxKWrOs!IWFGYJ z(lC`FM~f~)&v%U!5UNyqh)T>hmH;&Xu@`v>1g`|*Z7G|slpGx--1uB(k!)kntBU$z z$$?d-TwS`s2+iKmB-}dDo7{GX@TVnF_mTUwZ1xf=G28H0vRy)6%El{YD<);JpGP}D zuUO+89p~tK;83WIA~4O_Jhe^*RL4t?>4_RUTPITLuY1h*Ww9i6cGiI&dD;gFZ=Ln^ zSG=-5_N*)G-3U1p<0-Jt-NRFgp2nanaSC6HWGK)>g5Ok$ev+ucU)xYAhP{MJ%r;&@ zOF=OLkeA@|O7M#l{8V+|*wM=lOjLw}gm6-bT+zzG2s^+niU_MTovT{KJj1$W8@FTe zOvMNl66sQu^cgl@dQfBu!#!o;6@%rVLS5ql+VUV0E=2UITGan1x`8Nwr0A-DevhiU z%AT$hvyIn*6RK|0?05yca+vHRaEmHf^2+J}?nNXfphyOS_6i>^3d=n(alTagsx4KY z%YF`17AwK505qwTKw|I4Fl?Pl?VNGT%_mBp1|H5rR4`Av-3*4kT^eyE2>jBUUygQF zusDPq3ib!KV)Ecb(G$@tn5YV~mj2{v2HH5?E6?(7JT0y~Cz59gH3uD$Sw3BzREHGO zem~1z2TUd4OiAU6_KcEny1wc;D8ef37mYL`%`4g_3xKl~vT-#I;aDis7|B*R$3)OA zG^sBctQ02(L<;HKH?vh@tR!kt`!!HnWiO!;vyC=$MXChkC1+ltAkIOgu55x{uZ=z7 z{rEJmc)x`ukaPS>lLe6;zitD@xe0o*H>B=b`U;7vO5>zTn520H(32$$%RsIg=wtUw zmC_K$D)9=S50f5%CS7CLV+v?S5@wgL6!MA;#wbb5HnyUfAlC{6DJHKJ#W~rhXl|LBnoRbyGr$7;3QzXT=4G<~ z0vj$~x|~1P10*PRZV`kWU2akdG)JyX_8wF)bdaiRmPl6sx(FE7Y@ci`y7ZP`>M9`Y zB~)Uzu^u=Bh#cf45WEry`(*DnQ=b)o2P^{3ReDA$ErC@}QS@x%>tx0Hu;f6y%hkma z7$iRLq!2?AbR%`pvf1gXM0oC$Y^RZzvhhmUu0PqI$0Sv_jl53wwIQ*W))|aSIa{Z< zR8e=9Tnw=;ll^#)Jne&rx5<7nOj|FkFJS56WNmO!h@7$j8VJ_8Y^Fj(Pv_SZ_?INn zgVvmRQDv}zgrnPheV0-URVqD1C1x87(AZE6KjbC&yb^r-WbY?)ly1P&V-(>4Aq>la zS7=}mu8tZOM?~St{v}xc)SQOR6^URWkuF6kBg4ittT!P`DDEi>uWGV)ozE-j+J$Kf zZmJs&i<=UKOQIHgXB|~_dkK}8Z7c?mU}x3rc*U^H$-XUaQE@fdGr&KJ#CsHBqP@b0 zi@Qwre{%FAW=2AU8vU4+fR@13t|{Wh@-*28(~9vp@Wg_#x5>W!WUmVLT9m7TO+v__ zVC5i?%VfU*b5vp0UMKtAlf3e*>Bh67E6>@0F;8@ot!6YTz%w`^IUC0Wu^y$J87zqD zHXJfiHLMNgSOs;>p~NvHRTRdgy+vFM9w-*57%gBM%l1jQk=WH0k$8mch&VP=*0q2` zxWh80a5E(m^#2cUru?7r!kL1a2$%@?f`I4!vGFIC(rVoZ$7k_mIqcN*pLbUc* zbJ4>;j-O06mRI5UD!UDO%Yh+mU&)U;pkT!+%_ciHR^@x~pU^`%w&gK1WaJFF0x_KL zUK8r+;$L%cnGGA6)3Zg2byf%5g#Z2YfFZ?hZ%Aa78fxNJ+0%7mw()zaOxyvWLYBPh zReB}d;-8wh8Q>rD@E$H-TOM2ou6(!9w*$UGNT;QhDOU~332o*EyGABeS3=oKsKjie zhY~6jdC8DhGURjyA9@`2=?D`K62Ogt#JpQ|4EM@Z6lWqP5lm|?+*A2H+T@>zxq$>`AEXi&6!*jL{mkHEnOYO{UPF<0^#;IC{BRdZsz-N{o!T@tDBEey3 z8E~gwDEF}}i&J^_VA(_DrChIKk>-9WmM2fJU4`#PAAFFr4N*pU+Rvzu6;yTI<4fe; zL0*{CXMw&$sO2W8Y$s)b%h8~Mm%;;V0J|bO?5?(u+ZKjQNs^X5_d)t zvv+XaqRxppVatNw%?oT?VMD-7(zL^7w|Aq#HzHLLBXSHokZYw@76p-0CrpgN@L!4L z5oJ7&TL+GlK>~-Jq;~UrGNFL(4b)!f7~!RNJ~9w6D#FwuOtD%Di9A(JX{E{zH=878 z8(XmW08|MG5*=P$(8)nz~2^ z?L}@Q5*nldYKL1pKzT3Z^&q7zO-U-bZPc}VwCQP-6L!3@rONR{t;RF%_oBv8#&NiY z9Mo@7$bW}8+M}1$nU17}F#H}9hZ_yQH1IYJKVK%KznQ1-`4`s*Qp30fTj>2Q80xIX z>yNNa)$A0^;S@hAgx&47_TzK$k8#YG{cfwV8{QWlS;ZCtRu3ey0Den3fEgDcg=BSx z5jZpt2hwoiXe`7*L5Akgym^XOqL0rH6@l>VMvvo{ahUO<7|GWjvbZZ1EOBTN;Tz@i9>VG}0DcygE$Zfvfp zQfv$c8;vU>C@3SCfRjBzj!+mv;Kj3eljJys+T5g4VaCPzGdK=W2jd$G$5$)`47rDe zL%~kwN>L|u@Fd)*O)s;Zk&Q=)@@lEDKDTy1EHlp85KN2uEG!LX0W^BxDjSM{YZiA0 zv0_d9N6zpU)LGZC=kpR?pYqZ#FR~fMy0GtA*gTO0&}x)`mxS%7-u+aPIOL)E+Txr9 z8rwFsl$>?T3v@;eE0u|1*`lAF3G-=u_HdpzK<1SzYubXAL)(S!h{3$(Vm4|>@s8e(sNKS(v5BX(GHlOx!b@AN3IBSazv2yl!?VV&T%qp!V(BK zQsJaiXTiG=Bs95ZQ-kg^(BPEmi2OrzR2?4GM_ENcxY@pW*-nV=tive9KiRuFj2j|I zbAb0SQajtlI$VU7DmJbt+BG#tE{DfXd@{5fE+HP4Xe?|cy|oXaW+9S!2O9>OlVaNU z6)28zT#PRC3mTJ6OR609saudF0b@dfN+AovCN!WMPzN>TOGl4LEjQ3VNE$;jrs{WE z*@3DlkJqRb273+q2z;GvHslDUIQ012>zmD;NofXj+6+puAzYgy;l^s*k~d4`bc>haw2s%FR5IWvdQwB~+F;gd5$2kG=oauY>-(SG-{~JgA&LDYk2;{QuE? z;rU$7v!YwupP%{fh70v~Z$lIN*cv~!`%AY{`($M1G19ZLBZrAVru-rpQ?EDD`~`kx z-T6&px4?+#D?jA)z%<(P{E5j>o?9?x2G}c!o*{Nkm<@M$-cFXLDYAGn8j2HI=9)0$ zH(Acf?4!@{oDnNslC8$#c8Vf~b3N+~3{*97ecTL>mP_S~?p#X#{rSm5)x$g+iEQ66 zw(nejd)0w*q|s?MrIbnp8)LYwalIBUz^@D6Du{vW%9`>Z?U+44mxFecyoAxH=gKhJ z_?)LRlJSN^Tk>hiaCSaehWG0Eg%ADK#a@$P;W}YR1{Q^%M{B&3Er7A8sMIz1y2DFB z`tm+URL=d`Qy#qL9Jyu@0WQly4tj*A5#>2ocsJ-E2yd&Rt?CtyR%EqsGPg3X%=AwC znvds2URN-Ul`rzVbe~6gI&zSuy8o}`$;15M0iU=^|B^gUd6ws0%#QyGK3_HUh|i1I zXZlyO7zwI8~U@PiAQ`^iU0Cn(C2EN<;jfym+(n$>=B=uu&Do)_WBbG12Qf! z9yZ6pvwuaN{+{I-JL_MP=f_4K@#)63?Z45#I(n98B@WX4EAo5_m$wJ~d60{#e*>TT zp5@7V;$M> zJj>Iw^uN?zUp4TE&tCdH|LOkjV&B`aYb+-Dl{F!_Iud0q*cz~~Ge9b+t)Xyq%CO{BWoIjfh8`?Z;lMT_>p9K}SQ#*i#4 zc5zzAdLfwmF`(+p@}SU)s=)e<%Qq`mGXWszs4 zeJTqA^BG8a6Iyb%oWT|+AXk^0pM)<6t0TJkxV*;wO+8cR*}ryN84P@r!X`a*!~cy}El;YKTLFzYTKW~_dc0qO09DB3kg zU3L3;B~2R1e#XI$xta0v^UkkNg$i`DcN&>d+kc&vC^E_Bgz`L1Sk%QXW>=@hx39Wbf(yeAnS0 z;?DoYS|0eHE&t!+KmUwd{kK2jfq!3d_tDMuU#P!3|FSQ5;Qt=oCQya{2LJiLyVbuJ zJw^rFKar+dp|DSaD@9__D=l^6c5A}cZ z5@hrl{~OOguIDkVo=hh-G*p2#$JbZ44Z(Q?9^CSyd51f^2G%ken}!j1iOM;89+|4* zD$uHdc+8v$md&Cf4*p*M3VaC(vRSVM=_2ZKj2OJSwtwCy*;JmZd zs;3MFJWW3CQ<;Q(nlBx1u`8#?I`8D&>3If`=tMw2FpXf9K@@AUR_mWr%3?JFa1O#p z4Bh#80ns7<>8^^fukzoB-e{Q+uLrjW{q;zcP*|zASVFMP{cSgr)Hi#Cw1)Y4r*(7q zwW22&lKxZpjf%Pvy}ycID$WyMUs5}MuH&7@rg3SNw=UazA{q%T)jj~HcmjOkWAA!5 zhxa{yo1d@vDXq&pj3Brz1Ey1 zMJu;j{hah}Ox!6iN(bou)`II3SN-rjo;fE48p#jJd@N^Rf{nGZu*gw!!&I10X)bfq z*%Mc9YObITx$BQtd4km>#Tn_-TO5}0K{65G}0iDb^v1?+Eiv1$bk6y1Lh4FJC8Q>&oSA6&U*I(ae8#Czw z_he!?`l~OhxuUAWSi<~22$OT#jTTW3`d*q|AW>G*fB{}))K!&>gPt$)cFmU#!@l!i zkPpIw!%fi-{6*-i^P*PcR3}HzeZIDD?410(;KT8E#X*dho*K_p-s_aFU)?*fj{07w zd?rpT-jKg9?eU-gH~?yf!%H_*9v|zM3mg81@_DHr^$)tdu8tQHH^N8hZxCs0x*aqy zCJMn%81T|&qR9Hk7y6*R+20E}AInG6JoO}wD(`gNJLp+GE+sK_;xJKu{#rbED+fzM z@&mgq3$>(iw2m}ZV9N+cZn2ci51gu^`9jXhxs@$O`ViIPRwpx8ARKr&$6H|O`f7K{ z;X40#9rPT-Zh}mp(nenVgf~a8#*>aF{zvS|>w`>XiX^a6>Y#sIN5){gBHR*R&$R{i zEOoTNJ67U$db8eOd{&v&S|>s7=dT&PtnGU&JK zeX!i)+x3_cZ`XUBlu`qOi^$vcMik@Q_4=cP>)Xkn*It514LFtx&20hkWvKC>qCQ0t zPJ@CcuEYNhMs}=tb;k=}6m~7USb%<5U#LUql#55&Z}t-z?);+3j~)q^t+rV1EMmCG zmuGS0J;p$D5m^m8ykxuEip@<7{mw=YDDYBC(jN>U$@h{0OA;b zg1!4!Ld8p!ZM;DDnx{d{6TR!GV&Y&`FRYT~e586g{<9^V>i6LvuIhIHfI*#phfZqs zy9YhZ!^bz65$YFo4W&~9A0xrka*In*{Z69GI@K>;KE5HU2Nh_KH`Lk!^fy3?`8ma? z?GkCrA zrMYszDg+-BQ ze2j7BPVq*zRl7EARrdXrAP)3C#_^2LC%9Q-p5-3L=$Iea86}*0 z=|5qlRtR(-`)mF5@VuC#DbS}JuUvGM<5wlex6oGIKgxTSgBc;mC8~95;9w=kRFPx* z`|ffih#W-Y4j#Jz{J!mJwoOo21fj~W8j_)+gAh{x`OB*UF7{y0vu zDDH@Z4=Zn7fiT_-?jUIkFy6r8irp0l)zv$`|As0!>W69+K6OGakw$O!Y-j%~>(u)> z=Unw(o@Gi6+=tGf_5QYn9{V3NLhmi?z36|~V8OibcscgJUGKT;y}kcM3d#U8Ov!Yd zb1_g+@pvFFOb-vQf{eXe{(06_Jb7tXYG4bec*DWW!+gPv5bqgw>eRsQO1z;WUef~N zjd08tiGST@^sy^SHb;9wd%W$xY~#T`VDmThS--&4Rq?2A)O6@v?hKA_PMx&q?7dy$ zT%UZ_sxJ?Zf{3U-o*ed|`Rg4NbQ$@og)YOcQPq)w#}zxki(391!5pKtQwK6Gr} z!49M=wb`|+`FI2|Sg?U+BFq~(b#Bh2R+(szHj_IrmL;j}vok7TNT zQ=H37uggdJT;^k?hXxK$l;=pGbQh5@1td5P4<=F=u+3bz)k`glGv_r@zJqyW< z5b_&jgpe^JYq=Sql^?87)+tS-JYrAL{@G zEIaKXO$q?QXa|jYiU$2l3-`c2Y9d~Zn^Wk44t&E`6T`UGHrB9`__Icgy5e!87g2!3e`__2W#EDQBJiZVo01gYl zRqldE|9S=S_~IKkJUZwMZg|A)wBs>%hr%O>6ChyLcvO;71@P$i1Ms-5Cm8-+<#5F# z*t`8P7t^4(3CMvb+TFv@YCSGhFF>o*sc5 zmJ2qnJVSIDqYt3GQz*+mmn;FKGNw?L)ySg1J{fNRRts*b;H^Z$?2>XFRwcZj^dLui z4sT}h>p|%p_;~Jrz(@Sgs#lEUQN{xJl)*&GI9b8R8bh`#1qq|jFbJ{LghVULhZ<95 zR}SWr^L%8m@j1p3x6C%ljPF|d8QpXNJV9+gP#J7YD_8(c3+gBkV1()dN{w~%Jk60R z4_Zno{{fwJh0&Ms9n!@bQ8hJo3d&JM9k6i-Pt3*_tfZBpeSF_X_^?uxH#o1a5?jB| z#m0x1G11C;$9C~|5(~D~7n_f739*-I}_;K1IzZW)~~g@p^Wc~iQ}9%rjN^fN0QaO_;vdZSCEO2pU$XKKLER-!iScx^Iyc*KEJX`Yp(O0gU^ z`t7gr!KpZW`NWdDLo#b2VvZ>xtPZheaZ?j)V@LxXTPbWT6)A>_6l;WW&kSZRGTB5) zo$nN~8iV&Kf>93fI0z2-_Nok}h?Tx-HD;=qu?6+PH6S5S)44=O2}-Kd7lR;=5o!_-wx>qvGOb-? z;TPpe5BNmqff%Q^Ljg)DqaDSI>Eh91!E2h+gKtbT#!hp;UTnlTXh!PdF`$`S7t0e0 zf~Lb&4Mu*90Q{61Z?VIwL}h@3iy+5~`m~MzRBf5%o|Nj?pnzN2Uq)=%zpv zU5O$Vepm#r$-P$uwcFZO+<>BfB`${zWBISD%M~t;PZ6sRFpIW@=Vl?ht~R?Q1&Xhy zBV;2-Vo+;vSA4XhhUZRj7Io&7k6l7v^al$arDW*Tc%0IwBML}Ih;jD5eb8hz#j{?r zh5$KhfC{))a@)zP`MC`MRPLQlv}Bk-0Vi0E?6M0j4`B6jisN3oAXcAxsxTgg1ussvdCAt28x<*b);0 zEW_Zy)%na$^{6KmJM!H+wTI+yzWe zyy;CLU*u1e^B-FNm0Sm4go!l1TF+|nu3Qk~wERI1`7dzu)gJwOM|-(LjCPYh8}k3m z^uHp%j~fi@#ZjnN4nM;Q3TDBDyPUf{8O%oI*{YH9owy}_Qucvz5 zB)xk%Dte;hWBoSMy>Q*~FiO3>TAJrO%h%ogwcQ1kaXo>SeYedI&=F!C?_s(!9Oq@T(d zL$6s993twS`_j->8$KRxG{=)PTq>Xz{7LlH-RvAceCA)=6aO{rjem>(b?_gu8N@Le z{qV7O9PMi1OM6^fspw6;8G4aypGxkgot#>Q6H_hkqIvK?F4nP+j%O?mj*{JYxRQ>f zAxjz>|8MN^Iq8KWQJ5RM1&7=#aQ=P=`C!E$SBue_ov3599zL zEblvKW_9kP=GRW&>5=WOzEi@0ItC+yKDhVvSdYF_W`ytb5mHJGJS>-Tjdsv?S`8(f zzSH=ZUF4IYR0g<6`#R(17Z!E}EO2$7&#tdTu9`D{q&~+HZSFn3&~0 zEfh|7pQGK|BY;X?++E3oS@lqvJUG|dXFYi~9e^^B9y)&oGA?KpOK=8SDpS_q+~G#G!h&% zZs9=_q-0AOeMLA&(@tYJ55WO<)DfOfYXQ_H3Nh(T~v%SxE=+`KeOekWCz@kkBCI4@#lYZbO^*hBn2b<-RkqQR0XdN_92*uQS)sW#Q0s91=L#_}qN$E>5d5fsI! zP~(Gna?Co+!k&Z#4$sB1^)YMcZMIQYT%oX~^6I0DgkY=WQsb;OT#lYy%r6l}$@@ML z&1awxjx^eTC6%-~HOIA;eZP0r2S|rGBO)Zoe|71}?$e}$plg0Fum0p_x#Lhwq>=F+ z$4%#;6o@k$5=PAl;>Y!Aq~bPA&Sr=NQAP#(yE~$8ZiH}*2Ud@*3emziEvaufL>krL zc@XB2#-#;LIi)pS#>!x0stoyXMhp7Y&oQrvKUgKml#B6`H9Cq@jgpEbx{iv)aV?i9 z(zm}pzFFZEe?pqN2TEL$WqaCCsFV~3zvpM znl1S;L}VM^e@~KssUjZwBgndso?r>xXiJ+xW)61pr6UUsr4Ai+z4@#3ANP^IEB@n8 zDm&xKnkMMEE=JK|1Zfnlz?IrZgTr7PWD-ZWhP5{k}^mTra|Q} zoS105&9~(tMGPf7C1x`w=#(s$Nw%9%`jxe#v{5gou0o9;^dYDi$J3GTe~77SCSPou z%r7XhPJeflakhxB?P2SW_KwtcNVw7Cjq8l*PU;@t|LIYmgnod7{*}4^G<~Ql^p!Jn z#`S3bMLZ&|N7EG#SN-&Me#~{ewi>51T*rrC<2lSUX$3#FXEO%>#BAu5Hgx43o->m@nDGhFR}D&2U&iqE(=lO(Jre42+ODHn1J_62HOc9E{ek_74fM$61~bLj@2m6 zR(E8uf6I;;yY&vnoRO?Fp=I~fYuAjMj0l#b%;h4)S z@lJ5ao0<)FsBnT&5%tM?-H~wOP0EpN^hE|ye*NJ*Im4JD;u!;vT(4fw$)pH@rD?h% zWUp5qPI>5hSS4ELX)GoF=@Hk__5LR}h5GmSlUYO^T|5j|mq}6D6`GlWXx-J=>-a}_ zm~8anu&-9AdXk*P=V;NSsyopV*i3Ic3P=oIMk0qX4+|BCUq(3;{kA$CifNgy4#h4d zs2G9YeClv0-qPQrLy;NbP`rSQ$p70GUdq|NqC;`p3$6}D{|W8s3xnQ@D5>zf8K=|) z&)cEg0)XNsur6sLtj>v=Fl=lH`dik5RiqrO(7*)*va~$U z#f*vSG;lqbfqKe|HOed^ZbE^MkqTHxafl5w;xM%76;%|0-Ai#^J}A1*7EpDI~XpUNqY$2#VwwQlQ1e zDb@(aij(w4@SR@h1fkA{PBHjfskNa-MhP;N9l>y#G2uLIhs-wP49`d5E|OD)jkzO@ zbf~}V&s2EEp=)B?V zYA*s6cV{{n`9eQ}z6rXmJ+!6x$E<9-0GGD2FUxI-t>?T^%VLRtWQ`w87o*5lP?8qJ zZbhiP%DiwK}s7RQr-;rRi~5UE6t z6p^=W2h~@YCVnRKuq6&h>6JHqtEDIi$i~?bWaC2Dl2-=R zZ<3#dqD|CzRu2sXM_Cj9)L+qz7|V3LKaVUTn;7#pW3KL~^D8JHUTWY0JZz)T{&X!- z;9OY;k5LghFbPLQWU=hz4S4c`#+?5&o;#KV^@*1HNJHLMwDxk40j%*r6RC6pJ*0F- z`*cRRbR^n(Ym+cp!;?5_gP$etc1PiKy`i92&Zl^|tza2&u%Xjz@KbC$bNcfH8~8b4 zi(*LCvkPj63Pj}|LR6kSDFb>kyYmNk(bTDEOI&qo8C2D&Q_<9^q>x!Gc?%ntcl<-k z!~z)2;w-#XC>onLHm?V+k-#IIAcD3Gec)$5bgZvPNg&q*%{9T5Yl7mM0s4w7@A#LC zs&K_L8TU@^@#L=k8TOAfmxSgSjb+%UJwTQ9tlnz8bkXm`lUNNF-guX{SfJK&gvZuf z;G;KIS~R{E>k?~;D@z1pT~zqEY)|CMo4Hh>&T0|?%n^8gw9O$k(1elz#vgf`2PS89 zFpNX_k)dSCs^|Ifj$Olz6>^14@sr+i+(oM7won&4`grt0Hp%5xW-@MsxuPAW#tpZR ztUBwr6_m(dR$_c+pbX@&F-9b^u^CWjuF)esBJ5lryMR3YWH1U6XOeOmMC3^xw6K9_ z8AOsxB$mM#*mx6FC` zD|kcca* zoOfJwFo6|_G3MYoeYFR8heoBjs={dc2m+7~{}e(7~O+Y5_ z0_cxo9b8BTDl2>e!xY<3UPJ79ysfBy{9S0QJ9vI0S*yUn=PFTZ;+U94e*o|Bw2;U< zMiorX&JSGiG>#DTPLX6*iuyCTco|(3^NlK*y9}zR>joQcmYvU*;ziIKJ!llT>7iJY z0-?i*Qv#GneWb-hjjnj-1F}e(edu}>YG)+ef%bsqhZ<4oZH>1ZKYV~j8^0+SLD!Dv zrGHsj3jHe*Y+d>nm6qeUy??p(CUopzUFjUUweex^|w%S-F;C zDD5d17PT4>_6RrP(jzV=qiz_b?8D#)&)MqNQCiCWmUz$gF6pQd>g}hydMv0p2BR1RjHG8V7(wl# zjF2DLx!Z=sp&+8tL&oun@jKWUJ&Uzhoz1mxMHyCZ527D1ukrnS^y~(@XLBM}gsbBu z9%POa^C*tFnPx0PZnDW_MqyJoSYgAS$38Asu%&__$WG_p$3^o*_|-7DRUfa4oUA5{ zuQ=)8!3f}=>fj9UkKL8`=-?|5v{NtK!6}__^&H;?F`d5U)EbZ(TcT?pKKLn8&@Fx{;P{+H5re zBh=D0a1yMb1d=U@b{De6dQSe7kJlg>HXlhPTiQZ?&P!a9Vuda4Q}hd1KOUt-PTdZ9 zMe!f1&!tSCZGgKCx1Ppt8iyQqtpE1-co@X^=NKN*;^D@UvmC?=4rZzWT6k0++HQ_z zjUEL^sUMsYRH)n?GUj*~W8Isj@aXwA57Yoq>|~F^2POTJp3vh_;jFoO3^)y83P~@G zcZWD9>}CdudLBWe@*{)TdD!`#76V7zRNa7~MvRw%E!^k>6#<|j1eRSW!Fcxl|Bt;Z zfv;=Y-f6WO)k+NUYI<%7Vve?m`6A__k4vebNR2U<4q94TX=$aQXbm+LeOhxpbU;Z> z4T^fSJY!MM$x9zK_nGqlzP0x`XP@ET+$pL2f60&DbN1PL?X|wW_S$Q&z0W>|brWqC zocrU%3!qah)~%S}|;0TjK=x`oCKtctmV?ZbXPW$A1)_gz6@$L|W(@3fE|Mv#a!{8O8~5|&&7diDgG z_w~Go72vOF_IPi7|FEhqZL`<7q2hNg92f}tK8Q7LPL@#PN4QZ>Z&Obt!M2432#i}Z z4<1F z;WHMm@@0+ z>y;wbu?FaUG`4X0TCy-OrC8F?bOhYm_5^rQppBWVJbQ337TVb7ZkJ8NPDCdoG zQ8NR0BbTk2YeV>|#!mPbvzyh*`x*WslF|pW~I6>QsQ!v z811Pg?nH@?<~}4yT;@*{iHkcPV9`1!_v!dBwkGlpW+r z6Ca)Ehmo{~Ys9!~+yyTtNXkf+GOBTNL^8&ZApX>&Q~1a>8(L}pvJgtMIUz{cP5k;( zy|VfK!KF*ugb@S>K}JUThixCK)vlVzs%XPCqI zYoKe%l=aV#&ty2D$?&Pj7N7Nr&oaJM;x#>O1fRiN6icE%gR{lwV!n?xhiiSI_+V=9 zSE8{iqz^*5lVC-jLSh%VbI}yF}ubboX@Oz z$j$2L}rxQB3TIW-6875U)@v-K%kHQ+FbatU>18ENXQJt1Q8+n0MnH2)6A{oOhp&frYG$K)#y1iJh*+ z0AtUwzk|w!wlX*$J;<2($YYi-N?=?-Z|Gn3dT(ZC3Yf$jI-&wU`afl z*Vvgq9Rl15iOa>=m_LKp&kB zVqDrOFPN*waH@4B)f&053pRDNzG^;TKAVHB0kdmQ!q$(Po3sQbD}wSEu&hl4FFj`D zDI^eOKJer*QFdlP0@|Ya9s@FTh*7I#7)Tcpu*LlkZu?!8gcYFuQ7c5WP{c4!4DrNW zAqwzB9(CwIn}+AG8{68N&18fMGV<3AUJV5eu;9+~8fJr=G@hT45+VLDcez+J8yWkD8-?A^WGA9m*Wf-QSrMpc2On zn0pscge7HhA#6}Ewb3_T3T_YZwI;x$=gtM=u4d!-`H-y7(MeO<8AgfUaC3kzfsO`% z#`djJl&@sJ$1mD4`6w0^i-A+56FsaYWhz{DvADc6EPl(p-H6wk*x9ODMRP2{(po2 z_O~e1Qm{Y!Yws8)KFt0M!yKep{7bUN|4HgUt4gH*t?ll;tw+@?R}B+Hh(=2Hepdq^aSCq4#l5$7TeBH|k+O?wAf;2E>{nUp#y3D_OJVGN6Ux z;md%0g8JBAI(UGlj;Lk8QtOgAiXDkGAmktMEdwq`F>CnVY8kLpDG?n2UWF|Ko;F_5 zn~rjsE(1oKMX}=_hX(CS#L!*CmjM&#QyuDO2%;3fMtq44Z}0n;_$&GklB6lw0#qr< zqf`oJ?O9o2)he|dSxl7z5~U3nX{F*rPd=|wdB}^V{GbOf^e4UpQ!uV4DIxmF^>=GA zpJFrbYTQVpysd&YYdwJ&4qVQmtWMq}(OV_ay37kL7&>}8I@m+?rtFwCi94zg8AQqy z*{)GAr(4$v`He47g@cUUL^~a{vYDL7Kn1Bo37<=u z-Ts6K2nPFk%J$}Ntr}D*k5%%jMm;M5W_9w*_b48w)dVokxOx~Vh1#2cYsWExz1iX$ z)ly@Gwz4;2c1HHbOpr`^c$Rh%JF^J-fV&K~8#s1m|4PNit*n7|276;V`fLpq(dxQK z%C=@GcaUo}&ED1wc@(O&1h2^_wl$n3CeSA_8n8EgAcJ9VmQ!3Ko^4JQ*+baslE+Y~ zRY=#$!b{WMUu3K?GUkA^JJG<=}rH|v0vF}U^Z{uur+l&?Semw|2xa`^0+9ia%$kE0yt3Q@w* zI|QBC$1s)Ql~OHC*F_9@rK{3Vs;{6_kE68jxuZ_<9+oC0id0B*3t+Tu8am9VOEMg* zjTbZnYQ*psVqE=R%eQX$4+VrZEZ{S=&I|fAZKT7>aDb5Tf`?yls4)Brc_NJ+ z@j_5_*vA+A_$2=Z9QvaKYriij?0i2y0RDZ!`dXuJB_vQ%QF8_1c5K|~WJE2t^3nkE zvx4L68a_l?Xf_8=c`M69T|j$U>@-JG?F`t_+hEoobWg5iM+rXOu|c(us4yT#AD|Z7 zky_vz!RA}|)ZZ1Hh<~-nVWL46TW^6(A&~jL;7T@)EKeNtAawR_RQ7$rMNAy~(ir6T zt1ZY63@(tT9njs9ppw4Eo|h)}p^r_>y|LVWwDY!>Me>H?1s!jO$#U#vNG$ga_}na6 z@qNLG_B>V~$tx&%KM#c*yg=Ao;#f9J@mIgy4v0PC0#ykeXg_@A3U0ox(16~ z4buh_%`m+ie3nASnUKmy`omo_0);Tn7nwkZ>1L|)k&l?Fqd^}D9r94Q(+0vpNE zY;rA=(&H#{7216)p;>0%Y{BSyFf7qoTsVO z-<+Xfi_nBXsfYTN`WbCwWONuoOALhRZm!0zU{PuUj_#cYjP8)-*?>m(2xZE}*?xaz z#!SFD7F)%A8r^2rFYh_sgJve{#Ybo>lVJVwD(to<>afiU^(@zmAHN@vug9jWZf?C; z^g~>M$fCSXb|?ADZ@giFCYYc5iH5ow7(~nTW{p2?us3V0;QN7m%en#^RJzF-(biY> z*mKZTj_I^M#5I@4E39pwayBJghD$ZLoJm;@B0#=Tz8rwzMIDzb4DfV`;R97d4#x+= z$jxN<-c|S&_G&tJd1EX4-D`TkSYyAyVYoLLrrpDXyel@D#~*bLFFaM;6g=0d1GWil ztq)Ky-ipU{*IUB|JKR5uS$4yHD0bjH`onN{YvF%c@$E6Aff*!Wd&YxHdDv9+L(dXy z?chLDTa@Q8^YsWwUR(6VbqdaSQ_-`?M@PDXMZqS2^M>xCfW2-JahoKG))yD4Z@iM? zE0gW^xC0dR){l)C4Ui%H(7yxak8mm%3kxE6G55eraF4+p6@=(R0RKc^Zoq&Vg}BP; zFS8CWAqpxDjCG)7FhFHZMc+kA_{x1$y^4$^c@LS-tdm)&+H=57XuK!EnL*t29RW;v zu!pg{QQc}fpYqyP43NY|Z8k3->1f{$IFBkHsj-?)9oQKo*c1acag0s(Z(o(xq|0=;F_r{r}ow#OUnv{Xe!Es#F8%e6c_p7 zDuf*i7-}z@J&tcWgwye@2rfncyb~sUqJnnfhl!&Sn7Fu$lwdH@@SxT`YIokSUeLmP zUJVZ~+y#%+*eiuE(1in)c>M}5mmHivS_pjvlyC%8@QSFFSj+BE$>K2cjf~$Zr*@vd z<#nx&q+NxWB=noSq5*4k9POFASzgT+p(kPCG?rjEZAc$TFjSpz5VH=DonAVGB~doL z?+ok_8GHw)aa%LjP&(oY{l+>ps-0{x;Ow5d^4WZ2X~Cc~yKL9*7b zQe29D^^hWy)SHU#i5=1+O1~n=q1`iHn*KWgE^XKh`bKd}nNReqj8{s(0);*LRod_g zva)a>pI5)UTvESAJ+BlgO8sJKHdvW8Trcg)fmRikHH7vP!bG8J+&acK-JR z%+7~KpMgvMHS)L+-pGj(ykP6$lnh>u-j8D)uh_Y$xC~;;z3O=t)*svrf)2@M)-S&^ zA6|ZMyq}a%ZZXS=B!bRv?x{v{!b$<^_OByKb(ey~eGrDjf zpI6hpTvF3-d=`+|mXxKb=_S@Ay@=~r(j%n;wI*>8uhA+DBuK~LZd0_-1Qds=Qp*Vi zZ>`t=N&5BCn#d>m9{HFo1`#7_g!!f; zfhDcb*Gik!8*ggh*q z0&w$zp2lw(nqh4>12@Br@Y&@}?t&Vh^1iLcvyt0TV>{fJ$$lhuzzHBm494)+2rf^? zy;e+Knu>`y;K$7EFD)~~e&dwtLJ4U+{ZZ> zB1JaA<)g5@%SbvzfN2WhxE3Xi+c&DcMm^aIfy_>?_!nY^wh7tdPGJ8zS%C>Lrb~+x z*bh?Wcvy^IV?3PBWOxr%GQohnR2bqe4;1b))t`-YjXN(*+#8m$i}}k6R?DtZSUDk; z2??`)`l-t5YIs>V&2CFoM$G>i@&eXTUX|*WKtI<9adS&2df6DTi{8f{!{4RD#Fiv(+Rqw?+2j!`Q(7l+$ix~Y5y}9?j5O-h+n`a!05+&m&UvHg)gjA5POJuf z4*`PiU-D2md~~C>=!q-rP{H;%qhzwRDF#F2=7Of@z)INvK9SKfNtQz@@yR!Rre5O* zvD$vc#nzMeK{bTFZEbfYzeC?Zi65jhG{c6aU&=xjPCcSXcsTD+8T5PanUH?-c=WSL`|#K$l&HixA!8)ftoTyIO&yr$w8`#yMhw-gyS+AE(5}|_5oD))M zI`!SVzs57Q`Yyj9q`q|QNiU#(-{Fh^r4jaUEAgtT`$P*I>Qq2o2vcWN5c_nU%w4CRicC`(mymQ{jEkO zV&9k_H;?@1dn+N5j?aIbEOq&sL1f`S>GY>dQmJp_(~{Qbkt%dN?WSw-_os_a4Fj!t zde82qQ1a9JELmirkoW2AFoY{M>_R=SEeLMTHil0y9k3X{Hp47!wuEp&GvePEx3){G8ns<0SF$kC$|7{GP$2vxBUrQ{N?N)_2pR!TOAq z_2B$NMO)X^)nL%a?96b>ruGqfo{yWQGv5DWkHmO|I8u>+1ld>i0xxa*z1YwOI?$+4 z24KA19Bh_3p#z)NhvxhDN4qPj{QY~@xk0pi<5{TvnUsLuMl|Wk$MaBn`zD|_X{XHS zt)v#H*%;Krou7`}F*AC1B%t?p=&UH%@}WW>Y7-5cpRODp#;I!Xq_f^{du!1VB#Gt? z<&hF49pp%f5=0&KXP_h2^n~8b;>9WSzZ$z1fB$<{nL1DZ6aCadmS&G7;u@wzvTKVr zxI;1o#U_=qg z71qrVV{)u!lALE`sV_P$iPh@0r27`~X{~+Qi%xy`cmh059sGmkCoUl>YP)mu8w%H> z5^Kv#u+hl=Xuxu$s61Caqw+At`V|X{q|enur`F|9DEhKQ3YO&;^+lNp^~tYr|2anc z3Hn%JR7)z>EReKU{juxmN>%Htvm}rfL8aK~(|xlCx8fJkRy?p3cL>$wTYGfIsv_!O zNZbjp58cn+6u?J4OdjXmF31qVJyD^=nEF@;Al$?v%-VQTLmrQCYrdf($jv_ofRkL} zAJ{va`dFV|uZT0dvxIW))d*$Xy?{@`kN%Mk}5va}y@!_j}OoqzbieIgI zkDqI+9#4X1WUpNDNRcadqsY)27PJnzh1I)SbHVchi2k0UtxLm?LoUELU09f+ex((g z2H^>^S*XBjxX93&Jm!@={pPDYOtD@@9%@ZQ9&4?9@Nq?dme9u{5PwnMY`Mp&&XSqj zKMZFVT4T2-saThQB(;W#{p{qv9w(bY`Us_m=6p6&H0MG5D9!n;V~FMyjC-5} zpbAQ%>Ut0@x#s7Hxd}y{*Gm>$%H{(Z$hnhbP&L-u`xTe#@7aE?)7k z0Sl}=46+;~CL@j2PC&Z#DpXwhc!d>1fJ1lpI6|nXlsWAn`*-8e9}AvFI=ka?JPCTQ z`g^~|ATxI5D%OTL^C;A2bWDD?iXD@3=#E)>w!K8KHZ)#(A#+(zVG4l(zYmuN@TsVk zon%KyA1n^?OA-aOA0h#W@FuTd(i^y=EiGgPP)#9`e<^{X7J>-3)y$M!l0XfH3dOYg zD!@g3d8ySm$~;l)-ZA))maccw!y*}zYmgj6=el|wCe`Y-=BV{#f9kV6Qp^H>s?Yb( zqX|>25oe;XJrYSRKT+51hSJTz`&*?#9HJ|=u)`OjouJ8eLRo8f3Fx^il|#=|RsKeg zM5(dG+#oBzAiJFR0Fb|0jd|%VP3XN2@~-f7)U8yDSNv<(Le!Y-JVLodgbNwVgT6({ z_iE%~h4PF0RlG-q{55r$_tx7I3RhN6?~>3Ju?SmLdj`BTJp(9Ho}Ckx73ZH$6eVV2 z!*`+$Y^zVN0B3BgW0{0?aq5kJLnvz9eW8*7>LA;!W}|RSeP$j>%I5MYe}B2NrJT|> zdo!M0)J}!TL=sDbkmx`6yr`#mYlb>70n#Y|M;=Ypu}xtNIv7UD z5~+;>&SN70pJ;ssuAz4YdNbzruT8;j^u0}{bE_W^&i>etly^2&uMV&9eyUvH2B$YsGpx|PLe(Rd~qfC zDQTXcQs3IC=&NdarCL!rg%s|U+R`+%$bG1{Y9mK}%r~P>aen#LHsG6+;IR4S?+@Xj zkFE|UwEwgt(2hVm0__O2BhZdOI|A(pv?I`tKsy5M2(%;6jzBvC?Fh6Z(2hVm0__O2 zBhZdOI|A(pv?I`tKsy3$76H%sauKfC=3~v;S<{xIllU6v0`6|cLNJzf>#bj8GY4;~ zJ%@vZppYv4`Pl8~(63#~zR4N=->~TK(4U6=sp_U#`f~nfYC>T5Q@%|XAT8zVaDrH} zO3eMi2{!!8J`C#+p^g13I1`6^nIqOW*ea-Yfpo&QKvsp#8UFW={Y_%lhZ2SUT@L@> zpQqKHeYUWh5bfD#7yBkB?fL%Zy7ip)e9>voeU4ALJ=2osLfJ>GJMrHR%c(pY2yIh8 zmvK*_+U&+x98%NIwB%W`gDnEur)e|$CMWGPRA`&>%)%B?B~P>{WqFML)T_?l+0Z$g zdoFkwnQ$sWlvcXXYo+6aH!eF~cvZox5?)pE3P!t}XZ>J@QEW%-+>|2~%lJNKS*%8H zwkfrWmTia)QIbZpzm{aI_M8^swX1n!o8Oy$Y zaICo1{G@U39`)@MGUPO@I$;SwlI?T%JO!6?c^?IMuEV|4J1&eZT;0(aQ4HpAnOga^ z{6|Ku`kcHf77e=+pQ|OyjS=EM&f{F&WRTllZa*UmW0z zN0PEV+svL$mGH>TTamHg>TdG>h|aVdU%1qdhIh8UkK-2a*fFO=s557jYBr`z^^y<~ zzQM$x+EZQCV@%2P91L$fb(+8uPy_yhE4YE0Hz6&PIRp^sAx2}h>fBRn8s2hc<|<~E z^Px~oS2-x6o(*5pxH8`gewpC|80dE>jZp?E&Y0rz`n#raII8H!4DxECPCQ7$7W$?nEJq359h=75 znoUf;^Z5Y>w0**1#qREZx?j`&08VH^KOP^IZ%fkB&*i+5KqpROR72kufH1gnvpMPA93n#0N=4IY3gVsi}CA3 z|MfY_Q1IzUwo0|_fThq!;{R2r;O#YboLb^uYjHGM!aTEC>i(T|f97XaMlfR;`#KK? zwuT?VHz_Bn(}oe9!g2IGwyz(`&ckzdc9;SEx^S7b1z+q`#|;SSGxp@Y`V@ro!d%zk z7z3{v#V33bn}XTOn}gmKt}m(K_u5|+5-xu8bc%`J%C(h{Hh%jJQKd$N;I}_cU`hkO zVH~9l{ALvL-jCmp0W0KV|&ZFOI!W zzYeE<&AgO3|7`m8UT<)fy!}Jty;#(UaPSE(J^NN82s;(|xGz!}YiaJ&uCJ6eV1$C_ zZP&Ivm%EdT<%}$Wp*6vzJ%+&$GB+3ReOpbyN)wJ?Ij(Oz&QX%ZCr$q^k!WId(2pP= zXDqlX(T;yVdjU#+*oEKkn*EGg7QxXY%`IL7<=od_nr8hH&l|fkB2%8<=EvY)7!Fe@ zll4g(>ev?gL^pr=n>w$BkFCX@D-Q|oQk9j5(@1cr3{FJ?A$m|%*3u?C$599QQpFVY zizj7P0bkIE^TfPXAtp7>*(r3Fl>b%mD@r2|Q>>M65J>!e{kY27?nI=3c%cy2zqs$A zE0bTTtO>?zg8J4J>5+tWhd3N65l3HKtg5`{v){~vl2)H42PKU>)jlZco%v{D)Nw1h zzyS~Z%^SKahfYbtqg8w)(!UG)DyQs}S-X&XWa7idT^iPB>=oFqW^w$f{4?DAf9$F9 zGlSy~K8RCutV?Cb2kj->En#nRx^atLXn#CS{TTpzH#t@_Ne*1ICM`Ggr;ampul`K^ zJ(2#rburaJ>(7!sLiOh@G`pie4ryl*O zsuca%>ttJhZkn5h{!HoN=+D@?oX_=2kNuf>T&ntW5h=lAH(wZ}kzewIjIo7JCX z&=^;Lx_xBmPxO?4{uKQ$k^US-7;O6!$7x9+`g0VT-O-<&kjJY(XZKH4e-426>>s~A z+AU0fKKsCg{?muK9Pq0Y_yT1KNq65X7y*qhED$db$*ZjoOm?!XYP5V z)MoYPW@wD7Ka2lm=uaNz)V}d+DJ@8-{V5;}w*C|%E*7Fc1)MY?&pZq<*2-O3z~lcM zjg*weucmK;`f~^91?|s0?|by84vGW)89Bh#pLb@bp+E1g@94uWc+Atv@$Cnuh*NDRA`XYaSup zoc^5Q=6_D-_t>8Y52OFXKwI0@pN-K$UH$2|)X<+X@MnGY=QvuBQ2n`{+l6fXnT!Lq zL-gl*t~=QF=X~Vx>d(x6NJ&Y5u51kI&*q>P)SsU3di1C480G&QZR=0}httrXW4k;0 z^C+VM&FN3EoBs-(-=jZ!m(%}|gD=~x{aFT$arLL$JBI#5;m`W?r)X6o{W*#-*!mOS zK2(2>LbE&ivlH@o_2=xvQ`MgX8iM-sQAwEoeD=0Se{NO!Gyf=Ce>QwD4gJ|@T}OW| zL~YIL&x)>2{{3}+kN&)N9Q_|T@v_b8&&|*nSAP~SG4v-7{;W@bmePWR+Mfc#VCzpI zVuK;}rvT0F=+DY+{ra_YCFvp+N3{D1J&N96bD&o2kl|G_M`4Ub;~&_P}One?WiKXvhd{!FC>3DuvsP6Z6M z{wygD)t|S}?2i6Cj67cZ^HpD@q%?j#zapqV13@pSKZD-z=uiC-%KyQSI%xf-zo(%; zQ`UC$=WFg>ZccyBaPvQ>^LzB?+WqPOV3ym4^=D&rP*;EYEjILL4E$N2{W*>nBvgN{ z=guNqeQ^=9IS#cuv9bbgQioVXwTpOZ+b&5mEopfRrgbbHOvpD6rUpZ*km zl}LY%A`G_v#3P~la}-xckY^s}?>ixnSAWhv5Gg6?&jARN`}OA|?9mG9&u8@>{fR04 znSY3_KO5eYhW>2S(b1m^Wk*;u`m>^glYf7m-=ja%4x#^pS?-@nf3UEZ>3(uqKl^`N z-n(BuR-^XMaRD^2IXY3ITvOb-lQm*S?E|$fSPh{iHR@7cww6B&U}uzW%L1efMsTvRVR71<(8blUQn}JXF^6Ep4_b8WtOr zZj`Bm%rkX&)5GCNlzf@ucMP|#C#9S^e#>S3JG?E@ zlXrz|unebU^OKIfIi}emCR6+ta3MZN_+7yWWdd61;rAJX;Rz^Zg5Rni6LXfG{$03U zbDU6s~-G3vijH|!z#V- z;sTZllEqa*`fqq-$fYdrdXxN#*gOvM&N&yCp&u5^slz_<-BsA-2N-rbE_mI&P^J8X zI||ebD5S8P*z10H3uR({qjbCGBS6Y7*#A2HtvRk)-4C)fofMC>=W40^IXr%oFBl2Ul7w6B9u6jOnSAzlN`EH&-5gF(lsZ zT2|%g3@TpPyy<`a`pmzb~Vt&Gr8z_#JUTcJ+6em0kUFzR9lq z+IcDPpNhR2Z96zo>l}H*AgQSlGoO|{T!Qy`WPprXPs%Qj9Mg{@+^6a9jy0`jx@P+P ze~E!c(;tmfHF8dWICcYS`m1CYd5-bf0iLI(zm2?=m1FwjWjuk05Vc0aQOh|#>k89C z|7Y}>)aa)ZuX_ydzS5g16~DaY_me!s*ZHKr1m?^4et!ZZ=B$T*qxT847XMeaa(xA@ zT;JW!eiJBNE9@_N;vtL#In;-bnq8&v&Ig;*uZ5i0=8(U`xic~ideG}|C*GOA$E>;q zv%fpw7 zQ95gRKq0WD&ns^s+b?kF@S;vUWi77}?Sw;zo9bc{@l(BTab(C}$rY5cn;b`4(htuM zuQ~RGd{C{=Z-lsfTK!U>RuAN!8!tblq59-T)P9na0rYGeQ8er?+$&Z%tShIDnEK{5 z=JSfot21X)8BfjesJZ%kNO)n*)jv#+hf(PatuO!R2b6tSQ}vHn!}y=BcO|YV`LDyf z)Dp?dSmo2}Z&!V)BW0~r-^=q_x4!3ZYu)-D!%A0cw%`7(BOgce(=Y+!C?6ZrvGKfE zZRcmUVUUtXYt?ohGG}ACj`Z#Q>VflKUYkcF6}^BA^E<*+Hx+$TwOt+@gJEke?p?>| zzgX}C=QAVDDQF<2+M-@N@~8W{+x-P49zluTh-eR+%6|*SkC0>U$;V`gz~;r);xbF~ z_TMuYh1{gnUs&%8h_!j-FE-?VDolQ4u;o8Hsr;l=TXc!Q(0$!)MSheBm;WRjr6WfP z!&{2+l(_6LNLl_yye8|Be``bjC&T1N23!8KlFCm?wMD0C`SFAHM~MXTKjD$TzP03^ z$4#N8{%>W-|3sMl$Y9HVW>Wb{skZ1KC_eQc+5q`cB3%9xZeKI<$GA*q%HPwF{~uxU zBZDpf8A;_QrP`v7(ha(=3vGb>C=o9IRkC>|PdP}nom#E^x0>veKVr!Lc$oaiV9S4c zQu#>dcR4Wu6bao77jlaKt~kj4OLdZXlGaI(X&mdCwCUB zUkvl5rT*V(p;9v=tbTuFgw)+gu(tb;_-QJdixRHX!^X0aE3KEfAc~QuG*&&TxYXvP z|1K^k-#=z@a+Bg@8Vrf%>b>gOq6GSG6 zOHHiMTKZ2k2bhD$$bZm5$}Zi4*O+QVd$3rU{*oCUMfKQu&8{x*dwO`kMe+U#bV2j} z#Gp_VnGw8qSG>QX#?HGzx2fo2lyFfj7=N1nWDFRN7Q$R+v6>w+fM%KG#IqyRzu*C^ zguP-0Fs=?iHrOeT1_=8q9lxhhjWDlLAhb)|ROhqU=d=^^=p&{Q^@8I9_56Kvry+Kz z3~dNzL_-vBLG39zS#{z=WDv7XH5-EJENTIk^vo{*(v6vhTZn1T_Oy=Fuw^xC8+usl zqgXr5W$k)Y6yjeoBUqb=j9~2r8D_hmC#?O=!&<@kL0U(^is(o*^BoV#6(W`PdIv9A zhqu=pW6=HMp^*0a+h$ICU3N++D7w9dA|pWgShd&9GU$|{gxhh_Y_AUquWql?J*?^W z`p2dYYoDGR%9?Jke<34S)8oN2!rGlE;j;E8Yp<<)CTg#>4JYBq2SeKH&P^OpUKL(R%fp&(uVY-+u0%y4tm*a|iHuOC&&BQRev+`ZpNF+SS$n<6 zsds35-Oo`+8=bH34{5LcHg?+U+!I1U(d~5xG6IyH_mcLy`mb!S5|qfef4vS8Hf#Mo ztm*c;x5#1bt%^|AbbGyuj9~4?GGXl@VXYP=T-Me^dnNH#-sLJwbN)(_@~84G+bqgo z#!Zx2l#l%{yYlPveAedbPvEcl4ARNHTrKK8!&LD5m8blqYo#X+2-PBHgctOMveNxX zu(tc|y{X`bqJ*nOG)Qz8kJVnjcfL`L61F~9-)D02fZ}8amy@RBLOEeZaB_m;)Orv56qLKT)`5C@u}{5r8SDDEEH1y-Wbq-z z;x#bJdRj3soJD2?i*uCq-cqqR3v`=`HubPrF#ZIO%ZODZf)|^3V4)sW()@69a5pAf5jCZ2Y9$lDmbC13hdM zj34Gv?CQEst*P0mwAT|wiTr_241fERyF%J)=k=WSI`QaGpmcj3i;MtD&yP6oYAWi1 z5{8jV++JM_wK?9yhHkI>yE|;W6AxuWx7QoU2sQ>N-})P2;|7#)*$B25Hcq#mB}%2e z)?&|x`Ud;gE{0RP%bg+ZHM*Mv)PqNb0;St)1~Rg}R1lf-uBM_YlyHGk{&r~pI^Iy5 znRl3M==S<)U5AaW!`aa7wS{71fMVkSVdJwSO*Yy`WZ*_Xj@waOE zsTtSb`tX(zf2(ONG{48+`pfU|w>se*;Fj^Xmdh6=!~LyX$iECrJd-(yRa#yD@W}r< z7GVSa=FfNd{mq|OQ+_VkwuryEYEoizB?hne3U8XJ5{$F36SpJari$iB_=J_V#8RlCb z^Z2&l49+|C^~_{TIg{;%nT_#!ZB#bca3%{#V%5t#;0w(;3HEw}q@A-M9bniU!h9XH8O0AFPie{8mFQ*g*PnU3FC{H#62NWtyTitr>t5oZI zcbd1ph*RG~NwmYR#r;jSzUx;es&AhbsjvU2MD@Ksz9sN{05KLclGA=Jo+q_PeIMgJ zXR|)LLzG&Luou> ztls+kJ5@^K@xjf^;K!o@c+BBI+)DZ}_;GTf@%R*5Tn#+>%gg%p){(U8E*^*fz#^u8 z^dGD;Xgs#p89aD&VxN*OdJfDTVcwaCf4lwVdpR}BhsVfwfye!H%v%YM3oSCI@i-hC zjto2wepfNRKSu!Nbp!seCm4ZbSi|4$Bk0TkH=Er zar5uU*h+Z3_!!yLc)SJ<4Lo|k!)Nu@E*v#nJieR5WD}3xv^vqx`vya0_Smo|GdWF8n9?BK>AB+f63-Y?U52LC7K&+Y*1a zyY!O;zYc6`6Tc_#_a%JJQ$%zQ7r$E^{PI4*bB*5wE};s3_hE^MYe|CNCqLrG#jloq z61iObF4w(O<5x-^{P-O&rL@v<2dsYhzbe7v)*v2GW8=AE3~pRJPiCDSJda=sGH5&>k-30RAGecIp?EI- zNfG=L;Q8ofV8w)QU0OIZVbKydAq>yQZpL$s=StB^cDvztLD9kU;~Lz!c<#+QJ$RNd z#l`a)@s)jec9K$|covhzKZkz)bCO5YRUfI_QhxCV22PgAV?TeZxZSZn1~(hnMTU3b z|4ACVzvtUWOcCFt;n1_&{0<3<>A~v9{w0^!&fm~_r%7L=F zEN|$A6a%Z*Qw*6atwKI#^O^@@E!AyaY0cKkAbqFO`utHliIG_p#!I4@fXJHd z`WzzuN5@@idz=MuRV9{R;xm{H$vZ1Rs7z%#nk*qxnVD&XoeB1ZeDC*^$`oa$^w!T! z+ZA@5^7yd-YVZKQMf?hDSKflT(%3%r!_?mRd$?99ZC~4Y&{%V^VNdl&RQ}H!+uJWb z?j0KCXGW}2?}?0H5^Gd`4h4q%&dA`j|F?OD{8xs_|FtXs zZb{`wM#w+7lae1Wp#4!|jmocG7hC^%>udieB{Sa$9CSsP{Qq_3FHI^xGD7}UU6lO5 z74oCR8kL_DNTdCE>ysZ*XQ%&<4wHYSEB~%Zha z`xdKij{Kv-0iSjBmt<%v zv&v5cEJ=d)>CyiTKAo5TMI1zPM*qNn`RR9K04Qhlr$6MU|8IKeIio)SD}!Eqs&Y#I z@PGU1UxXFM-0?qSnVoGkYZBMSD!g#qXZ|3tv#I6hC`pGk%P8b&Q_{x7+bH{|2l z753H7m-4Dm1<~uZXBW4Yo5}b5$IksKlTH5fKLr0%`MibrU&^X=yz3M_g^gPUr`sHD zJ(gFR|9pr4Zf5dl4R-Dy*=0=rD;UsR%I7V^|FsOd+x#y&+2&&*I)iG71+VZ*^B>cm zB_cv*a!-f<>zQowznTHJqL$--`82Yp@jt5C=DPX;`)cvWywdzn(4Jx3ddf^5Btcy2 z-CayJ`JeY3^`FmM2LGY7VK)EcIqwzye*&kQs;lmt{M!82YtJrj{UjN*SoeHo=l+z* zCjZup)PFv28U8PPn^kN44}Zqy;}XW(M3P^nPiRK-9sXCC$)CZrtK4re+2lX=JoTT? zTZaD)v4r99zbSj4aNYAw`|8-~ywd!~v}YN&_A`@vI{a_TWRw3}>!|-(@}I!#kqK|T zbs*zKVZ*p%f0LJg?}O~hPn?-u`9E&SuKYZX8d=DHYL@)Je{Xj6KlN#L<)^%yUHNI( zWmmrN)$GcDJtVvG7oU_}`Hmd*ve2JHIO=3keiH_2laxnjQXT51`*Zt!+r}f|r#!Vi zU;ozR`p{hY>;92l`9iwnN%XO~`sXH^)}%NdZNi0!Eb4z0fq-nvR~(aFdGUs`;Q!Of z+0}o>_1Trb>8$L^&%HCd@<(2tVR=NntXCJIFqS$lN@SFcg$8eY9l_J!hD~*7>Na!= zqt>BR41||rtYCNey6VFoU0x|K?%AQSGk@gl%bpX;iz9LfCbm0vRb?-JgJnsjgGuEi zum}>Yt`u-OTF`j|B19KK0Qa*~`F*Y##)GCR5=m ztY6TdCad7D%x(T7_qfF3p}q5?!s>;2rsR@Egt)bp+#?t6-CTEKx+=M3i7;-}$~|)7 z-pw^ZYOtq4jF+n`g1#@8#|XF?UgcKm3_$$1gWrAV>5(_mnHXpybgOs z=hArXCHH>3dSh;2;D7vi*-cFgyNFdp*1IOUGtc{vHXAWscuOZrRF0 z|M$2*yYdq+$*%mY!=-#-ru}!yHQAM)v2S+e$0`3KWBy0Z&#wLt)cBim{r{@WuKt~l z$gcd<{jw{6FX!Xcbs5WFq{h#T%YSxlcJ;ri#?OrFA1;dnnals`h1v0M9m4X#v73{o zRL1Y(y|OFciA$PU)IaUa?8@&H%dY(AFJ)JL5T{TVhUA!8T+;2|67q`3O+O<~n!cRJw9Bqk z1P|qg?<43iqJAa8e)Rwc-9sA+bw0EdUOjN$N^l;bv^4V z_zdREBLtr>wRMhL=d*wb$Cj+#O!$YsKKS_hx}88&zG_s5kFpA8Q~nyWuIGmBq;4$>ZI+*)U#%B}UMin(2U zMru9r<8vcC7=_QCEMUShg_B(~AwI=T$R3{%e;6bu_YvRRg=e?A zcinuRK=l2C+!j*Goh1FBK~?0Sk{nd1wqG$oI7oU9L-hDq$X>15?nC)b$Ft9DkmqZR zMET2^e^ToCH)8&QspntuHuCS3dj2Pw|F@?D{Cnp=30t+yy5TH3zIfu%JinLlwQ(>T<*1L7LuWIimNS_~rH14(ZT?atHTU@jyK1d(~0vjJ-KK1Cl4) z%nRF+MyxCTrXO_bg$s5DH18621$^WhOS~w=9-7{^DR28G8eAU+>XYGHo*U!wV$2}jE0=K#E~6y)dU-P7bpe=o2! zQCBlmxywnKm7WjrB9)%w%o}H|P$E6i_z<1MHZ~pjZX2M8TTx|fc=@zsKml}g-VYT5xWv8e^2}^5k-F>c zyux3)3E)dKWk{V~IgSKaxV)ow8Op4G^+-ZiIqzxBNBs0hwg~;T9R4?HVfyp`(h~T% z{GZUm^#8YU%kqC)O7v6o=S=^1SLvDXe`|D?6*~q0_aObC({{S=;y|kddw3n;x#Hxc z?g*#IpW!rYjP3}_f#qZbXM5_d!`4@TlxfhEIc;MsbLuKb% zuD$x7t@)WL^AmeWidwVx4CCi#HET$nAMt+|)nTc*DP-kV`*-vB7=H)&v-qBG*+S2& zSC)qQ=V*!7v53=j~bgH_-QCJS1V{=yD zf2ve{&mLpfcTq@v>!(;>3g^oni&Jt%Cx#Das8XCfCrUVSG`Zp8_o~T=nbjhi37ttA zG<3Wl?|GsiTo~*RE`OOl*Yi~ja*3kIm0WS)*V;pzz*O|R%PzVdl)ryW8Oi1G29>tJ ze6*pbr@nu1K_F0H4(Fr4-sP$9JXuun%a`u_B8h$aU28MYqq!QtUbuWYn~%mh0iYdJ z^=&)2h3gxEkeyNA$Fe=G1@YXJUDB2BxKRB}vHcRQH-t84!CY*yIZMVB^j&PG0mfWu zsGtpr>(@fr#7B%Jqs^E7+EB(e1 z60{!wg&FYw2~P&P91F~U0{(ks!2ez3{~4ISKLP)d4ER5V{Qr7q68_WqUR9ZT|5p|X zmGYy%ILaR_SG@tB&9!>~9y>iC+7vJ0-peYj^;KT2SNgsS`8@*sLff<37iqW{|F18- z{Xa_k<^Mi_yq{idtn1D@k=B+T+nX-{?+<|NG8<6Qu1ijFxiU!pDcPD<_NH z{B3?Qew~jOOe&tvWZ2gcO0_zlIlgCJtoKW?iQ|eVNC}n2Du9zYIaV`H6{zjr8Hyr< zgihhxAMn6`RZ&NsSTm`37Ku!Z!9bfCrxec?;`P=on6o<1kbj=a53}vks8eaM=_;*Y z?xf;+q@6V}hJ|vIu9m0fu)^5HNyTGWj^=-yTsFmf6wIw#xV+FVKlZbxro6m$aeB5Y zH}SxMF1Zo;c|-qd+{W^T78tkjykYyJ{SHCDnVz9S<|DdW=5_!%+^+G&dVr};+_8$m4Av2S3@Y9p`d6{!7_73;3m*_2y^yr_V z{W{|L8csQM#ZOE>`Fu_By0(W`)%OpS4G7}!bw?|vh?rNO&Qd%Ydaj>`>~W#OD6LsH zKXHA{l~?i%N8fX?p=#7yr5^`2pM*4dbM%SFxw~i1AItv@J0=q0>D31S60-jSNX4uZ z4h9jtNf8}7fS#^>X3b_|fSF+$qcv*3Mb!F^KD(5AabH}C%Z%HI^&Xbb`2h2X1A92x zy9{6|=MU9Mqg6owz5FNazvz-|6*jr)Hffy6ioRz=~D8Y*CO>zMDRDfzF#+L z3Hg3rD^YzlEmGgr*a;af-)3pm=j{)n{TXLaMdT=UyAO|~eL*jXTKC9OzCOL`1`MWV zSKsegWNWT}n)Vn@oneWUN*m8>q5}hu-TfSeG)0}DRgSkQ;W+RftEO`WZ;IEP#ZT;1 z+_)}2T97}FR=5*fW&B_LQm}HTSGgDA{%(Tsd&=>U@*R~rZ}&I8j>u(*Bfqspqkpjd$vf*Ee{ymk4@!C@_{YQO5|2qh*RwvbK6iDs zF@N%>$AbQ32Z@E#p*ZE|UlThNK7CKszgxCfBLD94j#RN+`;(VlmZ-jU)2h$#7c=rF z1NJ@Tu72VPjxl|{g(#b<4u9KH< z>Pa4~lW$dT<7q59Pu9sZv1iF(aJEkFf3YWdiB3M#E9EMkeB8GtP@M}qD!$Jv@DM50 z$yHuX;yU?r1X^8ALZ<9UBCOouW49>cak88_7bZqcf7ip%YnrQCZdt{8^*6S;`uau3 zTz$5yr$%kA-l4h5lOVmAt1)aGEN7m^#i7LJ%9(#eIaMe`A!Di#=TxE8-USi2XQJDG zEx2(@lh(sIKNu--HvUfs36m<%V5ZDR#1=p?#ZkYXj&#!q67#(rano!Kd+~HPtx&h# z$yc~(r8=!EV6*Fp>$Ke~-L%0vt^P-cUq_|xE^+hC*7*)P*-cxb({3K+rmfOx6Ahl1 zXgNB%C^@P%bA?;4tyfR~;ilP2^`tAW1Z-soD*us%Avkl9yrG*D%Lq0?J`E;-9KyX# zh4TJDS>rk~$3rsG1#p}2kub|PKsE!_+qr3lTB~oe-)co;*+Oeda zW3qY+QZ=+ri}ZB!4c2M5V+qDC8`o(gcXHE8b=tCX-LyiTcB#?$wvs%ejF!~vG(x^x zcD8Pq6Y;*7UGHR_Hhrbj2-S6isfL5p)(TS7cJ8#-Y{qM15Hr4zHoI79@y2^}gxx*s4Y17-JB z9b2kczO~l{^e=P*>=QH7jSbCw-xyEkI5Sh9LNo73&(Ebin3+q^lA)R3mSs!Lh8R3% zuS}Hv%b(zb*|cRGX7*bXWv?4zu+o{@&g@GPW&ar6%B3y>B6~hsHI(<^9%k6*NIjY; z`?azjW{b*h%j_c(Wp6msWG1e&TZyv2)7#8GSZ9ym*uzlXFYIMzpRBW2B+9-U2U-_* zoqckm?AH{V*_Y_-^@*|{`X94ZSLy6|iBwk|gJc6qTTCFAC(8aToFJEXnsa6!oGAO@ zTbSA7I{U0d*^g&G3bO@JHf;-FvihKx^UpB^hslT_hF}g>^#CoiIPtZe{th?ggrVd_ z+!Qfxa8sUvR|q$S2GR@{y6c+}+Rc2_e zQMRzg%ek63m1CQ9@O+%HDcQC<$)mX~FcD(0J)i}JeQk?gnrtan|*-e`HMjnq{Gi`fU>5Vw|~(Mqh2GTP#@ z$||MDhK#JFyr!=AKVvnp0=TixpT7Ya83(fbi`7mkmXTB_T<{IZVSJ#OiD6MxeicC) zP^c*LTCe>2Yg6M^eS6ojw5)SUp7pr31$mfa-HSYYTrZW7y{#|BV-R00#Pu)k^S~BZ zB{bFb9gx5)*3Ji%tjd~=(Nle0Y6~sYUP^=^-62ap^5MU{#&z`#uJPq5^g z6)f+74LwEGGo+F~$SoPPe)#2ARG_jV!!T9t8x~TZ%d1|!r@y)t{-Je1*6%EUI9(5b5~*;JZRG{%s%*ybYp$;nvcV<(VBRfAAjkDU# zp7i7hZaqEO?hmOQ6;+NN73J7pru#Vbw0CDv_VsLM{t`)SAGB|_!KuOGiv#oZ>XmU) z3M`t`(%FWu0;bCGYKPEV607NlT_8LDiwcjICdl+)GF`<7F{_?Nt=hA*+l>c$A}OF6 zoPB{%1qsEi)8LM?hEfJ{OY??p!QV=~v%GRq9*wYipQ3kN<5oQ7Y6MTYk{#+CCBY9? zb4aVy`i8@=;h}m1Jel$L!v4AA??ly1jtA}KFSYi@P*88Zw~YuI@n~V@?G2i`y}u)Z zVeS3jPoM}XwKs?bHx8nWVoIaVp#z2*uy==ZJ=NZE-QICudvC&Ku4FSqTlnfCZX?#a zTZ;6h9_jUYa30lbhLuk^IHbf%uewHTGIAI=<^uu4$3SZB2O01+K>Av~?w&<|1|T%=Kf7kZ&+Jdb z+R^4m&I?Hgni(9@Q_?4xGE<)}p<5BaCGGl)Gp&DaVOYBa>u<)C&%mfk`E67F*Mz3L z;CKyyHr%t6J@XpIVExVX=VD!dN~Xoce9Atr@!;BF3?vvon`xBm5wgz`kInjpu>(9ZX`d#p2&LLd!`o*=#Lt52l79OP zO@|e;eIEF4?)3GW?8oDH=x~_Q{MHE{--TU-z|{0;GWBOPO+6wO?g7GR?|=up-FE__ zyM?EGLMHn3KH})6KFOxn(D6`S-ZO{8o>;pH(W8vVpTDKdis8%r@MV}Tk%!Fis2`Xy z9{bW>1%^Qzj`aK2ekrqJ;PES_(&0>`JsvGU3_Uf~FzSCDk%=7Dzh5TxFMKyqBc$fv z4yJ!Qu)hdl_Gai4dZF(q<#=lIQP9-Ac?d`9u-;saB}~BP_U5qpKr{YJSBdUq;=jDb zNvwb3`CY;K19gBbol$!n7S~LzN#bA^eOFK@6KQ8=@=f1F+LLL2{*hyiF3^Z~pD=u02@mBa zYp-VP!4m8*V*jx1LGmD!D3ECb&OTbe39|v2;S<&T*!q*Kz2MFb47S(E(AmCm-g$)G zIv<87xPIJum9|Io`5J1D?2)3W?a`||vM$WN|IWay=|5#QpFD$837TxZUXTR8qJaOo z_MsxR-&09re3Yd>jE~oFZk;3i6itoawq!93zi-Q>M%SKarhl(;vrcOG1+3|w*c2OP zDHML0wdY=`^Al{(Df=d2C?$VK?F^{5t~*93d zS4BUg{!sXR;^8PY|0d3*aP)_R8-!9$@KZE3emCj<9+;1uq0IDs%g0(;iX`2Mqw=Vmy*U#CW;u<<=JeL7q7(>y2%^=U@v@>6R4akAE@!*e*_ zP&BnZO<0&fpZ?(XLUVjid%kgw-dfQ-bUuB`ecQ{7CC_MGpOe*+Nt6 z^ZNfzV1J%_En9uwl|8~}%EaTDum7)7p%$M$rLE78(TrtM|Kd3!dZ7MH)-QKRhly~1 z=(Z=r*vW8xe%i}vfD+D6&%cJ5=M4Gjnms>za9>Wq{mGD@%U;SFpRsS{ke~lB!j-BL zhqu?Q^`ZQvG@h=~_UBx#n&oJIu4roebIyhd#?yE3a+}Zp$)x{H^sTQYHA3O|-5YMi zQ^Jq0R&YLdliJ^z6Msa})cF0vWi;qVz#r+R=Av2nBZsCQN-({VI}%KS)3)D>ioC8s z(xx*xxb~?qg-^TwLo=;^TQyh*#*Z}TgNruGQ2qg-5zX}F&$Rx|T=NYW#&*ADBdAGN{k96QI`Kx#Vih-u^uRrp9DYpJ%1-Q*J}@YD_d)3uaJX zp*i#KW_ymVd|U7>%S1gQgZfI%`rg|jAm2l)l4xiK^~KHl9@slj-?C1*m2a?F-&=17 z`olbW&^g3&vRU7eR1UAc9K9g7c+NKK`-;0zy!Ab!X5KmL?@P@3-rXk9e*bzjxALtr z>-&_-;g#=G6-CaOe1+moYJ0Y9?Ld8d;QWhR>WgQlxP%U+SH8FXK4zBo%;VYqR1m1| z=jW5OpILYNbvpv>2(%;6jzBvC?Fh6Z(2hVm0__O2BhZdOI|A(pv?I`tKsy3!8UcLl z3?DB}{tZ^1nsy=A5%4NxDc6yI;c~CscsJ982$L%P6;B)VU*z_s+|oa8eVb+QfBdyM zr{9NL^=*7UWDqvD{CB>^p#K2(B<7a>sq5J+1E2r>o^$$xxTW64XVXdcP0sY^8t#&? z>956i#&e6$?{bo@*8js86wWREpL*CNfq!qFI+I)ayK#}j#^+_eo1a_y?|fjB1poWq zXy4?leJdQ50sYwPIj8?$v;UrkqwsT#&jma^&Bp%=?!(C~{*_$xwCQ)}R{Gr1e`&nU zGVtI1diy44?Rz6PYTNv;J;T1q8U3@T*(AaLA9o<+mj0Gpga2hXE;+~i_vSWEyM0gO8#1}Y=fnv%N#GOV z9=qJqk6&Yx1pT}^`zB}lv+=DqNzgyU5hiE!YaTG@zsXHZxy9!P(?2g>ZC92v{=YJ!|r2_sI-&M#hK40HqlLY;5_-apX=^w;1HiRVTpP&2r-6LPxEQ9_Ao$bn+ zZC~^IF<`IIcbqfce|0CY?a$lsY1a>L5T?C(Y$M1uYoSM=gWwvjE zuXd|_=}#=D0mkPV`qk7G%)vLMti@O86l;l|4@I$Uuhidzy!w=uJWEZZ|M_rx1W0D| zQ&^G1yUP3hdAjL6!fxUf=qxu$u((6uxTTWJUUT9y(6_NE1yNGA z*B1(HQ=Xe;mdf@yern6eBd?I!_F%1>a;k5?tkkXHw9opt=oIUl7Lw;fGsxIweop1N z((e6^Je$a$A`gYRbmT8~o^*A7l@<$Ipg_FDbG{4+wz>QUH?vWMTV{6ey8%vJkTl%J){>0= z?>~4)gWz2&@;kn~ZSlMG;I_r@Hf@aGVF$G>d|y7WZSh;w#`rxm+P3h0>VUSzZ|63~ z?{WLLEqwpJU)$pM$9>xtzkS;nzf<>VTljvtciZB3_cq4w_`TW|zDvv67QfrHF@A^b z*|zX~d5^ZmZ&4fL_sref7QRpQXH`cIY zYNyA3$72mX*{1Lu*Y_58owQ+8r(SFNZok#k$OzQ2Cny7hHEymjlF$~~d2*nSHKwr+jn9%|kC_8Qx|_2qL@ zYAd$i+kB^>73=$jo4i}GzIZF!vz0fru6#Q`(Yp2Z;K@6!*nZRa+IuV3_c8a-wqkuV z4sPB0HodQP>zmJ=@2!aEm#sWL>~Lu7%6E7x(*C%Z8P;5QA2FKN2np>gKOA5Uu9j$?~JKk_x*}1t?1LZt;x4ep#f7{@R@w%=}g8x z{C?Pk&t3PinzwmE3z*9v8$^dZqOY3%YnbEOdN$Y<`)YyH*~XcwDZ_uW39+@$D+eq4Bu>FtVI) zy?&rd)_5#^P)Xv)5ua?;oKEZ;ne#{U$K0Mx-Vdow%k4-#==<;hCkJ+@8 zZhx6|3|Y>%7M`GzH6Ak#P?Grj%ZpSaY4M9#(8Z%t==kvX{%P2*8L zQOTk8V`nj(`PQ#dm8|i2>>MSDACJp#vnBk2vbuPDsYUnnmxJcnxnGgTCLT}f@@pE8 z9}ZS>XgsDckPH2|f=AUsJdMW|@=|lKzZ^!tTlC{37Ig9GCv<%Jaix=cXL)Smv6(Kv zrtw%XM9HD?=v+eq^Q|w~lrA2(UCiVl9(8-F^h#^-wW@%&rwe$C0v`Q%=|nsCUGmt( zW0Eevrt!Fs06=h!$CyXSa=z93G?i@IQ~J{(cszHZO0TpIWkFXz%7l&&kG_ugwuwA8 z@#vzs5Jd;xSj3U(Tf@?f3n@pDTty{Evr1fLtY9)yuk4|zz1tmO?1zr8oxig!;lnKG>c^cL zK+pKH>uYxIE99|>$N9San#QAqHs8hLo0rIPzI8AKb@8}GYr0=Q_Bhs-a1IN)c+3$ir0ZI3l z>xGUFk7;_)sk8>mV-t^4bon)nN00M7coa`pc)XyeH5!jaG$$c=bYS#EEM()|ijKzP zBi`bHr@wr;kDYsgJT~!oNS9yJcx+A^=k}M_FtVI)J*?d{jmNsZlqCNCvhh{6gas_< z_Ln@NH0ZkIUn> zgrl^+>;7_q(DC6hNPD@6$I4?9k9~FdHH}BD4wPy<7LTHU`PM~Od+<22kCNN3A62wI z(&9IswX7mquHjt`IRrrEhi%VQId^K|(&jmPwTlpGq5hf2wEzSUKmH;uC00*_j?IUao|pbql{9$BVZ<58dKBF&)L zsG!8-rf|&-{@5>#cr7v7A$D8EV>_jwd}`y7qbzTSz$27NUKZ`RQBNZ)a7)bmc<2e; z!av0XE#})_MWES$$CCH-+$-5_6_2^1d}`y-rL_T%ZB?krS+wVk>$yscxg};i&c2~r zIFSlUehg#vn8wR5QF`uI*=-e%2BLgw<8e*QbAlgFFvGKGpMJv46XT^(X>N%bk0$IF zw`javqDYy<W>7D4*JR^fUUWLyK@c9uV><@MyW3lD+5K zJf0PNBo&l+RAlv-@aRUQW8Q2*c3Z_GizuJkc
?GXIP@Gdnui*}?APZoHLr|H)M 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 Dcm#4H$)cUKRFyn6&n|9435ybw%q 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

T`F08_aG}xDNe*} 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�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/IRIS_FODIS/Source/OSIF/include/api/DllDecl.h b/IRIS_FODIS/Source/OSIF/include/api/DllDecl.h new file mode 100644 index 0000000..d141060 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/SeaBreezeWrapper.h b/IRIS_FODIS/Source/OSIF/include/api/SeaBreezeWrapper.h new file mode 100644 index 0000000..da6b94c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h new file mode 100644 index 0000000..4964256 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h new file mode 100644 index 0000000..23a106a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h new file mode 100644 index 0000000..af1d536 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DeviceAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/DeviceAdapter.h new file mode 100644 index 0000000..7931024 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h new file mode 100644 index 0000000..f64e321 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h new file mode 100644 index 0000000..41ad782 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h new file mode 100644 index 0000000..6bdc267 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureFamilies.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/FeatureFamilies.h new file mode 100644 index 0000000..cd18080 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h new file mode 100644 index 0000000..e6180c1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h new file mode 100644 index 0000000..f55ffd4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h new file mode 100644 index 0000000..33b046d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h new file mode 100644 index 0000000..4f6eb53 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h new file mode 100644 index 0000000..7cba13f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h new file mode 100644 index 0000000..8e0dbd4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h new file mode 100644 index 0000000..c4e841f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h new file mode 100644 index 0000000..d81040f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h new file mode 100644 index 0000000..f0af007 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h new file mode 100644 index 0000000..f5abf42 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h new file mode 100644 index 0000000..eb8d2c8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h new file mode 100644 index 0000000..cf3a65d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h new file mode 100644 index 0000000..2ec42b4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h new file mode 100644 index 0000000..6ed2264 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h new file mode 100644 index 0000000..54d208b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h new file mode 100644 index 0000000..e5bd4a0 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h new file mode 100644 index 0000000..7ff3fd0 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h b/IRIS_FODIS/Source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h new file mode 100644 index 0000000..46813e1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/ByteVector.h b/IRIS_FODIS/Source/OSIF/include/common/ByteVector.h new file mode 100644 index 0000000..8c168ca --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/Data.h b/IRIS_FODIS/Source/OSIF/include/common/Data.h new file mode 100644 index 0000000..ed23c67 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/DoubleVector.h b/IRIS_FODIS/Source/OSIF/include/common/DoubleVector.h new file mode 100644 index 0000000..50c6d35 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/FloatVector.h b/IRIS_FODIS/Source/OSIF/include/common/FloatVector.h new file mode 100644 index 0000000..69b6cb9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/Log.h b/IRIS_FODIS/Source/OSIF/include/common/Log.h new file mode 100644 index 0000000..242f8aa --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/SeaBreeze.h b/IRIS_FODIS/Source/OSIF/include/common/SeaBreeze.h new file mode 100644 index 0000000..aaa1c5e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/U32Vector.h b/IRIS_FODIS/Source/OSIF/include/common/U32Vector.h new file mode 100644 index 0000000..93785b4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/UShortVector.h b/IRIS_FODIS/Source/OSIF/include/common/UShortVector.h new file mode 100644 index 0000000..7606375 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/UnitDescriptor.h b/IRIS_FODIS/Source/OSIF/include/common/UnitDescriptor.h new file mode 100644 index 0000000..3a5c737 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/Bus.h b/IRIS_FODIS/Source/OSIF/include/common/buses/Bus.h new file mode 100644 index 0000000..491604c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/BusFamilies.h b/IRIS_FODIS/Source/OSIF/include/common/buses/BusFamilies.h new file mode 100644 index 0000000..7b77043 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/BusFamily.h b/IRIS_FODIS/Source/OSIF/include/common/buses/BusFamily.h new file mode 100644 index 0000000..d1dbb97 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocationProberInterface.h b/IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocationProberInterface.h new file mode 100644 index 0000000..3cf63e1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocatorInterface.h b/IRIS_FODIS/Source/OSIF/include/common/buses/DeviceLocatorInterface.h new file mode 100644 index 0000000..caccd5f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/TransferHelper.h b/IRIS_FODIS/Source/OSIF/include/common/buses/TransferHelper.h new file mode 100644 index 0000000..8d7988e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h b/IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h new file mode 100644 index 0000000..d07309d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h b/IRIS_FODIS/Source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h new file mode 100644 index 0000000..056fc90 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h b/IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h new file mode 100644 index 0000000..47dee40 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h new file mode 100644 index 0000000..d7e4b69 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h b/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h new file mode 100644 index 0000000..1c8c20c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232Interface.h b/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232Interface.h new file mode 100644 index 0000000..fad0b1e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232TransferHelper.h b/IRIS_FODIS/Source/OSIF/include/common/buses/rs232/RS232TransferHelper.h new file mode 100644 index 0000000..e912f95 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBDeviceLocator.h b/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBDeviceLocator.h new file mode 100644 index 0000000..ea9f1d2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBInterface.h b/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBInterface.h new file mode 100644 index 0000000..0717e9f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/common/buses/usb/USBTransferHelper.h new file mode 100644 index 0000000..ffd0945 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/devices/Device.h b/IRIS_FODIS/Source/OSIF/include/common/devices/Device.h new file mode 100644 index 0000000..2c23100 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusConnectException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusConnectException.h new file mode 100644 index 0000000..134b32e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusException.h new file mode 100644 index 0000000..960ed53 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusTransferException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/BusTransferException.h new file mode 100644 index 0000000..a4be719 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureControlException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureControlException.h new file mode 100644 index 0000000..21b3014 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureException.h new file mode 100644 index 0000000..b0163d4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h new file mode 100644 index 0000000..654af22 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/IllegalArgumentException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/IllegalArgumentException.h new file mode 100644 index 0000000..aa457b5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/NumberFormatException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/NumberFormatException.h new file mode 100644 index 0000000..0489345 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h new file mode 100644 index 0000000..e593994 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolException.h new file mode 100644 index 0000000..34dcb97 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolFormatException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolFormatException.h new file mode 100644 index 0000000..6067315 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolTransactionException.h b/IRIS_FODIS/Source/OSIF/include/common/exceptions/ProtocolTransactionException.h new file mode 100644 index 0000000..edde640 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/features/Feature.h b/IRIS_FODIS/Source/OSIF/include/common/features/Feature.h new file mode 100644 index 0000000..ad6163c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/features/FeatureFamily.h b/IRIS_FODIS/Source/OSIF/include/common/features/FeatureFamily.h new file mode 100644 index 0000000..66d814e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/features/FeatureImpl.h b/IRIS_FODIS/Source/OSIF/include/common/features/FeatureImpl.h new file mode 100644 index 0000000..8c9349a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/globals.h b/IRIS_FODIS/Source/OSIF/include/common/globals.h new file mode 100644 index 0000000..6195a3d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/Exchange.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/Exchange.h new file mode 100644 index 0000000..785a62c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/Protocol.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/Protocol.h new file mode 100644 index 0000000..a86fc53 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolFamily.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolFamily.h new file mode 100644 index 0000000..987092f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHelper.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHelper.h new file mode 100644 index 0000000..7e4a663 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHint.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/ProtocolHint.h new file mode 100644 index 0000000..5cc2c14 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/Transaction.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/Transaction.h new file mode 100644 index 0000000..f37a529 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/common/protocols/Transfer.h b/IRIS_FODIS/Source/OSIF/include/common/protocols/Transfer.h new file mode 100644 index 0000000..10e6b03 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/Inet4Address.h b/IRIS_FODIS/Source/OSIF/include/native/network/Inet4Address.h new file mode 100644 index 0000000..a52058a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/Socket.h b/IRIS_FODIS/Source/OSIF/include/native/network/Socket.h new file mode 100644 index 0000000..0446b79 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/SocketException.h b/IRIS_FODIS/Source/OSIF/include/native/network/SocketException.h new file mode 100644 index 0000000..f7ef56c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/SocketTimeoutException.h b/IRIS_FODIS/Source/OSIF/include/native/network/SocketTimeoutException.h new file mode 100644 index 0000000..d591778 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/UnknownHostException.h b/IRIS_FODIS/Source/OSIF/include/native/network/UnknownHostException.h new file mode 100644 index 0000000..261f80b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/posix/NativeSocketPOSIX.h b/IRIS_FODIS/Source/OSIF/include/native/network/posix/NativeSocketPOSIX.h new file mode 100644 index 0000000..d8715b5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/network/windows/NativeSocketWindows.h b/IRIS_FODIS/Source/OSIF/include/native/network/windows/NativeSocketWindows.h new file mode 100644 index 0000000..c19d0bf --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/rs232/NativeRS232.h b/IRIS_FODIS/Source/OSIF/include/native/rs232/NativeRS232.h new file mode 100644 index 0000000..974d06b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/rs232/RS232.h b/IRIS_FODIS/Source/OSIF/include/native/rs232/RS232.h new file mode 100644 index 0000000..d257efc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/rs232/windows/NativeRS232Windows.h b/IRIS_FODIS/Source/OSIF/include/native/rs232/windows/NativeRS232Windows.h new file mode 100644 index 0000000..75d0e9b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/system/NativeSystem.h b/IRIS_FODIS/Source/OSIF/include/native/system/NativeSystem.h new file mode 100644 index 0000000..b3e34b3 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/system/System.h b/IRIS_FODIS/Source/OSIF/include/native/system/System.h new file mode 100644 index 0000000..757a527 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/usb/NativeUSB.h b/IRIS_FODIS/Source/OSIF/include/native/usb/NativeUSB.h new file mode 100644 index 0000000..ce054c7 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/usb/USB.h b/IRIS_FODIS/Source/OSIF/include/native/usb/USB.h new file mode 100644 index 0000000..70a014f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/usb/USBDiscovery.h b/IRIS_FODIS/Source/OSIF/include/native/usb/USBDiscovery.h new file mode 100644 index 0000000..fda1c0d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/native/usb/winusb/WindowsGUID.h b/IRIS_FODIS/Source/OSIF/include/native/usb/winusb/WindowsGUID.h new file mode 100644 index 0000000..de3d140 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h new file mode 100644 index 0000000..b1f33e5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h new file mode 100644 index 0000000..2586c2f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h new file mode 100644 index 0000000..885ba18 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h new file mode 100644 index 0000000..82ee675 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h new file mode 100644 index 0000000..0c10e68 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h new file mode 100644 index 0000000..8a915b6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h new file mode 100644 index 0000000..1312f92 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h new file mode 100644 index 0000000..c52d326 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h new file mode 100644 index 0000000..d1642cf --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h new file mode 100644 index 0000000..78a8413 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h new file mode 100644 index 0000000..db03827 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h new file mode 100644 index 0000000..95195f6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h new file mode 100644 index 0000000..2c3163f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h new file mode 100644 index 0000000..bbeef85 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h new file mode 100644 index 0000000..5aefeed --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h new file mode 100644 index 0000000..c9b587f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h new file mode 100644 index 0000000..e7be862 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h new file mode 100644 index 0000000..9a9564c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h new file mode 100644 index 0000000..a0b8290 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h new file mode 100644 index 0000000..f6e84cc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h new file mode 100644 index 0000000..996ad15 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h new file mode 100644 index 0000000..ff08b12 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h new file mode 100644 index 0000000..cb9e897 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h new file mode 100644 index 0000000..ef24f1f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h new file mode 100644 index 0000000..a15af3e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h new file mode 100644 index 0000000..80cc82b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h new file mode 100644 index 0000000..be188b2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h new file mode 100644 index 0000000..90b63ef --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h new file mode 100644 index 0000000..c360985 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h new file mode 100644 index 0000000..396af57 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h new file mode 100644 index 0000000..09993a3 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h new file mode 100644 index 0000000..a750f61 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Apex.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Apex.h new file mode 100644 index 0000000..eb3fa31 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Blaze.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Blaze.h new file mode 100644 index 0000000..20b08d4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h new file mode 100644 index 0000000..8e19baa --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000.h new file mode 100644 index 0000000..c614cc3 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h new file mode 100644 index 0000000..85acf18 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR4000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/HR4000.h new file mode 100644 index 0000000..07d9902 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Jaz.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Jaz.h new file mode 100644 index 0000000..3cd3895 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h new file mode 100644 index 0000000..7024bc7 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h new file mode 100644 index 0000000..45f29aa --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h new file mode 100644 index 0000000..24d57cc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h new file mode 100644 index 0000000..ce6dd2c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h new file mode 100644 index 0000000..8a62761 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QE65000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QE65000.h new file mode 100644 index 0000000..ddd4c1e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QEPro.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/QEPro.h new file mode 100644 index 0000000..d8bef4d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/STS.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/STS.h new file mode 100644 index 0000000..fad5a7a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Spark.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Spark.h new file mode 100644 index 0000000..ebbf402 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Torus.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Torus.h new file mode 100644 index 0000000..76ace9f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000.h new file mode 100644 index 0000000..1791d44 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h new file mode 100644 index 0000000..aab3a48 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB4000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/USB4000.h new file mode 100644 index 0000000..a9edddb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Ventana.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/devices/Ventana.h new file mode 100644 index 0000000..6bc250b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h new file mode 100644 index 0000000..e0bacf3 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h new file mode 100644 index 0000000..bf7a90a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h new file mode 100644 index 0000000..c637ee5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h new file mode 100644 index 0000000..c44368e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h new file mode 100644 index 0000000..8625b8a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h new file mode 100644 index 0000000..755c3ca --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h new file mode 100644 index 0000000..1bd3c0c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h new file mode 100644 index 0000000..928db97 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h new file mode 100644 index 0000000..2b086e4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h new file mode 100644 index 0000000..c9ad005 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h new file mode 100644 index 0000000..4de6785 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h new file mode 100644 index 0000000..9c274e1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h new file mode 100644 index 0000000..7a5f3dc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h new file mode 100644 index 0000000..db8e6be --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h new file mode 100644 index 0000000..5fa8fd6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h new file mode 100644 index 0000000..a56ab41 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h new file mode 100644 index 0000000..5caf4c5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h new file mode 100644 index 0000000..f13391d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h new file mode 100644 index 0000000..3464d9d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h new file mode 100644 index 0000000..f9bfa70 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h new file mode 100644 index 0000000..a256bff --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h new file mode 100644 index 0000000..a586359 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h new file mode 100644 index 0000000..a29c8bc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h new file mode 100644 index 0000000..54fa0bc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h new file mode 100644 index 0000000..b85a3c6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h new file mode 100644 index 0000000..5805481 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h new file mode 100644 index 0000000..c114c34 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h new file mode 100644 index 0000000..cc94855 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h new file mode 100644 index 0000000..4a96948 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h new file mode 100644 index 0000000..7f3be9d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h new file mode 100644 index 0000000..b2d7df5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h new file mode 100644 index 0000000..5f440b9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h new file mode 100644 index 0000000..997f678 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h new file mode 100644 index 0000000..c13f551 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h new file mode 100644 index 0000000..4b1fd6f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h new file mode 100644 index 0000000..b42389a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h new file mode 100644 index 0000000..81e96f6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h new file mode 100644 index 0000000..72fb1de --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h new file mode 100644 index 0000000..2e5f91f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h new file mode 100644 index 0000000..0814f81 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h new file mode 100644 index 0000000..bbd3c39 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h new file mode 100644 index 0000000..28db95d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h new file mode 100644 index 0000000..1b7adb6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h new file mode 100644 index 0000000..2597d48 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h new file mode 100644 index 0000000..d0a1b88 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h new file mode 100644 index 0000000..5eb35bb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h new file mode 100644 index 0000000..661a266 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h new file mode 100644 index 0000000..b51fd73 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h new file mode 100644 index 0000000..64dda46 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h new file mode 100644 index 0000000..a38b63d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..8d591f1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h new file mode 100644 index 0000000..c50692a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h new file mode 100644 index 0000000..dad72b0 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h new file mode 100644 index 0000000..be865fe --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h new file mode 100644 index 0000000..792625a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h new file mode 100644 index 0000000..ff2da12 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h new file mode 100644 index 0000000..5c73755 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h new file mode 100644 index 0000000..c550920 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h new file mode 100644 index 0000000..9331054 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h new file mode 100644 index 0000000..365a59d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h new file mode 100644 index 0000000..ad2ceae --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h new file mode 100644 index 0000000..8d896e7 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h new file mode 100644 index 0000000..bb21810 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h new file mode 100644 index 0000000..762b7fa --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h new file mode 100644 index 0000000..b54a333 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h new file mode 100644 index 0000000..f4e9893 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h new file mode 100644 index 0000000..61f6113 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h new file mode 100644 index 0000000..2e4dde6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h new file mode 100644 index 0000000..6c46dcb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h new file mode 100644 index 0000000..9d26c0d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h new file mode 100644 index 0000000..3a4443c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..afe62e8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h new file mode 100644 index 0000000..d470c37 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h new file mode 100644 index 0000000..b43b6ef --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h new file mode 100644 index 0000000..ee24b9e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h new file mode 100644 index 0000000..a41a265 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h new file mode 100644 index 0000000..95d1e63 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h new file mode 100644 index 0000000..712c26f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h new file mode 100644 index 0000000..1fbe6d1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h new file mode 100644 index 0000000..c28ac96 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h new file mode 100644 index 0000000..7c8ed22 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h new file mode 100644 index 0000000..e73c22d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h new file mode 100644 index 0000000..70fe887 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h new file mode 100644 index 0000000..bf4771d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h new file mode 100644 index 0000000..3dd787c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h new file mode 100644 index 0000000..a1bf4eb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h new file mode 100644 index 0000000..f2f1c32 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h new file mode 100644 index 0000000..eb2daae --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h new file mode 100644 index 0000000..2ca2ca6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h new file mode 100644 index 0000000..966cfc6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h new file mode 100644 index 0000000..8f73656 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h new file mode 100644 index 0000000..92add4a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h new file mode 100644 index 0000000..38b92fb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h new file mode 100644 index 0000000..d9bbdab --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h new file mode 100644 index 0000000..068765f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h new file mode 100644 index 0000000..9136e5a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h new file mode 100644 index 0000000..0ca98f8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h new file mode 100644 index 0000000..19cebeb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h new file mode 100644 index 0000000..ff0d75b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h new file mode 100644 index 0000000..c8fc925 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h new file mode 100644 index 0000000..8124705 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h new file mode 100644 index 0000000..47118c8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h new file mode 100644 index 0000000..87c0a10 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h new file mode 100644 index 0000000..a31a93d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h new file mode 100644 index 0000000..f5e4acb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h new file mode 100644 index 0000000..d2e10c7 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h new file mode 100644 index 0000000..64adf98 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h new file mode 100644 index 0000000..66e4737 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h new file mode 100644 index 0000000..47af129 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h new file mode 100644 index 0000000..ac5275d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h new file mode 100644 index 0000000..bf143c6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h new file mode 100644 index 0000000..ef968bd --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h new file mode 100644 index 0000000..4a9fcb6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h new file mode 100644 index 0000000..e4dd76c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h new file mode 100644 index 0000000..5a7b4c2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h new file mode 100644 index 0000000..c586f7f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h new file mode 100644 index 0000000..006e4d6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h new file mode 100644 index 0000000..7bf4ceb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h new file mode 100644 index 0000000..f1bebfc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..0726a85 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h new file mode 100644 index 0000000..73ddbcf --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h new file mode 100644 index 0000000..f24b906 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h new file mode 100644 index 0000000..af9b3ea --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..b8e03c9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h new file mode 100644 index 0000000..dd19e5b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h new file mode 100644 index 0000000..77f5840 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h new file mode 100644 index 0000000..315e673 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h new file mode 100644 index 0000000..e6964d4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h new file mode 100644 index 0000000..268a2ee --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h new file mode 100644 index 0000000..c314138 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h new file mode 100644 index 0000000..1bb9b07 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h new file mode 100644 index 0000000..725430d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h new file mode 100644 index 0000000..75b862c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h new file mode 100644 index 0000000..87aa8d6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h new file mode 100644 index 0000000..bc1c40b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h new file mode 100644 index 0000000..0b7d015 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h new file mode 100644 index 0000000..184b91e --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h new file mode 100644 index 0000000..62e82e1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h new file mode 100644 index 0000000..25aaa52 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h new file mode 100644 index 0000000..d301f3c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h new file mode 100644 index 0000000..71d4edf --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h new file mode 100644 index 0000000..b2aa762 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h new file mode 100644 index 0000000..8008932 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h new file mode 100644 index 0000000..dc287ff --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h new file mode 100644 index 0000000..b317dfc --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h new file mode 100644 index 0000000..d83ab16 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h new file mode 100644 index 0000000..9c376d1 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h new file mode 100644 index 0000000..245109f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h new file mode 100644 index 0000000..82d618c --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h new file mode 100644 index 0000000..07eb3e7 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h new file mode 100644 index 0000000..e53a3bd --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h new file mode 100644 index 0000000..fc6d557 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h new file mode 100644 index 0000000..679a860 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..bca0170 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h new file mode 100644 index 0000000..ebc0304 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..c7dc738 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h new file mode 100644 index 0000000..cbc564b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h new file mode 100644 index 0000000..c8488a0 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..d5c5992 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h new file mode 100644 index 0000000..596b461 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h new file mode 100644 index 0000000..6c6fef0 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h new file mode 100644 index 0000000..d7aa956 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h new file mode 100644 index 0000000..5d01977 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h new file mode 100644 index 0000000..f991292 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..95934da --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h new file mode 100644 index 0000000..2bd55db --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..289e2f6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h new file mode 100644 index 0000000..0f2d6fb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h new file mode 100644 index 0000000..d07fd74 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h new file mode 100644 index 0000000..f848bed --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h new file mode 100644 index 0000000..bef32d9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h new file mode 100644 index 0000000..7c56fcf --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h new file mode 100644 index 0000000..8238eae --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h new file mode 100644 index 0000000..620f2db --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h new file mode 100644 index 0000000..81e91c4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h new file mode 100644 index 0000000..34c149f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h new file mode 100644 index 0000000..b26c0e6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h new file mode 100644 index 0000000..b0db171 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h new file mode 100644 index 0000000..918434b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h new file mode 100644 index 0000000..417f63d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h new file mode 100644 index 0000000..57c9f44 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h new file mode 100644 index 0000000..ec8727d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h new file mode 100644 index 0000000..eb10f75 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h new file mode 100644 index 0000000..fa273e8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h new file mode 100644 index 0000000..e890fe6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h new file mode 100644 index 0000000..01525f9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h new file mode 100644 index 0000000..7f05484 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h new file mode 100644 index 0000000..de9dcd6 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h new file mode 100644 index 0000000..2b1a4b2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h new file mode 100644 index 0000000..69697d8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h new file mode 100644 index 0000000..e953db4 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h new file mode 100644 index 0000000..1ea14c9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h new file mode 100644 index 0000000..9401c99 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h new file mode 100644 index 0000000..24b5682 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h new file mode 100644 index 0000000..e5379ac --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h new file mode 100644 index 0000000..06f7aa5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h new file mode 100644 index 0000000..294010a --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h new file mode 100644 index 0000000..182890d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h new file mode 100644 index 0000000..f35331d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h new file mode 100644 index 0000000..1be1f3d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h new file mode 100644 index 0000000..6c26a45 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h new file mode 100644 index 0000000..9cb0ddb --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h new file mode 100644 index 0000000..9baa85b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h new file mode 100644 index 0000000..2471b7f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h new file mode 100644 index 0000000..e872d76 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h new file mode 100644 index 0000000..f388edd --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h new file mode 100644 index 0000000..40c83ef --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h new file mode 100644 index 0000000..675b77b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h new file mode 100644 index 0000000..e5af731 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h new file mode 100644 index 0000000..a6f3c2d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h new file mode 100644 index 0000000..971aaaa --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h new file mode 100644 index 0000000..c1898e2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h new file mode 100644 index 0000000..e22e788 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h new file mode 100644 index 0000000..5c67535 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h new file mode 100644 index 0000000..8856a18 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h new file mode 100644 index 0000000..d711cf9 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h new file mode 100644 index 0000000..b36ac61 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h new file mode 100644 index 0000000..0d5aa72 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h new file mode 100644 index 0000000..c48231f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h new file mode 100644 index 0000000..1e2cc6f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h new file mode 100644 index 0000000..09009ae --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h new file mode 100644 index 0000000..1267a98 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h new file mode 100644 index 0000000..00de06b --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h new file mode 100644 index 0000000..ffb9b11 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h new file mode 100644 index 0000000..3c9d3a8 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h new file mode 100644 index 0000000..4670365 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h new file mode 100644 index 0000000..82e077f --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h new file mode 100644 index 0000000..0123724 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h new file mode 100644 index 0000000..f24c4f5 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h new file mode 100644 index 0000000..8f9a667 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h new file mode 100644 index 0000000..a409a1d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h new file mode 100644 index 0000000..012abb2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h new file mode 100644 index 0000000..cac8845 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h new file mode 100644 index 0000000..5b2a30d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h new file mode 100644 index 0000000..edf1df2 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h new file mode 100644 index 0000000..89e930d --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h b/IRIS_FODIS/Source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h new file mode 100644 index 0000000..5d1ff15 --- /dev/null +++ b/IRIS_FODIS/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/IRIS_FODIS/Source/Settings/SysConfigger.cpp b/IRIS_FODIS/Source/Settings/SysConfigger.cpp new file mode 100644 index 0000000..19c268b --- /dev/null +++ b/IRIS_FODIS/Source/Settings/SysConfigger.cpp @@ -0,0 +1,19 @@ +#include "SysConfigger.h" + + +ZZ_SysConfigger::ZZ_SysConfigger(QObject* parent /*= nullptr*/) +{ +#ifdef _DEBUG + m_qstrDeviceConfigFilePath = "E:/WorkSpace/git/IRIS_FODIS/IRIS_FODIS/Settings/DeviceSettings.ini"; +#else + m_qstrDeviceConfigFilePath = "/home/data/Setting/DeviceSettings.ini"; +#endif // DEBUG + + m_qsDeviceConfig = NULL; +} + + +ZZ_SysConfigger::~ZZ_SysConfigger() +{ + +} diff --git a/IRIS_FODIS/Source/Settings/SysConfigger.h b/IRIS_FODIS/Source/Settings/SysConfigger.h new file mode 100644 index 0000000..b5be3a0 --- /dev/null +++ b/IRIS_FODIS/Source/Settings/SysConfigger.h @@ -0,0 +1,19 @@ +#pragma once +#include "pch.h" + + +class ZZ_SysConfigger :public QObject +{ + Q_OBJECT + +public: + ZZ_SysConfigger(QObject* parent = nullptr); + virtual ~ZZ_SysConfigger(); + +public: + +private: + QString m_qstrDeviceSettingsFilePath; + QSettings* m_qsDeviceSettings; + +}; diff --git a/IRIS_FODIS/Source/ZZ_SDK/ZZ_Math_HDRONLY.h b/IRIS_FODIS/Source/ZZ_SDK/ZZ_Math_HDRONLY.h new file mode 100644 index 0000000..d57693b --- /dev/null +++ b/IRIS_FODIS/Source/ZZ_SDK/ZZ_Math_HDRONLY.h @@ -0,0 +1,84 @@ +#pragma once +namespace ZZ_MATH +{ + + template + void MinHeapify(T*arry, int size, int element) + { + int lchild = element * 2 + 1, rchild = lchild + 1; + while (rchild < size) + { + if (arry[element] <= arry[lchild] && arry[element] <= arry[rchild]) + { + return; + } + if (arry[lchild] <= arry[rchild]) + { + std::swap(arry[element], arry[lchild]); + element = lchild; + } + else + { + std::swap(arry[element], arry[rchild]); + element = rchild; + } + lchild = element * 2 + 1; + rchild = lchild + 1; + } + if (lchild < size&&arry[lchild] < arry[element]) + { + std::swap(arry[lchild], arry[element]); + } + return; + } + + template + void MaxHeapify(T*arry, int size, int element) + { + int lchild = element * 2 + 1, rchild = lchild + 1; + while (rchild < size) + { + if (arry[element] >= arry[lchild] && arry[element] >= arry[rchild]) + { + return; + } + if (arry[lchild] >= arry[rchild]) + { + std::swap(arry[element], arry[lchild]); + element = lchild; + } + else + { + std::swap(arry[element], arry[rchild]); + element = rchild; + } + lchild = element * 2 + 1; + rchild = lchild + 1; + } + if (lchildarry[element]) + { + std::swap(arry[lchild], arry[element]); + } + return; + } + + + template + void HeapSort(T*arry, int size) + { + int i; + for (i = size - 1; i >= 0; i--) + { + MinHeapify(arry, size, i); + } + while (size > 0) + { + std::swap(arry[size - 1], arry[0]); + + size--; + MinHeapify(arry, size, 0); + } + return; + } + +} diff --git a/IRIS_FODIS/Source/pch.h b/IRIS_FODIS/Source/pch.h new file mode 100644 index 0000000..5513488 --- /dev/null +++ b/IRIS_FODIS/Source/pch.h @@ -0,0 +1,34 @@ +#pragma once +#include +////////////////////////////setings +#include +#include +////////////////////////////Basic +#include +#include +#include +#include +#include +#include +#include +////////////////////////////Thread +#include +#include +#include +////////////////////////////json +///#include +//#include +//#include +//#include +//#include +////////////////////////////time +#include +#include +#include +////////////////////////////Serial I/O +#include +#include +////////////////////////////NetWork +//#include "QNetworkRequest" +//#include "QNetworkAccessManager" +//#include "QNetworkReply" \ No newline at end of file diff --git a/IRIS_FODIS/main.cpp b/IRIS_FODIS/main.cpp new file mode 100644 index 0000000..97d9ba4 --- /dev/null +++ b/IRIS_FODIS/main.cpp @@ -0,0 +1,8 @@ +#include "pch.h" +using namespace std; + +int main() +{ + cout << "Hello CMake." << endl; + return 0; +} \ No newline at end of file diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json new file mode 100644 index 0000000..7d776af --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/query/client-MicrosoftVS/query.json @@ -0,0 +1 @@ +{"requests":[{"kind":"cache","version":2},{"kind":"cmakeFiles","version":1},{"kind":"codemodel","version":2},{"kind":"toolchains","version":1}]} \ No newline at end of file diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cache-v2-f72cb0af4748b9873246.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cache-v2-f72cb0af4748b9873246.json new file mode 100644 index 0000000..bb3d19d --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cache-v2-f72cb0af4748b9873246.json @@ -0,0 +1,1191 @@ +{ + "entries" : + [ + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/addr2line" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ar" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/home/pi/FODIS/build_d/Linux-GCC-Debug" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "19" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "4268486" + }, + { + "name" : "CMAKE_COLOR_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable color output during build." + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/opt/cmake/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/opt/cmake/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/opt/cmake/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "CXX compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/c++" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/gcc-ar-5" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/gcc-ranlib-5" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "C compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/cc" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/gcc-ar-5" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/gcc-ranlib-5" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of compile commands during generation." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Unix Makefiles" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/home/pi/FODIS/src/IRIS_FODIS" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "PATH", + "value" : "/home/pi/FODIS/out/install/Linux-GCC-Debug" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/make" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "IRIS_FODIS" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/opt/cmake/share/cmake-3.19" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/strip" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "IRIS_FODIS_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/pi/FODIS/build_d/Linux-GCC-Debug" + }, + { + "name" : "IRIS_FODIS_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/pi/FODIS/src/IRIS_FODIS" + }, + { + "name" : "Qt5Core_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The directory containing a CMake configuration file for Qt5Core." + } + ], + "type" : "PATH", + "value" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core" + }, + { + "name" : "Qt5SerialPort_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The directory containing a CMake configuration file for Qt5SerialPort." + } + ], + "type" : "PATH", + "value" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5SerialPort" + }, + { + "name" : "Qt5_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The directory containing a CMake configuration file for Qt5." + } + ], + "type" : "PATH", + "value" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cmakeFiles-v1-1a4c0b26d3929f2ab476.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cmakeFiles-v1-1a4c0b26d3929f2ab476.json new file mode 100644 index 0000000..46904d6 --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/cmakeFiles-v1-1a4c0b26d3929f2ab476.json @@ -0,0 +1,177 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/CMakeFiles/3.19.4268486-MSVC_2/CMakeSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/CMakeFiles/3.19.4268486-MSVC_2/CMakeCCompiler.cmake" + }, + { + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/CMakeFiles/3.19.4268486-MSVC_2/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Compiler/GNU-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/Linux-GNU-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Compiler/GNU-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/Linux-GNU-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/Platform/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5/Qt5ConfigVersion.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5/Qt5Config.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreConfigVersion.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreConfig.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreConfigExtras.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreConfigExtrasMkspecDir.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/opt/cmake/share/cmake-3.19/Modules/CMakeParseArguments.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5SerialPort/Qt5SerialPortConfigVersion.cmake" + }, + { + "isExternal" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/cmake/Qt5SerialPort/Qt5SerialPortConfig.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/home/pi/FODIS/build_d/Linux-GCC-Debug", + "source" : "/home/pi/FODIS/src/IRIS_FODIS" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/codemodel-v2-4b51f020c0a09a8b9c98.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/codemodel-v2-4b51f020c0a09a8b9c98.json new file mode 100644 index 0000000..52e0241 --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/codemodel-v2-4b51f020c0a09a8b9c98.json @@ -0,0 +1,68 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "minimumCMakeVersion" : + { + "string" : "3.8" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0, + 1 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "IRIS_FODIS", + "targetIndexes" : + [ + 0, + 1 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "IRIS_FODIS::@6890427a1f51a3e7e1df", + "jsonFile" : "target-IRIS_FODIS-Debug-30e14700b6a329269cef.json", + "name" : "IRIS_FODIS", + "projectIndex" : 0 + }, + { + "directoryIndex" : 0, + "id" : "IRIS_FODIS_autogen::@6890427a1f51a3e7e1df", + "jsonFile" : "target-IRIS_FODIS_autogen-Debug-71767491ed4237dcb02c.json", + "name" : "IRIS_FODIS_autogen", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/home/pi/FODIS/build_d/Linux-GCC-Debug", + "source" : "/home/pi/FODIS/src/IRIS_FODIS" + }, + "version" : + { + "major" : 2, + "minor" : 2 + } +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/index-2022-03-21T05-03-37-0384.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/index-2022-03-21T05-03-37-0384.json new file mode 100644 index 0000000..c475ae5 --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/index-2022-03-21T05-03-37-0384.json @@ -0,0 +1,117 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Unix Makefiles" + }, + "paths" : + { + "cmake" : "/opt/cmake/bin/cmake", + "cpack" : "/opt/cmake/bin/cpack", + "ctest" : "/opt/cmake/bin/ctest", + "root" : "/opt/cmake/share/cmake-3.19" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 19, + "patch" : 4268486, + "string" : "3.19.4268486-MSVC_2", + "suffix" : "" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-4b51f020c0a09a8b9c98.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 2 + } + }, + { + "jsonFile" : "cache-v2-f72cb0af4748b9873246.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-1a4c0b26d3929f2ab476.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "client-MicrosoftVS" : + { + "query.json" : + { + "requests" : + [ + { + "kind" : "cache", + "version" : 2 + }, + { + "kind" : "cmakeFiles", + "version" : 1 + }, + { + "kind" : "codemodel", + "version" : 2 + }, + { + "kind" : "toolchains", + "version" : 1 + } + ], + "responses" : + [ + { + "jsonFile" : "cache-v2-f72cb0af4748b9873246.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-1a4c0b26d3929f2ab476.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + { + "jsonFile" : "codemodel-v2-4b51f020c0a09a8b9c98.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 2 + } + }, + { + "error" : "unknown request kind 'toolchains'" + } + ] + } + } + } +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS-Debug-30e14700b6a329269cef.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS-Debug-30e14700b6a329269cef.json new file mode 100644 index 0000000..e3a9da0 --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS-Debug-30e14700b6a329269cef.json @@ -0,0 +1,2686 @@ +{ + "artifacts" : + [ + { + "path" : "IRIS_FODIS" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_executable", + "link_directories", + "target_link_libraries", + "qt5_use_modules", + "set_property", + "include_directories" + ], + "files" : + [ + "CMakeLists.txt", + "/usr/lib/arm-linux-gnueabihf/cmake/Qt5Core/Qt5CoreMacros.cmake" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 27, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 24, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 25, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 36, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 39, + "parent" : 0 + }, + { + "command" : 2, + "file" : 1, + "line" : 330, + "parent" : 5 + }, + { + "command" : 2, + "file" : 1, + "line" : 330, + "parent" : 5 + }, + { + "command" : 4, + "file" : 1, + "line" : 332, + "parent" : 5 + }, + { + "command" : 4, + "file" : 1, + "line" : 332, + "parent" : 5 + }, + { + "command" : 5, + "file" : 0, + "line" : 19, + "parent" : 0 + }, + { + "command" : 5, + "file" : 0, + "line" : 20, + "parent" : 0 + }, + { + "command" : 5, + "file" : 0, + "line" : 21, + "parent" : 0 + }, + { + "command" : 5, + "file" : 0, + "line" : 22, + "parent" : 0 + }, + { + "command" : 4, + "file" : 1, + "line" : 331, + "parent" : 5 + }, + { + "command" : 4, + "file" : 1, + "line" : 331, + "parent" : 5 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g" + }, + { + "backtrace" : 7, + "fragment" : "-fPIC" + }, + { + "fragment" : "-std=gnu++14" + } + ], + "defines" : + [ + { + "backtrace" : 8, + "define" : "QT_CORE_LIB" + }, + { + "backtrace" : 9, + "define" : "QT_SERIALPORT_LIB" + } + ], + "includes" : + [ + { + "backtrace" : 0, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/IRIS_FODIS_autogen/include" + }, + { + "backtrace" : 10, + "path" : "/home/pi/FODIS/src/IRIS_FODIS/Source" + }, + { + "backtrace" : 11, + "path" : "/home/pi/FODIS/src/IRIS_FODIS/Source/FS" + }, + { + "backtrace" : 12, + "path" : "/home/pi/FODIS/src/IRIS_FODIS/Source/OSIF/include" + }, + { + "backtrace" : 13, + "path" : "/home/pi/FODIS/src/IRIS_FODIS/Source/ZZ_SDK" + }, + { + "backtrace" : 14, + "isSystem" : true, + "path" : "/usr/include/arm-linux-gnueabihf/qt5" + }, + { + "backtrace" : 14, + "isSystem" : true, + "path" : "/usr/include/arm-linux-gnueabihf/qt5/QtCore" + }, + { + "backtrace" : 14, + "isSystem" : true, + "path" : "/usr/lib/arm-linux-gnueabihf/qt5/mkspecs/linux-g++" + }, + { + "backtrace" : 15, + "isSystem" : true, + "path" : "/usr/include/arm-linux-gnueabihf/qt5/QtSerialPort" + } + ], + "language" : "CXX", + "languageStandard" : + { + "backtraces" : + [ + 1 + ], + "standard" : "14" + }, + "sourceIndexes" : + [ + 0, + 1, + 393, + 394, + 395 + ] + } + ], + "dependencies" : + [ + { + "backtrace" : 0, + "id" : "IRIS_FODIS_autogen::@6890427a1f51a3e7e1df" + } + ], + "id" : "IRIS_FODIS::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-g", + "role" : "flags" + }, + { + "fragment" : "", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "-L/home/pi/FODIS/src/IRIS_FODIS/source/OSIF/DLib", + "role" : "libraryPath" + }, + { + "backtrace" : 3, + "fragment" : "-L/home/pi/SeaBrease/lib", + "role" : "libraryPath" + }, + { + "fragment" : "-Wl,-rpath,/home/pi/FODIS/src/IRIS_FODIS/source/OSIF/DLib:/home/pi/SeaBrease/lib", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "-lseabreeze", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "-lusb", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "-lstdc++", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "-lm", + "role" : "libraries" + }, + { + "backtrace" : 6, + "fragment" : "/usr/lib/arm-linux-gnueabihf/libQt5SerialPort.so.5.5.1", + "role" : "libraries" + }, + { + "backtrace" : 7, + "fragment" : "/usr/lib/arm-linux-gnueabihf/libQt5Core.so.5.5.1", + "role" : "libraries" + } + ], + "language" : "CXX" + }, + "name" : "IRIS_FODIS", + "nameOnDisk" : "IRIS_FODIS", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 393, + 394, + 395 + ] + }, + { + "name" : "Header Files", + "sourceIndexes" : + [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392 + ] + } + ], + "sources" : + [ + { + "backtrace" : 0, + "compileGroupIndex" : 0, + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/IRIS_FODIS_autogen/mocs_compilation.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "main.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "Source/FS/ATPControl_Serial_QT.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/FS/DataFileProcessor.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/FS/IrisFiberSpectrometerBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/FS/OControl_USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/FS/ZZ_Types.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/DeviceFactory.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/DllDecl.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/SeaBreezeWrapper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/DeviceAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/FeatureFamilies.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/ByteVector.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/Data.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/DoubleVector.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/FloatVector.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/Log.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/SeaBreeze.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/U32Vector.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/UShortVector.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/UnitDescriptor.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/Bus.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/BusFamilies.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/BusFamily.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/DeviceLocationProberInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/DeviceLocatorInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/TransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/rs232/RS232Interface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/rs232/RS232TransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/usb/USBDeviceLocator.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/usb/USBInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/buses/usb/USBTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/devices/Device.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/BusConnectException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/BusException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/BusTransferException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/FeatureControlException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/FeatureException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/IllegalArgumentException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/NumberFormatException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/ProtocolException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/ProtocolFormatException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/exceptions/ProtocolTransactionException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/features/Feature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/features/FeatureFamily.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/features/FeatureImpl.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/globals.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/Exchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/Protocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/ProtocolFamily.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/ProtocolHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/ProtocolHint.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/Transaction.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/common/protocols/Transfer.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/Inet4Address.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/Socket.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/SocketException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/SocketTimeoutException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/UnknownHostException.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/posix/NativeSocketPOSIX.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/network/windows/NativeSocketWindows.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/rs232/NativeRS232.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/rs232/RS232.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/rs232/windows/NativeRS232Windows.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/system/NativeSystem.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/system/System.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/usb/NativeUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/usb/USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/usb/USBDiscovery.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/native/usb/winusb/WindowsGUID.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Apex.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Blaze.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/HR2000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/HR4000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Jaz.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/QE65000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/QEPro.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/STS.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Spark.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Torus.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/USB2000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/USB4000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/devices/Ventana.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/ZZ_SDK/ZZ_Math_HDRONLY.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "Source/pch.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "Source/FS/ATPControl_Serial_QT.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "Source/FS/DataFileProcessor.cpp", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "Source/FS/OControl_USB.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "EXECUTABLE" +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS_autogen-Debug-71767491ed4237dcb02c.json b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS_autogen-Debug-71767491ed4237dcb02c.json new file mode 100644 index 0000000..f76b7b7 --- /dev/null +++ b/IRIS_FODIS/out/build/Linux-GCC-Debug/.cmake/api/v1/reply/target-IRIS_FODIS_autogen-Debug-71767491ed4237dcb02c.json @@ -0,0 +1,58 @@ +{ + "backtrace" : 0, + "backtraceGraph" : + { + "commands" : [], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + } + ] + }, + "id" : "IRIS_FODIS_autogen::@6890427a1f51a3e7e1df", + "isGeneratorProvided" : true, + "name" : "IRIS_FODIS_autogen", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "", + "sourceIndexes" : + [ + 0 + ] + }, + { + "name" : "CMake Rules", + "sourceIndexes" : + [ + 1 + ] + } + ], + "sources" : + [ + { + "backtrace" : 0, + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/CMakeFiles/IRIS_FODIS_autogen", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 0, + "isGenerated" : true, + "path" : "/home/pi/FODIS/build_d/Linux-GCC-Debug/CMakeFiles/IRIS_FODIS_autogen.rule", + "sourceGroupIndex" : 1 + } + ], + "type" : "UTILITY" +} diff --git a/IRIS_FODIS/out/build/Linux-GCC-Debug/IRIS_FODIS b/IRIS_FODIS/out/build/Linux-GCC-Debug/IRIS_FODIS new file mode 100644 index 0000000000000000000000000000000000000000..fde3f97aa65553bb76f9a12f7ce21c88e73096e9 GIT binary patch literal 1232484 zcmcG13tUxI_WwEeqLQMbk|CfXppj^Tpd!}_5wG}0p)$32>%EFVfQDQvw8qS_qHG#d z$DC@KrfJF?ZA|mgW2)(A4VE+GSWaY?Ag`+#=fVZ<|GV}+``pb{tKWQnf9kl`*^jl? zUTf{OUu&QH;Pg3GRaF)7XHudSdaEC!DhUYZd^Au|{FELEO1N?z(r#3uD7_@}D@Dot zN@dTn9*RPbAM(@F6AzV5Ku&tXQGgy~Vd-XsnRw4cz4Q#hJ3Uku(dL#h(|t->BE zPpOnApotz6d%}=F^;5l+Zo#oG3EoRkH$AC{r$?kM__jPBuUGt0 z`9M4ikuKMN85Pn)<%za&h4$QWh52I(?M16A#^#i+vMsy0toY`5B(Xe%gYwOocRNKX z#1EpG{s>199*U#%$1E%V5Q#a9N0KJuAkcI)GdUB7q;X#se`@$|-{#-{siyM1K1 zT4lPS-!1v3DrHk(gfcsQ^SuL-{WhSsaHYq9KCuD*;im8&k+0b|1x1E$9*{i3KR0%O zDKqoLyUB`wuax8AFHV>iyOh9_5V=)1UN$M6phoSbui(}4a@eW9(sY1B6{pCrt7roa8$ zWy=Ts`RPUHW`}1zvo-Ad!QcJx)?*j@wf`mglV@)Zxqp>^#WU}naNM-@%Xj|xS+8e` ze#q(9SbSUm?UPOiejoD4vXB)4zuxiJ4O4H8yPP{EWAEC!DTx358xPeSh*^34?jFmA z-leSnyywPS?u-}%Ac8}3T4ozS%Bqeeu>w~ z53NlX7e2gW{;cl~Kj%7IKjn8z4}SC1x_4?`uU+-Kc`tvtY`_n9wfuVRh0k01J^9#g z3Rk{7%lZ62|J79c*5UD6ZmPGbuP4-1Et%MJ+Vp=k-o5|nK~E1oT>6{5!+(wZ_`dCr zIGvFZ$b}cOKdrcHbxSXO4_M znNl%x<(oI1JhVu)^?1o|T9bdEW9Pc5=a&BM>s|Mp3Ex;zId0x9tt0-?bnq-_`^&q{ zH32#ApDdoWqO2w$VCLxGe)#<#W~{pOn==1Dzx~F!hsyR1xKURhBY3Z$0V)`Im|YMt z;Q(IsNf&*Z@=*F1GeP{1?9r@V;*HxUiW7g~0N(QxZwjk#X@BoK<*oEd7yX=ah2y!$ zhn_Ed@&}WF*8iwIyZVSXUf(KV_z_L%9X-3JAM+{yOkYKLd$h_jQT|AYUV1-<_9oL{ zhd+9M3*(~rqxW_ndjBc$i_(LEU;NSgpM2>1tq(nyt`oU=eYrmGqkZV>uJMSaUSk#{%Blxc<`+e}Q5X2*-`d>r)OE9mZ@r&9&&WAqklYgL3|Dkn(_#^uNt~4aXCMA;2EWsgJ_dD@J^htWebazX{1JV2pYriO?R(jWe;@d~+kEWR6F%(;^Qmtb z!zC#Cs=g0*T{K~8RI zK|y5!R;fzXtTkB+3zpl<$_q-T73P$c6_hDiGc)IA+&jFS3^_-WAUw|pflp;pYH2}EepWf~mlv!mDFCX~rM|5wD=4++6lN8zUX=?LdI_Kw z7L=A2mqI9|_M+uJNy~~$SLKwK7v$?)T)irbvsucQS6Gl!n#HM;q8ab(ML)ZFKTiLZ zgpe|>F3TModvhFZm?SXeEYHu2iJ{ktkl4J8@<~})c@-6LadG2wbIR;_dLw7%Wt7Lo z<=H@Xd1;QlyliIP^o$(*Gd(qK`WjY}-t?D@^1`y2R~DGQ5OMJwZ84Zvkh5xLUS`(x zj0sukv-5x?qdXz6cy&2LS6o;&J>9x6qc|gLIz`O>-;5*U3s33 zq5ogEb6VVV5V>%6Mm&1qf5WJp3_|eVl||)VCi9o99GDe*R!(_A1^PB`VlFI5kV@ji_Nh@;QbTWHT!&ve2!|ii>gz$;zyWMKdz*m=_nzv>S|D z6E_}knLR6yjBr-@+L8kFyJf|sYp`2aYqcSS|8?U~az1ODR}oBXhxWG5yt3ghAy%+Fnc zF(ws#EN)W%+M*m7;kgCnIXs%{D{^_G5_9s(?Q5X0)6*yEh0|weWZBa(NTAViu?wb_ zmgcNw2xIdLm^QK88Cfe>d%ER_D}ynDl`UFbSjY?nQd8EJ7cd+Xn1$suh`J^etSKle zpPoK(!E^$sN|6*7$I`6!LX4Kv(=)QJnkklsno?GHdOBK`X}osB6`NlTXB9jWE1o4Wj`Z#1{<&@=9FND zzcWo6*8Gv zTELXcPLwAsNVS)uTP&O{YNy!QEP5g=T3LA+mmZ4|W6XpF5K+Mu#dvfA&3mRBU8hc(r-1zxOnTtsYQO*hDMFd`N-bpkuKwAv;_3D0H9Ht&AIji#*l2Y1@iZZe$ zqb-n=x7BeAq+*j$Y$33wu$fN=^{)zQETrkpg*F+T;)+C8Gj+dtIjag}mhtX6t+FCFuxe$#y;N=;c;pq# zg!@YEWI6Z<>a7-xW7fkPBdPIhZ){?DvEI1uDkp0?G;~$*8pxKZs8GzfiOVpLo?4b? zw`bW33Nfq@6?ztK?52$;qe0CyS{ZjQ=D}!a9=gtSlC{?kCQPF^VfI8d6Zu5br*aXy zq8mvfwvfddU1(Byv9+)`2R1HOrX_VeXOThMM64#tyBTZBP8O}8f>Z$WGEBaHgii$( zB{?u4-DrxNP+mL-Xp7|G`mCfVJ2G|X(VQGn)w=yfwwlZs3j=fOH$%VmEO0YsIU#3tmD8}lnycBC8WmUl{ z*hG56|MZquvXrN0)hF3l?#H$P*hbzJHk zdv21EJ)GGkscd5tiSDS=_{D5&JXj%P}3L`7>e*m+2Zc z3C1{wv@N}~I1k;SxHRsn{WJ59Yoh+~dar>k?#haRC-aWD3G?$XH>FWLuZ)DjW85+O({Aj6Bm8Et;A#Gi&O?xmj^H$KxzskD!;yJpZCa z$eD2S_&E7h%7>j4+Ki!xZxZ>zBSJvZHjD0O(3AN)i0!GKh!tCZw1uUjBu^8ugn>5O zD3(IPOq)S+I$n|P#Yw4@PI-Ag@vqp1^Ook65(ZI<@Kbrh$WtjdFF`d6YIq5vzbB)J z(oFcTr(TNki9bOby%X*y&>|1pX-fH1^-Rr}ylZzDr8Kebid) zewme8qkIo#7l_ecl^0&03D){6b%>z2wI^Oj{$5I({(i6P*T~&N>4}3qN-w|ZDdhK4 zuGil`e|;s$Hz_0ZL&D1!P0ICPjEh2~bWli*#eVAbC>cZ{_TPdj#6BMF!v^8-ozAa< zM(};tpf%XDcAAvIIP4Fk@DY@w5Qp=@6oMmR6yjh$oI(fA!zg?Z_$b6i_81DI6(yF! zIQTtKxCnj^6y{++nnE}jBvV+5{ZtB{Lj4r}5f{*DG7Q*j_LO5eAqA(5TSrk?) zN;ZXX+{mYJH2e%Gyh%|CDGbFvDut`SHwxiEP(dM_3f57$Nl~gOoCp5_3dbtSCJMJG z$`%U2$7%|(QT;T9Rz=xHA)E$wQV3^_-4sG!UZilVqP$Gua-6482uFrJ6yBjI`zVC- z#{mi#;5?MV3Pm|a;f;#&K85Lu@)3nW*#D=n2>Y@W&cXgCg_-aVq7aT3Us4E#sHN~p zML9>|!#EqEFk4X?Da=gQM_%=mmvv=;)wuD)a*SF?c;Rib6QO_*1w6@~3b- z?ou#5%Q;S zBjiuvmg?7lF!p9(g3T==-g@Yk~3a3E+6y62- zQ#cp$r!WQbr|@RTpTZj;e+tJy{uIuH{3*od{4okMAb$#nL;e)zLjDv+LjDxSL;e(o zLH-op1Nl=J3;9#H8S}EvaES!lBsg1w7fEos z1gA-GvIHkeaI6GJOK`XZ2TO3E1p7;{BEc@r%PXe@*GX`#1fP=N8VUYLf{#h?0SVqC z!7oejZVBEd!POGHNrI~+xI%(UB-kdw*%G`+g3~29O@fmpI8lOQB{*7w!zDOaf&(Sk zUxF10cC||Um*6@Hu9e_Z5?mv}A4%{r2|ggfdnEW}3EnNi+a$PJf;UNUl>}EvaES!l zBsg1w7fEos1gA-GvIHkeaI6GJOK`XZ2TO3E1p7;{BEha7B>qcqodnlP@F@wdk>HOc z_?QGAkl;NM{IUe^mf&p?TrI(yB)Cd~DnBS|;OM|E4%q z={%w;L9x$$8x;QBx8~RNj1U3#Z;ymCG>uy=Kq96disHv%S!e zo-sZCoqS0#AH!pQBX~y14CQDHQjjB3&xJITG9={DK(*n-y)y%Q)cEEP+&}+Pc@%Q_ zMOK8q<@Z@FR-s?Hr%Vx1v+TKFheJJb5b`ajv4%;wr zLWv0gCN-wVm)=}y9*50jab)*JdH^^;>3&}lzveqV<3muMQXQx{Q0IYYd(X6r)O9wv zK1cMJIdxGuC_CPy9OdoXd`xfOzF$bRDMy2V<8GIqgLF#Zk$Je)<;%m(h@n;|T*1Q> z)Zv6IuFb21KRok2|wRsEhUWWXh!b5HT z4?^EId+Q2i{0+96owMCTK%@DhzsX@E-3&y}GdnlC1Hh+~4Q6YYRT)8=*m1#O`x5E% zFMmCLJHr080W5xFgXg>`wcbtAG&?PBkM@3}=$Yv2pv_O}n>Wm=Oub?D=Tfa-P)|ZH zr_i5;p`Zjd$M%^m(7J7gs3Bdip|=~o1U4)6Qo34!o|)1>H4C{sf4F;nl;a(b$UCN6 zUg!QNS$`tS*vINFtpH~#z>!d!JFnNpAoE(*qP=Zy(1v%@0M>VEFSu?01}~ISj2mWu z@aI6I+jhq0w(UZ$XtQ|)@!_%dgDc{!(MX-xXtuh`-RmBLCH!Kq5;MF8xs)vE%Y=w5 z*khA3)YI!?uo4FenL{Vs5dYBW1T+v%P3>Yhe*WJxX26KYF{ABsBvBh~pr+gmGQ ztuN2GT76d3cT0qo)%Q(TuZv+)eWx4fJ=v)5n>Ko<`bIUHMkb=ZP}>|xq}>)cet^|w z+cv{xQ=H{pZd-J`62a~0!TO3^$BI8+^xQW51hsE0>YE=imeu!1)E6$*_dMzgH{WQ~ z_eazh&gyG!FptC-F_O4XEkEsw0S5*_ChaRjZQD~qYl3S9FHSY|0nF+Atf2>Bj^jAA zQj|aF@@VVOdta?jg{^dA%;^dJ2!cLtru8fO@Y8rg0C!;Bng;k4T9*R8jK^yih~J5l zPAW%*zU|rnls@Lv&b>dic6I}_$C2ObVgTqjIYS`XKn7h8h~hk2`UM{6(dGaOVETe_ zs1C5H*Tq;f$=u|;ANga=L#!3xbYBl7noIAL($(c&!L=w>`75}*JmP)EWmhM)8o6{W zY6kWo^AUr~E*IyDN1M{1Mg@IMRB-&~8GbL;y}-IEVlTt`39yoG3asw~Yq0rM1M4Ti z%5^gkSnDALj#YK`ZYQd}Sa$+`@$8Yr-C1J*F}vj*1Zft5@4y9;X65sVb( zi-CTEm%qdOWQdh4Q&7F&>Pvu#(;jU%i}OP-^k}#GaP>22qTp&Suz0zeA#t?=ls*tq z!6=;zN=bJGrKzAa++1oh&EQ0|d9IGt{^%g@+b?5}a1{2F4&qq|xCVQT`G7mH_gM+JAH@T%!5(Nn-aD|j zR|&Wu;FkbL0X~3d&;DI{-~P&#dFTD9U%ApJvHrbW@L@D);Z%*(slsRvo#UFgl(f%0 z4Vu`cwKoGs|4!HY_hZPPuJ^y8;5^xkbnwjN?APfiRAM49N~9}axz0^=r0$CN%2hj< zMv9)0F!k|ty^nXGh9L7-uJ=drvBKo+0U2}Nr`4-bC(jZsyq8~QwaB=i2JRPuyPDxX z<>ozI;Qkc2gMqu;!2K`u9xlre;C{)#tvZ7+uXNhA*gZr~0B z?kEHIAJ~{gI@4IEMpXcJ8uACKY6S6Q1-O;QxHAN;2(uEeC{(4($y|)TML&*m-aNE0CNhH$9Nxk{1u!P^0>W2mWQ=NZdb(wN9umGtNePB$E|1= zSqIUs1hgw0?OHTa$m13^_EEd4(5?W3XNq&o74nD%?nA&G#c&4#H`xe*yC-l*0k^+_ zyFYOAzOoRw|07xSIj}w5<#8&(k@^mBp9~_p&tgVFmV)E%(oTUh(ZGEmO3?i^c*^@; z6mahWZdo4BgIio43&1O1d2D68BzdGDmCIvsz7pxqr8#sm#?f9E$3TNCFq5E|DQskY zs*uMB%ER>@5Dm&dA+9jWe*wy4CCb-<@>ozFU{L-rD34{5|ER@*+DQ9V=S+hmH2+Fh zG}z70BQ$0=mjGvigmWQqCYUc8c9ZlgfnnU$VvZX9wV=6u1*ceOT0V4&dVZI74{4YA zcBW|^n9cD~zDs)zm`QU3biM9^jML2u@|m0;Gnmp$Osk#jU1e!+1D35v5liF!x(nm1 z*Lt+HleY3UzJoTNjd+K(u^w}*M5&FnpfJ&V$Y^6dWR}QiAJd{n9f0K(cH@*=NQ7g3 z9a!rkUSn8~0P7S9>pozeVt(1cdIVUfFsvqEeN4jYHng8(-3hGC5jz>yt-wm!CbV-i zu%?-xF|d+;k@j_AFF=jTWmt)W&w>+}C#ZoDy)Ndn^hH>CS@N;EDYO)BPnmY+*G)qz zErq?BtCL*K=PPe)zVS!j{?!z+!kc?p^Y6RARZc?re>H_(H8!mBKBQLKEQJH(cPN8W z{o>ziQc#;3Z^?i2e3A_#tTj14^-_Ro2-@M-DBGo_HPfif^MBJe0WgiSUD}l9ae&EkbZHZt zX|$%E-i7@U8m)QX8Qn~yHP`y6W*V(Io}+CvT60YaZl=+i%XeTijn-T$0nOgg`uC6} zZ_V>PLtj$U|^kJrPnCQiXQQ6SD(-o+gJJDeHr!}~J8n*lEZ{5a<0 zdmq7^9Pi@+-vKxZ@INt@x8v;TBfN(JP6j*=@CO*n8|lmo@L7!I{(w*6*#dYk&hRz> zo(Om;;4y%!_VGQaN1Bx0v|6W~7qPdpXMZ)D2Rw`Q;j_m2khkh4v@a0cGdZL5mUd~` z=mv$O72AP)`z3UwG zkLy)*lR9!8q$(`I=QQ`kj-SB0nBm=AdKbfc0C>HtSlBw?4K`;Ocn<(C*U=8FD$^yr zKfuDscxN!YkCoDDRdsFwUhnF$OWOdv;l^s!ZsEoy^vw!Nz)YR1NhQ z>OCgsco+2y&biHv)H8T%A8r(D(=P3SMsLpuF|c0m>e5CxLR&5*v!3zYYrJ11LBG4I zaJO^=bQpU465wTkHv^srcp_k-o0GHehj!ktYiFX(+4*~iN>L6%|HowBgnvD#mG(PuwmA%tgW^z^-X?%>@1uZjQ^q7>GeMbjbL#?3$ zPwyp6Tsw1&+-5eSJ%ZeeQ@+^y+1^D*Gg9Q7bC5H@Ogjl(+N}*rq$5X(JOoW!JnWEt zd&=N5_%}>YOmyTj%mfWUD?_Xf`=C@u&LO)Re<J&9niKLyIQLHzOWZJp2G>T~_ z&F=!iNzt1Uu(uIt9%g9$Ep4imF!`gl5zsbn7b+W6eV>EZ8swpUj=qLo^{)wl{_wo{ zY(InNQ#@T-P(zoNTF*5_Ihyt=*OhSCus!fSI0pX^=l)+A>y|mG>#%M~OJKWN`H8kJ zEfBkToC}FMU!p;CA~=$WdD0tb4_SBB`EeJ<&K!#S3M*xE%*msI54YD4hEUs5eMe;e z<;r{cP94X~<==&ULy{Tc#Ta$LVt*!P^ci4RTEM~NOLGS{GY;-#^EJfl_UI{;iZ$06 z9Ng*Z!6@6wR{hc7qaD(Z1&tX0FMyAu%(WIs-jbt^qWXyT!Y=jZWM|2G<>;>S)Q`i> ze4k2nPWMnQvIwg4dtiJera$dhnN_xrr8*~gROIJazCrr!F=`FkU5h=(vG~wP%uUdN zMCD!9g4+ku+)8y?d|EJ`wZJ>Kvgj?a7%lKOTCnDVX=Lcv#A#}iNvGlxq(CiHoxeqy zp|JRgX0x7l&XCYnq{XC~pz|c9fG(4jddogTPV;@_H1*P^I9X1H{6R05f0tH;Jp*0- zofi8?F*h-ZJ<4?cjnYl5z3*ZEMRRZ=v4bcRYu=zsOm)8J;SzffbG#wg167^XusvL2 zUG?UXFX-}m;XKj3r<2ot+@L$4=8*mFVU+efOZz+|#Cj9cqJ+9bcC*C|>)>8bR-)4G zMvJdM?O^sHky#McnPG6q1P*QA>wa`ls(ZZyI^xLr_PqPiFZR0E6ZSIDw|E$}mn@I! zoMe>yj%KH2l(W*YJ!KY?`E166cS>h59!&M&K_cTps=7yJCwa1dnjuarGoO|*^Fl$o;~|F>$Yhe#;b8` zymI7{G+xD8v4>=3sHX)gH-Zz%m!23nigA4-t%IO>fx4|&2U-Kn;Re??c5%(y2wYtA zNEgU*3YH0%U%~Znb%o@vwL0iH$Q}#D209&tQ;8RZyAz}oggb&^xBDJ z(R=-{KE-s=&ol@nHkq?6bY2$1;4%x&TT3Xm)PU|ap!*DHjRCDTpmGB$wBU@x#4#?F z;B-s>OX<0v)hh$v!$Y;$s0^!loh6j5=|gP1HS;gG=LFlTXW&E(`4(Atu0_bD#6&~J zo0Kt$U%7&?UzB|5&jYcN$BvQed=j&|P395{{xywBqWMIpwh^mmiu=mdsPBQOPTEJK zI7+W+Q6uMlL+|%lLMxP*Waq69(c2pRZ4!G6MqbrAWqciopU1*XEk^;1t;-1w8!@H zPjDmvyFv3WpDV?V5B7spr~g$r(t(vR=SZEt|DihlB#u~HOp$-Zo)f1dgwY&q@rx&Z zs?H^h2Wcc%mEIl?QLg1@X*?KiH%m=2b#~XBudg4htiUsYEm2%n|nE+=MIX`XYu*qoQjk36WH(F zWX=Qzxoonx?2=zJ_cY38d-FM-Yid||V{=bdSF&X*uxJ)Mnw=}#rz!EmT2H(5(THnV>onb3 z4`*ZYz=&ZOlNIONnA`bU>OELrQXHN3b6fLPJC7kd-O*@{tb`}f>)$I?ug&0>9;Q_*$W!dl}D^ zqgE!-?&A;VPA4ohdEp}9KbTJ5{-^4G5-7sjJlv~d3AUZvw$3uj-Yg~@sg#VNMx zOp{u;87;gH)DXuxXA8mkL6`#sTf;EF5aTwtnGrR^8RdKwD{Sn9|A?1c`FIbJ-k0K? zJOsq3mx=e@c#kK-V-h*@QFX0z|yjW4Tm%*>xB<~Zvf_c{~Y~JP06T2NrY_y`8 zj^aFq)&?@@5Fox|)u}B+jouvttV^(hi8cpeS3q^HVleWu9Rt<5)n&2CI{~V5sgZ;B z4OHg_GNymVHZe90QIkl_snUauEM zr#2XP!_0Gx9up3{w2#}V+1f#ACkPoeiJGGmQoe8c3AA(A*7w>i%s}1IhF{VcB94pR!U9>~Y zxf{?x`(T_SJq;g?PE9dhjD^i@n^*@Kw@x^Weva9lc23eceC(px({r-89eU z^KL%N9>excqS?MluOHNfVwRm|o`U(K;v5UA(_r-pzLCKc->Kzd9mwM`?`QB7%P{nk z4$XzxE0reypib=-NFdD|44a;&PMJ(QZHiL^9-<>uryBEUwx34%$cie?1FR-diu#h` z{PK!Y)U&*0c2ODAlq5NB9*d*dDAh-^QS1X_txb8t*$kb^6ZQ|GITS~;^^vguX-aS+ zd7UI*dWiX*!2Yw-m;`DG=C?#=r?!W+Ji&5U*D&~&LSNI&35-V__3Fq$m>s2=61!3G z0#?41OHk0g)<3dZAB}j0Y4mzlYize#*RWb+EzcXZKEP^?WwjowH;p_6&Fo&QM|%@{ zfY+|In$`M5#1pJmE30)(w_1}}tz#^kj9RC$TF0mlb1gMhLv>I+^DR z@fay;;$%9I#OUdA6Xxh{^w8R#;+7lqxS7^OGkR_X z?{8=HaNWI#6)^3Aq?yAkC;InJT^LC70-@PXq}~r^avE4gC z4VO9Ze~u2aMiFc*<-L=SrSUbftaY4=wvJHt#`W%4T@ZWY`f#AGFMH#1+FM6!ec~JI zopofNM7`6Q)Oo$Pb#!W(bsgHn&9Dl0^3k?^8@E#_7;9f!0Y5T~yT@Ux5&^fuZruU+ zT|4eC0VZ2D9`JG4D(~L?s~D4C)yHIEZ#y7cZi6*IWP>}j@!&bdb!ayO3NUlaavY~g zVw`>e(&ytew<({1c7C#?IG<%O^0Jd9#d(yy)5((J{3T%T$&%u{g{AQk_!Bw-Hb&qh zZtqB0#kBEY#Dh#5|AHBicLeTWr`_t54n~%U<+Dp(gd8Fhg zR4GlkqNQ^nMUQCsv9x3wXUF zaEEpW@P-*DR!9e48i6~s=UdDprva}#0*5mW5%2yE{>XimkH9IYYyRc<(y6Sjn^2c` z1n$tnQCGOxV({iB)I}q3hgR6)H)0`7CNKi?Hk`B&Zs)HF)iM)`6Hu-_u4zOQ_UTke-j^@w>-^t zehYN{#bwatmAHQhcn;uofWL&UUoJq1K2QR9lMe6M|G2*Yw*xxAgXz2@51!uoK9fIq zpg12e>Rk(n;ySc_Ov?${1IXVzh>fcAFfa9IK9n7r!gz{zHV;*t^U-gx^Uw4GC$qC1s*>u6s#YxUyw1KuD>NBaUV z?^Ef`rjcn9-dPwyyr-(+3O`l7m7S_${)ibL^(jH`DeyGdI8{YDc*6TsRI_QyvC*oRpSe(euZ}*CmT>9*rj4|f)i8j(! z&Z)X4aiZFxoox~)svX*wO+s50=ik~%TX`?I*QlYetwXD7f~GVi>g%CxPjY=dR*3tf zd5RJa8*Brd4*0SSz6XF^x$q+ZEcS7K%rCz~%e{(UeuuVA^2@)BkIrVJ-u7zlmp==z zuU~#uw>uqfn+dz9Zuq`0#=i$`+wpIb?KHvmkQ_HoDdamJRr@#YF&TGzT(+LDILcOw zeq-e`59Js4Ouoy)yqMi>slcq5B;$0ufS2Es@vn8;$amX}6C+ByeYVPY107LTCjr4Iyj2*Sn*7|1X$5 z3WPNZ@_2J%+ zaUG-kC4R8%ez@llZ1wt)9NeNR9Z&_)PNFNx#%K0-yNP?8evz&?XSs3uqto0y&4Jp9 zo;a-j#2%&}I7YFGGgZQdJ25&RD0K+bcaW}#}xukDUum)?XE6| z!6j-J$&TM`qu%1}Illdb-wSit76V%-yd<>v}B7fo|L+qLd%7sI|Dw#{9!OwCZ|a4fWL* zkMbJ zRrM&Re~&?bB6zoxoeg@l3d{-TU-+gx#2SfHM7SpQZC{xzn}PFJ85n;1qq73I9DIyxy&Kv9KDuZBpdh?R_0Qjdfy?8it~A&H05=VwgqdpV0MpJ@Md!MWE+hm`(57qQ6kMR zLIv;LT5HRdX;g6s%3{#3H!d5wP#oxm9%7&R}htX+*Nm8Im&yDuwPtviLz&5F$8DCT&Tk4 zz&tCXP8qIVRMly9%CKEdrGM**QtMmU?b(M=v)GXpvm4QOE3&<1fBW;x8ag0LnC|`Z z`OD<&AoP|Xy^oU?e}{gHd)nEFfNKHskyP~Uf3X+~#!TFaGy1k#TuN8S*k^jvhj2%{tq&t*$a2K;I`wpee)+d$5ls;d2;~i4`>@$>$=a=LA z>iKJeMfwovUYg5dcVq|Da$GgRRD#M2^AvU^a`C``!O1SGlxel>?IgzJz<94eO;xAE77NaM zbDTg9UNQ2-x%y-E6v-o<|LOzBF2Qzd=ucLC-dDfjHyQ_88Rs(V*rfotibc zFF-S$v`dY+TkO_?nutnalZw`J+JsG`UiK%C$lKK@=M{O#&IiZSC~I>5R@ zo@=CM>*+JvuC$$0-ph?);0Ax=H72x+5`rGGcKu!S@273_@130$@Po3p(Rxp`bI<-~ zn0@^Wn)eyAD2@W)y%^M^*TrPa4BXl?*eyuL{sqk!O0WaNW4{BpM6SQ;J6j&@OSYGT zJSLjCxwTDtevj5b)H19==7UE5_mQ7GYJ>Frgr9aeJlf|he{c_03i~y|Y`;cze#`dh z{%Bx$f$d6QZ;SG%R445c(T)!JBGNsZaE9-X$VdBM9_=MSwAZTh?fv6{z#n4`OGGY?cd-Za3Crij= zJd+Q#Y%*Gwz}lDqD3(Fv0F7bLXh6}x$vr{cS^~-?GCpj;t#vVHAB**`oGX`Zw3oUo zMfy;rCoAdLeV86GAG@7h+FqQ1(7m8!wi|}|68JyGJkyZSUer5<)zgX;UgNts5sPM2 zeZ}_Di2BojXm1DWZsZ3Y&4!(IP2$PjN_V-B)gFI>j^ z+GwYUOS!s{{PsCtUS{!}GtV=a^JZro?Kp8NpJ#sioX#S4cF8H-%<|K2l}CG+!JOI$ zKt(d>D!H&oUz4;x$nE;FyRkQcCjie=Sie=_Da4bAXAHhMwin-x`zM|~`**TF_?4@I z`TJEce?Rv!HPT%sG>+dTb!#782pnMwSDnM5X@?4WU0h`L$DCPpHemOF?(L9Xy0s{* z+}veuhmacGFkOTjrs43sTY&p@Veq@_(*A+7BI

      %dxS6FC>^2W6Sp!!Im4HL@?knX4Jc3c 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℘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�Y@uk_jd};nZUs^WeORKhgY2AY_ zZTj=2-Oqe!e-@XD6W^ysX1$`3n68l<6|I2LHFA?80lG$RQ!m9}cPX?CzI*WWxiE-x z{E4{d8o5&)Ij8H~Orj8~DO@A>su2k~uiwas>Kb`KEm@!koF5V#MuGVhR3lHSH>cJ07M_7dWgd{ z@}|o12|f%9&M3>_8c7);HS)Hafn`DDF^4#LL3aFgaI0(NU3Gd5{%?T$jRbQ(>Kge# z4aDE9sI~sc1k|B*jSO+Uy-0CDT_e4&si^TJNVA-ZpFK&Xnca18gelFOE*fm>()7Ei z9_Z4Hbba?bzI_b7uNVlvQmmwddoIlau7ba5O*#{WP)*^|EbN*wM3?objHoWnVy<}w zbZIUnxEuxMQ&4FpxacoGP=M+@y{7Vw=b-sF3mcw@fcE62ImfO$PpX^ zmu3^!b68D4P!Z(DLmV#6wyxLFixDT;a=0`pBcwFDx+Y?&DS7lHPEC*Sot&7NF zvQ-;`hB78w_2+OYGk-j~kR0tJT44e-^e8pr?jDm+>N$J%8i}O1XG1*|+x8Dsy zmGdV8sl0#+;s~cZN24RxVYJL>B9O-nsy_%;vU3~M@^Na5nEBfoSPussKke-7elHQa z@cX_Hd7+LbYI4z9~#(1+!r1( z{xPi~FUCK1GG8V*yXkInVZJ<5oiER}?eFVDTgmsxxG^1`QlnRA^lbG>^= z%Dhs1S3F^@dyX&5m-1!BPQI-Cf-kH7=F2PDF&Pu%Uz5O>`wsm>_vMXlk4%qd>K-QFGG9t<;ih;8L^5lqu%Gs=u3PVw&u&UG`>uq#FrU!`7-kjzPxafFSF0_W$rJyRQ&8&lz+r-MV}9?M0+_z>{C>0 zD$&S2V!xunY$e)MBI1x5u?22gXc%!+(Q>d#J(s|JQhki-T8X}i8u6*3=Q96uu=Pg# ztd8Zu$GAts5{SbWdH|;ra0&d6%8?zP*n~%ZL>+*Adx?`T29-9#?V1U!y2XhtGH6{v zL`hfaZTO}veA^KxJECy>FOtX`7!*WQaDCYrGhMhJZsAIY@s1I3k<%Fc7us*${Jcn1 zKjjozeH2eifimcza#xr#7W31zkTQ2QN~-eC!#{6xC#`@Wy{t2LRZ6Pz-ufK=wYI_E z&5JE_S7&~nw`L%0o$Mv?rUSKZ0)K!boNjy{!R4bMPAt=sf4lBtn#zx83*%s(6H99^ zayJ?A8UBI~wyFxG7NNr-1ta7Ih`Pm`yZ8z;p&fv9vuG9iEMD$5Z=I$uvjcq+$XJWU zr!?Y?;2r-wfE9nDDS6Za+VR}f0(yi^E#T3w)PikP@=^f!asRfiqt_9?9inyP5VgBlKOm9tkk88nm<7_RUq?%grDg0+8H3{I@!nOd-C8otsEwyFiBKB1Q(#nghv zXxK@h>INjmqEZXGZdMu{3uKZ-sTNStI)2(Pt>U{g5FWLFR#KZ1#jVbYhZC=iwvm+ zU!1_MZSd_y96!yI`j_I?)Pf1M@P3c`i551sfYQjdfR~WF`!>bHkh5p#1oW3FDURol zDIsbFJYO|DQ~hqdhIJ_LRJ(CHKxi_!rur?Oj2&nQJ&)5Ri%Rud(8i_Fzk%GdC{;hI zQ%=RahY=Jtk0zK+&11LJJRTiO%_FO#sd+TN{lC?`dH3+uH)P~E9KKBm;A;(+t$BaE zgAbg+V`T=|mrNW}^IAl}{%LVyiwvoGi{kM4PxyX8$Tq4I{@ieyniuY%E5QBV7B)4H z(#SQBXV%?!?;#s<_M8IW%Jq@ow&q>mhyVOSuBr~`F&yD^XKLQy<@hfup`C!F8dNU@ zm74cYC;4RTC!dw@8bxk8{bK|d=$jgyxXaort%@$XdKKlHSeoI$|1I@0wjsh)K*-nyIMU$ff-B%22Jku`fg4c*$Vz(_l33tlT-Npn6#H^doXl@KQ;={a=u^^)>qVr@#T``uD+n|5mZWR*@qemX{jQ*)P_^I0qE85MYHyt2avnT*@bqJ87j zt3g>UaA!`F;+Ovq(YA;GxHRyoijBKpdfuxk5;%(S3J#SFb@q)P=|teK)1iD%6R{zWNSdc;17ojqESC zu13$GjzkWYTX&<2s4I~}OC`KABQ2U?ZTzL(b2J=z!k&CpK ztHDUrfXHR~&fTCbYDnZtedi?qULSWG6+JDgVV~i{oyaXJ9L0JmG|Y+Iqi@0*J~0|u_`bf&)nF%TZsb9I7nA(TKB#+2Q3X{E`=$?Y zB2TMf6p7>SfJ?))(IcG5Gulfvq;YcOIeq7HV)C_r0#zj@Ux$8t>Bu(Ad_AZ0UHWRi z4BW++K_BB%r*(B16l_M`?mWaP*kS<;Ej38gRL5z8Bb;u0#P$)*(X`f{ z{fcS5LFs2`P9C!R6l^;Qb{l#~CIEPbz&eL1Bw3ycc3kieG6wfc0jwpEBOtmkdJjxh z%-9X|sAV)iOpMe6$|>0Qg;qL(3qY?DgCg*0#`hFU|0Y=6NHXse3cZ6Ejq7?KV{pf@ zE+>i*iXX3d_ZCC-1|{A_1AGseT=qmZms6-rlVH`nHFiM6x#=&M z--`ZT0`{kyA2i(b4BcE2qzc{qD9AT-b5)QQ5zy)r0O_0|yMIHUKAjKC#-(U1i zvoBE#qWimgQsSFam53hTqW8=L;RUXq0q>@|)Lc130juQcu>au*r#m01jEo^!j;l&8 z^h14t4b6zR7>Z{o+UGh910)4dEr#}a%88C}{TU%1g$~C-=_uEVX=rU}D??Vph&PrUF)dS4 zhOuk73(leJoUMS5U}w=*DJgx}_06}ho)`!J(R`N;{{7hXH2g-g%L~80?3%LioomD$ z#dm)Ar)mEwOYcvH{}8^*-8vf>U=%esAiDteedT<|1CL+88ak+4W z(~a*U*ggtk5}jJk#WWQUPI<#KiEg|CO%T|sF_4yo?j?~jA(96JArh$i0U2yjN%ZKx zSTjWEvp{BAloGuN271T82B3TP8BX+bvuvWb4-F*xRRqf_(YxVq63u)`^u2Y;*@N)6 zfO{Y^oNj!d;m$`vOron|98ZWU3{I@!nM8k?fW>HFt6D(n6M7I_ljy~3@cvI|Hy|k% zl|*~83py6aB#Tm_j~#^q{>2FD`4=)&k*$Y-M@)kmx5$o5my*$9O1; z?0kSxS9DK|@W{_8a<>FVe0y*3qw(JJHpBLJ2xQn9h|DU(eu2NqFy>2!9l=<;`7Gs> zgt%%r!s*5r0+)}1m<*f$iDH^+4Wy&tnGAauTPYJ;4FNKO(6*3bGAu3@d!)ltJ&)5o zi%N!V!OA*D-vYA9qLg8~Im3=aaG9Yn&ZwfL+7!T)k%}4N_Po8CbI|=lRyj!1r;>x8 zn;axR$Fl&ss3QAn*4vF$8p zf{~x&xjLMb+}b+JU^E3FIr*6hMt)A)tytrhy-g2YBx4B3j!K8QBG-5fYwkIlk)6yWxMPIo!3=J8V?YN;D5*h;^lMeRiu=r98Ftuf=> zyR_F4cwv7stUe9BNCtqiC-FiVdZ}pWr4K=f@%*D#S1DN~<>FORWuK_)a*CITiA|s` zCnmNW6|}nxy}!mL4W1(pN$g{UD&EXFwl38X{CU4Js%||hc)bZgY<;RkdJ}-yWU3h| z_B9tcZ7zo4j|p_&Z#LRL9N~25Xtdq>k6apk7RYRa`mQo%EeYs+Y^}T=y$*Pbq3Bnn z*!u-R=~f>b*+c_TCvZALlp7G>s{)s!DZS1<;d0`M@(WIXTS`5qkcA*NExG{)6GX|0 zlo!Fln)-6V%ST29rv#Y+Vu$YUhpLwdJlS$67!#dXnuLjca#BNdC?u;pIH|-VjT~Ob zLq-h8PewQQyJQTDP5OLpmRU^=n#pQ$ODZPUsCF{}|L4!4#d<-_({(P;)_{LO57JhOBOJ+~v$bU{x7#9irri0N-kOnXKOZ zx64^bl+J+rSju{)=&bhTR$9t9z_W-#n)xPxk|C=LoJIbu1isO7C~_v6tiFux@hPA> z3eHL5kw!YJ^>i|s89f!gL8+CfPTvVERS*4hiKO<((o$!;qFigS^SAr(txF5VO4Z8a za!S-A-{_`CwOJbWxpQQgi}C+R_P7}T?_`dP@&7?qxETMRWQ2?H-y+*wjQ?*k#g*$f zXpH0ke%^Al*$DVJV)p%tHI007JY#1-p}3U!^AR8}g{)Gzko5@{GBSle4KKZBEpEV4 zxVh_#8%SoS2zvhF25liHnY!Wzli7(Ip}3*B55RdEU1;2}C^-EK5OK%DQ(aEn3wzfp zHZlD{y8KHuGT|AFFXQH1>Ann9yis7}o=sT#NJ8X5||t%7;XxRq~il(3B|0)6FtVSVfQJ{~hPac|8)gb|nP z16oHWvB1L-FokvAG6vmw$xmGe@GjA%H0BISo^^3Ij}wyu zLjjE>m=%a(*aY1^5ob5jcCuh0Y@46F^@X zSVYiYfJ;V%biu+nPQ#zT?-Pg8;M;(h@$bdgz=;g`Yq&&{ADK=sggP%Yrzqt`fsp8P zSg1$p)&ky`I6-orBXtXh?0ZS%qyQhBNzPF8PbG_mw7MrcPX#_FlbktcQI2sTQN5Hy z1)<&qzR_^>ppWW8bbT~mPz$?{M}_O^a&u9jx==6W*y@rCBL-VtO7e|VmqK)7stYa6 zf1Khh^b)2>aD>yHtu8rw3!DU~k%4`^iDRnE@BJj=8{k(A$5xkCfLX+S zf{&Ll^wOQ%mn&Q{?2GRcwZQl&QjenH7T2mFHJ=;}gsAy8dBi&LOr_*s&FP;HmQf5tZmS^8ZJ|9G39wZ1iy@ z`fdOJk#Kw)=}-}`$LLAEUc!9`S+>!IkOdnTGE|37hnML|R>3Vj37M{?C)q(x-II{% zT6&Ua55TE=l9_P&FF;4>Nrokd@MlG8FF}97U*eUXWNC9ehU7U1A^2o^lKNlh2|4LW zdcG{3gYHTGnkl!sC%J>BD5xiC|D%M}J;~&5`qp#m7&0&Jtxpl5^dw|f=bnW7{(w2X z^9z{trk;epscw1_er2>x!xDNuGd;;hzLBQkRk|@vL-m{ZKLDm7RJEnBWa0>?JKHpL znk{fAK&b}yl_HL58v4AB7dk*{98OOYCy`-k8s4dc(Idf2aat9CrD>qe9cqvQ?*ZCJ zFe_l1hCe$w4%G#94$!v-&e$|e93>*|0C!%tBDkZ;9#RxAizoo7gn=_Q4byVsl@+1Y zW5AmdhtlAqziZj1p*P+=Skpehhgdn9BTYm93L!eK>A>e@k|Rw+!3CIbrWCIOzAcj+ zX&U;6i_WKjpU)&mnucFKa5+>E>UZF`4JR;tz)i!P0!TsU8kKcVQgcP1y3imz(33O? z?n!zD_ayCudy-FfyPRLCIZ8*xdmKkN-P!6g9j}%QPXjd9z`nnTW2#FUrd|^Pskd<2 zM4Sfu@lfvAR56 zK}3`WUcqo|Px4ZE5z!P-2LorUF6VAwnJ7gw1o&9uP#S!3@UqqAbR&s|#>~sD9LO!Epc#5q@(&AERg$7z(T33P#tslXKmWhPE058)9zXrFo!L)Eh+Tgw9)NL>=9FaCS z@*teL4K4(yKNV_78~h6Xy+TVh4!}#V?2tD2^U_%1L!PA&f={LmUjKs((Di7(&#%&~ z>NdC-2HQcS`4zJS)uZ{jn15wdx50VQ1JJFfE&gwfHn_%Vz6HuAqLDU1S?s5J*E#YR-DF*VCD3I3a{xr!!(9(($`(>B&2f^b3O$or#WIYpynnwz}3}`jMtbl2<3IN_mp?3m0Y~YMd)}96;;sWsR z497NEMF6viyMRKGVH`uICaXM#%@j>h;AMzIY4Dwgmu<4j_mpTF0B=nk(o{IoWIdTI zaSZ@If;d5Pq{$lotjKu*_~J}*q{;FR5ILKH@6IGgnk-jumqP`i&H(??aCDRP&jD$& zXd698+C#eSlBJ08-E6G>Lp zG?N^uF4vwCIhTN6%Oppt%bO37T9V^JB?!Zz^PTM}R2R61!>y#0>K@LT zC}QiA(Lj1QvQ|hB_sm_Fa|yT05$PHn;dEnqxI$j6YsCFd0EZ3e`+*s{hYRbVXU)F? zdc`m@^l(=ot}BpxIJ{6d{AUFB4a1%3;acT)Icc~r0<^ScjAMrG;SS-ojAYaU+Ljok zl&=+hGW2k(r$7+kk(NS%m}h#pdN5v5xaUEcM>NtVD2x46?>aXuqmslbEGaMn&@%+H0;b7&0b_RFGI<%G*A1Mp z$-0O^Ig5B7_z}Yi^l*S##6>_q88~B;H5$DIr$He@v*X}2_;ypKnAyNijU}2m;1!8O znhM7>S>+_IX23gUk|Rx4a(|IC6!=q_lcCxd&q1HnC9evAYfQJkgU!ut=7aJsYA zB|qk~8Ey)wgMoc5h-0eDw+SK6-_TYK0X~8_of($ua(@usrs1nzz-fK}mg=(PlyZ8K z0&fG_LNF^}s>|;mDTjB}{s7Qf181x*^R9}B8^HfG99vx?0keqg$gKQ0IEIYXWqTu+ zPD4fDwTMG$@LfZ)Y;{@opG4CUc#4&yIZ|C3=a;yi0zNg99H}l7Vq7}KD}cY5Nsd&P zJk>?c0pKSy$&u<(v#QIXf>1vI|JiVKb)mWts4kufSn&W8QQfz#iKyElYa(LjqfJD# zCd~2Np2!lO2}tOL*F-TgvGdUq*evMT*$Q=_MD@b~3Eu~FVCSPHbVonu_-Wq8Pjjt) znxFU6yR!fKD>%_`*H1<4r)I&4Sc*2VRK?qf$rG_!IZNYzAGHBpLBu$W?*CxBgSQT> zeet(xj@|8jH#_|QA$OSf9Og>n|0Q>J?*x1~G5!v@b9on>2LCR(^Lq23kmK)>JIeb9 z-ZSI>BX_iS@MgI0lRKu_=q2D_Gf3Q&Xx42YZWQ0dH={-(-o-Zw&HhF?#k*CzeQ1E1 zeTR{9e5mSzn<~xP97LEfMcUSA7Wp)g?0i$Z*-+HO_?&9vPV`RAE_i_CR*gYx*sSMt zNXw%-Ah#Mf>xP_(&#QVtT9anIE8!+e4aH51oUVrnM@v~9K!dp5+ER`kx;wb?Sd zDZ@8Co2{XnvV4=;>@B)U;G2HUHq%XcwH9FpHY;=rqARd&Lz;DshdPziNW?STi74_d zCZ+08IYcz{D5rG%^9bQ7cN>{rhTl@VzK1G6QDa!?=B)wBp5KJq?rv{`SeH}jB9@kv z#h>rt)gvsS!=-(g{Xj~yyAwKJhhL6Qkz)y63C@wcNjV8U33a^7ufhD+Q5W=gU&6oF zDNx)_PpXNLIC{}3graGQ_xA28EOjatGP^y4hK<5F2(cveK8O$z-;r~08IV)lt#Iz{ z@;>N;tvD#V{UkrdO?BT-a#PP>E-RrQ?^-}x?&t<4bygLKxbC9mt#iniP6$R7GPMBQ z3E?3$S4)SFPbAi`Xr>oRj)E~gbzLEl@35c?L?KM`Qm+t{D}+MQ!?3?-?7BD1C;Ht8O7+oOLM-|6Mx5xk|TP_836MQoj*b|J?)J&{MJP9m++p4tyTN&$+}XWn z&`p+mf!w*gGrz!J_Fp7-Uhk$V@SjcYDDT-6_|GACw09Ov+U4ewJH~tGMYtFI2cuaD zZwlVO$}OZy8t?eyph@Z~Sb`FYb3UKOJtxgc+j9WDTY;FI)H0<| zL5?ai2GXISMQ}OY!`!jcDA!4Y)MVm)q{!?@M=;Or?)DcL&4^K05u0}H3euOwrM4yf z3q?6dM?ivZ-@3a!4f~-9jmd^oUr;onq2pniw+?!pv`Jf#q~nxQ+6^oyGV*d#n~w)P zklUeD!s%&tQb(RfmNjMHDONV+kk0YcmS=&to#NC=1I=++plI zK-}Rh*Mrxd@{?GCo19aaaJwWTex8N>P0kmI+ufCGEdEQJ?xx*m(%rOMPl}wi5A8_P z-JR<)<`dK1w5dtDn>K+-k+b%pjZQqvuizg)6{^zSBi^Kc@v2;t+C<0O6diyxuMpwi&sjyay<3b8<&}55Ed` z3v$PJ*S7?xCAmv@+oH*@(29E1cyC8?wku&W%0dyptsbx!d(`Y!wP0J?J-Ly6}Mb3ShLtD4>2utj{9uc+Ph0@(~1Una{ zQH;*u5$Qvn#D3&zsP z>qn4N+}Ck_oE65{gr_R?d}V5xc3^qABgjV(oxqRAWk~)#)d6OA(S^d&mNA-;c5EGT zU>y|lTE_Dns94-O^%;i6YO+G{4D5V!RD^c7Tg zhSHMK#JnMt?R$tx(se7Hx(a{eO02?*BWa5o5j~&>eDj4+zSE91K8l%7c+>e4x!s%J zhrD|vfOIXFn*bWbgTYb+(U5`#3jP@_Na({sn`D6xo82Da@409n9NtPZb2^@QpRzK} zMLXnZ_4}5`)Is7H9vKY#39svkPbu0l$47jZEuJZ%zY1`_vB?Vt^JGQ+87@QfvX#HF5nui)rCV^AtXI1>`cmm<=AqaI7- zn}9gebtYJxhX$$rDc7SzsP@t-;h<%|Y4&-sSN;J_$yZ0u*$3mCww5>0=Qw{sm8Yy_Q}D-N2xaSUKKG4@s}D# zIu47+ptMv{$a=VabV6wQn?u?ybg-pvP-L{Vk%m%dSA=J6E*aYCNPO!iV4kH8`_jfo z+BdD_UBtoDU9=67PV^CWdelWVYZXD%76d&tI(#|IO_a*V;or{?UKAXQ zdR*!Tt9^-Z3Z2CcLO;P%L(|`;^aaC9^m5VRABs!9C6XZL|Z$F>|K;4d095? z^rU_JPQZA)R6+I~b{(Bwsn#L1^Ao4cNo#i-lD1OZv=5Yce)$oCY$H$F6)GqXhIPSL z?n~Wv(JoP1{IGg>MJ&})(S}hvF_fcD>V~%PZp&>2Z6XzbbbH8;=fF>!L!HBv1!*6R z0RK}8OS?>Qu|NpsGfTbCs)rtcZ=jsg-Ly+nx|_CfN_W%pc?@s)OkHJ)8;zr`wn+%b zmDvy9TJTMA&niG{Ja9PQ;WL)E!A<@Hn3FC{+Uh99O*=aw4nEU{LFsNZG`7521ATbq;lp z&)r*+Kdsck-~ey5esZR}X>%Hk3dYl!)*Pj~U*&V?1ai}|qjV0G&Vf?gv;rmFy>k_b z(P!eMxN}s7@+5KqWOHVD;Y%iEghABlZu%N*y88g1Z&f8X`43=Dx}5i=6Q7K&DeiTo zBstUFw2w);n>IR0cPGOfobH~+XWFwQ-A$I`bPklxfl}OLL`-*+aTdACXX2!|>9eOj zNo01+w92$+in|}@%ppXb?xtPL)7`PH=uF?WOm~z20Oq6%lQ!l^alba1&a^)VRE675 z54fNDo)mZd6trrd))@X(A&-b(FfUbg_jp8#nt-!^2^!(F-`;UKRX0<8Tn#@x57rMZ zC+*jUKrYg&^e&4$!N_lfd`0e$3E@U1?GF;Po`RC)KzsV>#pTIdW#3jer(qwE!}w~& zmlrV(UeB+IPP2`4vw`0#!<J`D?9}7}96OjXJma9cmcbwv;fBfS$ z?O8h09 zv+g5{uHC8&8xb7$dopPT%_r1FIZOF%F^Xmef_L+Z6a(7l=y=`xoZ9q*nW|ULYv~-Ge(ReHM*U z#;(S@xejn%seH#ky@fHAlXNi+u{mQ;6fp45O4TQL^K+!Ya-3DtD#YwcnuT+S^VHuZ zQPfF)xKz`AsMkqyR%ag3hZc1CIR z5|CdF>LY1-SgfUdv1o}%2|bSbiG!v1wil#2#iGu4Un`|fs@&%S;f?Fx;5)Dpn28j4=L5=$F|BwaZ0pUZid zQobATQ9}`(nR0RIJx5b60{+QTbVN+K)b&-NIGAV4hC`=3NZre^k4ws90hhOwU6jvS zmv6^!#*R>=OJl(8GEz#=_6c!949U#t!l6ohW(OZ*x zVL1UF6BPxd2%%CQ{~^x5H})2^8j#u+Ezxiz6#nOZ^y{iEd^;1u&tvQZ(&*oq?NS!Q zfQ+)?V)K0rjqX&hC#~*_K$aNP$JMpOIehXV>23jZL~1>tcL-+DRr-u_lK!jS+~s^q z`knxA#)j2pNq_uHy1(Q@q5J~)@2n^fI_5{7P(99h5=&cf1l0)sI%pF9fMCQV0)LD+ zlrz3hb|DuvN2#WfO3UdCypNT`oPvEu3~-V{)C3qjsa03wfxl$syo8Qg55!4#{W$9& z9#y?7cATUj8$myAgRFjJ5UY ztynho%YCfICB+(po@#>xBFG#|4pp|f1Q`eVLK}p#DC=1Ks&tYB*#P=68-zx4SqF(w z7Y|ADzXAPU8|26%W67h2qle_Qb>dG5n?y+ooG9J>Tkb2Q4`E(Y{A2PD}VbUr` zt2Mt0@jsAqV^pS-%3|#apS-0CTUezx5GBfj+2|2${j};JMO87p^l&PBgFfkh3KATy zmJX?oROH6o(dCq_|Uxv}g+y z*WwPv3KTC^ocH@YGdp{^U*13VAp7~wGqU5d+oefdbukRWtrDXBU#gdIAIeW!9UN{} zmlSg`%g3?woxDQdsiPuZ>nWmByV4mYbyi{a^2Ec-w?UaNz{odsQ6 ztBlA}T#YssLAgPzIovW3EG#R&NUWOABM@EILQd)cVL36(r!2mJ$bHI=8;3SP7$FXn zR>DjW70^Nss1$Pdth^}RR6U7G5H-}ofH1PKf_S%1B~*8ahG}6y7+F|R_|XmK^q&pU z3M~xqnlo6G$W~J&=5B~iYT?Tml?ec!p2U5-_V-vj;|cN+9KCgC437}=ovejS{QN!PE_jE5xZxr zFy@A`)c>lLu&#KE=9B%e15vyG6)LkFqk19=uVdxT`7kIa#8Dew*3=jC#;RB^2HzM* zqm1!GX&~CKP%%0R(fK$+!}}W5meoq+&!!rOr{E!H?N~dt0EIoI4~B}$No%nL<6o{U z!yzxHoj6rku#>jJjlncKX$W}_?L=ovS(yd+(q4q5Q&sMG$QNrT&f^I1gchF||60e2);RKYSMS@h%tC)@##AiTK74uHsg{Ro;{St?zV@q zF5)G&YV<S|#?7+Kg?%&Mh?ogo^eg#lq?VL!2HnhN7g zh?Zz!Kp0urU;K--X0LyP=$IA;gmLo^2;)HU5)X~@;~j|JX(2yhR+ANc?{^a(bF9dm zMCGeg7Z7z^0r??7UG59y!ck(u8f7~Y$||4F$Vc|N6;OM^JZkgysg9716SYug z84m{<(7ganBFXQRr#B=3$2B55jWytsKKq}1?7yeSIWC2xhTr>Vo#KwqD~@@_2^{V^uunU`Gw976ff@IFj|c&re0vMc{9 zKvZ1|DVr$GO7SMQ>btfD@1r#V!DC~q#PYUEI0>TJS|~%tn$==nUFG3=@Eux1rAT?W zMwla%owMNAwMGVf9kvi#YsG%_W;rR|fV(f-F_Zyk%}*jn9pzUh@Z4G>!^4_&;)+*k zDuUP08tE6kO~_g=-eIYq{fYtap*7Mk)@&6M`l>LG2cM}myE!3QvrQb_sx)iCw`h$F z4{NrIqc@c1B={Ark?F&l9b(Q%73P=V#uYp6GR(AMY5gt|Oi^J@2cAc30vZJt?iAV4 z;o!(cLR41^xuTGrL>BH6$1xqp!p;y4(n1P-h!oOi=dIl$5t?Qe&V*>C7HY5M*qA>b zZ~Y-opg6Mn4=At1qYlVt?7<#!v4?W<67rC%cKjU=WQwwSuMp^0vj^c&meOjDU_dNc zy-!@kyauc5K-oj9bs(I{=fFts7i|_OcjMt^zII2?giBnY`ha+khLL^Q4CT?d>fi)D zC_d~|>c63UtJN%I4+4_^kVu0XifxBsb~QIHS@u~SZ2O4VhY3_xSA?>mR&&AxtB;CP z&s55HhjLV0b#O?Ii#IN%o(JVxt>$hN**3hKwf+=&ak7j9u^*z7afF7s0GV$6(7#-D_ScljVR9hbxt%*36;4N(%j25EQ_kRwd1E$V4a zMw4${5!+`8V_a9LW1x)vf7NXJnrJvvNZT`@T%pyRqQSPWi(*}{b(U=JhVtD1t7hA` zME|iW+)tqVq}80FWZUp^kZ+53=~R%t*O3WuIfI}ODP)Ux#V1VMb4pZ%sE!tLvIbbZ zCw5`f%K_~KQEYs|tX^~|o{BxiRHHrvqQzQBYf>Sjvd}~Lyf>2dnJ9ZiwV^v8I-rGA zj16zwh0weZjT#AK5+%=d@H@7~@E+R${GT|CV~gVj@FyV84HZp=--xytEildul%25b z0!+?AlhI-Xnp4K*fP9W?#vjD)K0@MVK&>6uQ*)u3`y_55bFk|{KqDO2jD?vI<&^Oc zKnon#+cP2uCNf8y#d$S~*jAvO+I4J0j1jFQW`3GDqZ!%1faDAhr%UXD%5a|CT#0{} ze+uG{s1KORtcc}d=AUCA9_XI!d(A|h?A{OY^Th?8DVt7jwnIzCP8&Fgt!6Z*HCCbO z;h^Q)5unWG9(&GhDj|Agawrg6qY?u2xw)g5^6+QkL-EWMFOm^YGK+Z_C7OLbL0nh2 zMl9P8H(k>ee@gu0F8s&@Vf#7E@6nBC_sMSoE#7T&?;+$MtEf3KlN#6N0WXeA76{rF zXvF#kAP&XMts|6;`efrjAnAv9Fm-mnFwdk`RZv&(A!LIm@tnYVD@=s2gt^b2?fVX* zW$_8${{dl1GcU%^T=DIM=ua(llFv)uB(_SMAt%(>_#Q;BN$6Bqvi4`8W%m0)2~*rg zuNRjTI+b%Q3(J~~vBp6uC@Mh|Fb~Ssq^P`^dZ?N<=&VJ-mLkn%J|&t;BIW@t2YXk^ z{24QL?A=O;w&IfEaz;hmNnJQ z>iEzj8_EXmM9`2nzBG?KQ3+56ypp!TJuPXYmU-op@~54)A$wvMP9w+EHRogTlh!Z9 zFz_kbM(sU1>r{Dz0M|1cpr=Nw7GecNTjCS;X#!z=bHAy4JPFZ__=KOLAZ%d1L&2xj z7V#FMkUMq~1bCemv$0k~v+F2%SVn|HR4hJW@k}Tpjm)u;crs+M21L!`6FyG_i;c}< z_3>6rL{apGXmotSDmXZ5H8KCenhLFMiTM!y6rZqGRd|ilmXn55QjqY0_*!$eNo^QU16*h2F(!3|z8=>Ln&jvyrfcd1bN^mV&5?7V3p1 zC5$$k#VTPdh=J?VM@3WqCHxum-LjdwK)>i z5l7|!ExjV9)a}gSCsn;T8pCZo}$ezW<=wmu*mT8mgL{c}H{7C&e!j zchXO~?_@srsFvg{aVOa%?`(dKOv)`m`hUQk)RMf58G|h;%q`+hB1zuWOoh6I`B%i9 zw2{1<`Ez>}zG1|JBI%_sw^;qn&DhMwQ#-RET8zu7h7IqnGAO|V%yX!LS+fKDK#=A? z(hM|xm>y@%b?^s4n)OrQSFAa-nVOh#-^WZau0X%G(U@$Id3vbwD>rztAWfs)&+%mn{YYq*o) z=j|=vd$dN{Va+si>k*~70)AI(0_@B%>-?ZJ#slns!6m~(xz6zN5Pz2WMQ1e($qrsf zYouSS`Q99iPAi9}3V1!Ok$&;i#T@g_5am}F@cvpO?XYH^`6Z^$+0In(Ia(v_@bLXd zb8li*xHf_B)Ea4rH4Dv8kt)m=z;9_yfStwW&3}~UJ$S;0apTVUaG9AA$;SC73wS=# zaKAzN#rbEsS-?_xBMQ7$kcRW>3UhX1rRf0PJ4nNMY^Aw+qtZ+SpB1Fx{JhFM_LU0H z&*0mGG@K7to0TwU!eKrG{#THOEV4_2yuAYf_D$naNO6M-!)Kn#(~cW(r~;sn3r%=jP0xe-yEc& zZ_io>%*BQ9CcXV=F;9S>BaIxfFg|GJUW(mSgr5Mtv`rY^&gA-#IS_++#-BaLN&qf? z+Nf}f0UtIK>{PA`02R|XJ$C#2ssfa(%vza>6u#$wKbjdup>sa<;B2hDmXDy%K1h#u;uWLeMUlE^OBldvW_uLR_cNfZ34zqS5AxB}fXzigIm3!WXUkmjVW=TwA@*e1w%)?emHJQ8j$=x}JrLw1=CtIyVT zbJ7#j_?KMH16u63JXZqvmYEnsZ+7`RxqQYh>vlnM+&0UWGmTm`;PO1sRmbH!^!2R2 z%{q9H?D93aoVA-mYi&kE?wB*9O=Ck0T&8%61HQOa7T~)1g*kehs+$V~l_AV&JrCnG zL)OhN%~m+i%5_+M@aQ1TPOLdwugnDpRGAn6K9n?^DBiDWtJWKnKB>l8eHPF>2M@t0 z(0Xfb!qa5@E6@%Hb0FWFe+*NBJPY(UVGbnsxi)>G$g=Q*8L~89H5fnzH0CY^d2gg{_z0S$u0IZ%Mn&)%T0?#rsd|kBPUaFJvc+!;+=nDw zhjMThQ^KWe>}F5>J+Z9{c`+qBCeXMX4xwWP^WSo`Ch8u z#8o?^v9!0xA`od^xA7JP3R<>j@dv_4+q4`WVLI1KOJ={aB;>*%NqW~U?69Wn)sP6~ z1S4$?FN|k!ZObe(UJu6&lZ>uo|4A~zaq}$(U{)qqG^%Q{w#0G6B(rO1JxP9d+{`YC zuzl`og1Uy>TyWel$>QpiUWVz;#Yn&YChn zi-K^QV<-f1IeZ2YJ%I})qQ0A_>g!Sx0$V$%LA1WiZ1zgGU znmpTGd^<2b#t@h{RL4d1bpZLiwv(F>Vu8b|^g(_n4#DQ(vZV?pHW*+tDaflnZn? z-7QnR&wCv20}x+8UIABP`b&;N!groS#rVa0tmBar(HOV|NeV(@NCRc*Yhi4lAIJ!8 zfW{(9Qf{a1$M?WXw1kEuN>cu7Te1WAfR<2VDM^L9w&XA1`&vTdStY6X(w3MAU@}}X zGBlDkavsM3yiDXNOoNhDk(Dq<1V>jA!d$ewIBtc~e?294K~c8yO5A8LIWImn+bd6B zS&KJFgr=@+pMML>{!4>Hy+OBnG5Vldw83=r_secO9jWNbF#LJ7cRodPVI)-c+OsB- zX8hxZFvttTb9Fo(W4Q{nmn}hQy2HMf^XGy&wwr#fX_Tv4{ibc#kL?@PDy~;yqCk|Z zRTO8_SWLc_s~bB<`r4azrPK4n5zu{GO(WuIMtI|{-vB=m9rB?K=`*XYFd}-Cqvk|} zf5ICGBKo+lsJWM#5ZA+%xDny(H-*cH=v%u8!rLBqdl6|3qH@fX`WQ_2UyjiM=a>n= zQys_0uE3uG|Dl5>mf-HXAjg#5A_l%si|0w%?Eo-UrP62Ko*xl=34;oze}gi9m0 z9#zEPs(;H=5`*YjMGRSeUNyjc;3i^NCRC1;P9pbf90I__Cgg#eh~Zo2E7z4kYG^u$ zoc6IE9T(N?3qQ0S3|h#{}T_Qd>t{Xnf?3*QR#}9 zJsGQ{9IWtksL3OKc#p+c&JwR-$n`cb?nZdG0x&VR#SE3FG63fck~F9QtMi-UojzJC?UioySB32X`{? z_d$}~8BmKJI2^4c>w$L!Nv2YLb2tj!9JX=>_^%+zrltt)(K^{xjOb;>Ci)wJk?!6K z!9DKjq^zU|&JiRDalxY#&G4;3_NW|il^_Ydwlw1O(^M+bErHwF5+j`H*_JjP3NqfN zs`8=tZbzK|@e5^OAuzr3Usb$JFMejzogjy8stnLnP{fr7$W9!{o4}8PB=n}yh-)`` zDT(JJUOj^=Fg4nvNsPF@dz(s)+`z?xBm>b8i@2FNgG$rtzzu^W>7PS#yBS(K4of%S zfkBerO-TO9HV|v2s87W-;90iB2xoeK@&HBGfo!v>jPGEUJSg&~lAHp*swLg1jvh=i zgAot6cub=Y`SB9iz<*?X10;_cZxK@B1r8@kEPg^*f-|rb3B%K(8*G$oS{oz*_eoNe z`w5+jmUP1wsh36K{g1dAO1%iYO9j6;Nevq~UXI&%Jq_O zY17V#%+DuM6H?bGvH*qNJzN~dYm*`iQs>b9xkxlz9I1%?(1rMKe6TlRFU-|P7NJwg zNpm&-8L0OM^y^Y=K`k0t-^?$JFgk7)S#0oc^1S01gk>VG#I*_`dJRCsu7v+<0qTPgAIjIYJLj{+~_9!R~-r=LERPeEsHeT&w@4;;DmZ4g62j3he| zEZ@3Oq~a5|zH$7fS$X2tH(tet$JOyvj@11U*+EF% zL1<2E9na^6-%pFU{u+(Z9-paw0Q}091e~e$ZQ1?|pGl{Q-L$4u$at8ecjjCQ$8bsprZrhMqtw{O!?xce7(-xHyr zsuqI|z4{KctgoV&%8l>A;gS+(C614+`VOr@=YWGy7Me)XaS-^}s_*cpEbycu?zYkv zNNn)2Ro{`!Uf{k!gKTVsA4d-M9e+I6G&uLo0QsJ%j9IcJ$k%`N@ta&3i1i?w9ZL0x z@8pj|u(KTXjQA7eEK!*`nV!0E9P3h)W{*IgJ8tKpRrH-c)kyi9#Dgjdmx>M@YW1BF zd+|7O;BG!5(kdNl^_`uNOm$yatrvemQWpINGn%1 zVfy9;vVlmD08z&!pLl>rR}b2fJix`ZL|UOECBDB(BvM(j25>Wy(1YXRtnwG@uK$9r zDd(F$(2UYLdNP5!8@tY{ZpmC|)@U7-X{Dp1J-(aES}WaNXwGO|Kz?Q2t12xUPUfY~jf&t>;GeZbdc>0Z^U$~FG(8A>T1%uyEO{_FnX>W# z_?4DOkLXB=@6i{v)tO&ENX z!k0+YS*Bbc0XpfprlS!Ta-A4WM<_1kH{;JlZp_)R z>)b#E33EN=rPB_+WWS7TNe4mTLo0NJZln4J`H7(5hvWlf&tCsc#ln+VGkA-s(FYx=ai5i7nvNiT3 z5k_)cQo~PHYQjZEltFH>^MIF*qmh|f3bTs?CGoNas!Qua)LaWWv+=13Uk=f4k<#=7 zAE7leP_z@kms2#r*o5u;0KQafWT04+OJqioX3g*5$Kz;Jpjen&)WR1ESa=trXIdx& zMQ2WYdBn0K%EKf{g^>Z5lYwQIj8BpH@``VEsw6EAQB+)^3?5s|C%${5gv}x9^}j+D zMpow+6R_&! zZV>ks64g?u&?do@QVv`J@h7tZomlBXVX*@PiGym9+N z?6OpHq=!7Oc0&Hk-iu6x5+cz(6$l?h_2LR;cHsDz6u)8)pHr&~M1!@E0}&9dQX<;~ zJN^(Y)k01vSw?7T!&h2N#fk!3{2ii0afI?~EIv!D!`T4V+ysB5H8Nyur;Lc0q~e+Y z?R5%V^3lsc(MES)IWhbT^i@kB_40y$K^on=kvr0T~eN(wniqr~@ZRKRya^rse*CNKl|g*dE|^d3a7 zwUCoEz+xql&#RI&MRI(^7nc(}_1HPhs)+NL59M^VAo9l%Vq+h52&;-KWz-0v1$Z~o zaGG)OWTJ47tD0z0Q3=OFG%G$K?c4Fy6y0;Eru=7!w#N|~UfQ?g`%*N+`W-jaXTbjo z($KygUoCL~{b1I-26v(4J0UZ?v~R~(TQqo~G#SBj1!-vCj<1d=Zm%I!0IwdTp?y2P zx?&7wYuT^1;N62Xv=P|XKy3a6pBJI^m2u#+wZ>WV^wLIPUqi6~bB?q&C)Pu>J3b+8 z1okx&Rlij|!b=d{k55P&fqjid($mN~WYLupT_0RBDFVEvjljMpVt7}bqea%F%6Q?GdIRKgk%HPb?8hb(WN_H`DYV<5&}_l0P*7CKvH zrLc=ARYuh@^C8-(h4F18_H`AWda5!!3gr#04&Gr)hcSHJMBkH2{T9j)Y^9Yc%B>NP zYI(n|uZP&3Q$5GL5OIuUv?cE;n&54LoK>n3calZ&USeT{;+=>)sUdl9F%E+Uc0Yl* zlL(UcL5WxW-F3u+ViQZpUwnPV2&|v5kv~bqk>H0I`{h;ee&QcYRWpA=oEve@%aZpO zqZX^&7?MVDBeuq2WW52xyI48R;h;}n!RkP<1naVF)o&x!Q>5*NzKNnoHPd*GA|qOW zx5dS2YFG!@gib2{s!oicFnsHebdFa%~8-PXx_BK$c#$`jdmmY zW{7j>$}lboR8C{wZRndP?heB^ur6*lC*%w`B%d$ROaku(Hbisok4XNbIG+@?({!+T znsZ--cPsi9h!6|!irfJ9o90|wNWM_~gN+E{6xdbGrG47X=v&0|ZsHl(2hG`jEbV6W zEfH(Wsz>hiA~)RGg@oqajJ~BJ%?~JBMG?FrKqYahgyA`cJ+%VZ8a$;;r;XCcPp>1rw-$b8b(%K`( z4U^wR=b6%4Laa5&uVdDhEYYP zVWogtuX!54-=g><+Wj+rL+QWn$u7JHHL4W7&v1nJ=9O9vi?T$K3|K3nHjbzrZsPwW}oBtHX0&7c0Yy~Y-3nBUNsZ3S;^ZrwrIhZ2;^s!8B^xr;y zDpLc6Hcyr^NlW0Hc3H~K#@WwLpORzwUVPOETg7N?CaRfuP5!O_8MTAe89i2EJ;7Vk zOzU(%yc*Sdj%c_oI?ds+*1+!sRx|qU4I_>9 z<5pp$wMt{|!fRb4HS(^7bqIJPEj=G)xeO;diYQv8pH9d!>r1A@g;1l;~R>`E|j)3 z)>XU~J*{=OwLmoP%%f;f9!_t~xQrd%*2VF7Nv|~=v(K5Vy%-;4w(_m##So-ybXTWJ=s-V7}kFGy@+hvPvM#1*|?;ZY*f^?T_!4Shdgg-2D&YK8PHZB@kx&9ahXOG6o}#t7_iv*z!>_B5+3 z2DTAaN@R%gR-+-ps9-h0f=)%GC)N_J2gu((>%%-`HETSk@cdTFaxSBiHMIv`#b$*e z4Xaqsdt(*CdNkfNs#*Q|;!uKB4K+dyD-7d-npRQFsefr%Pq97R!k6ZZ+Sa$}aBkZg zxk(sxt%7cB-mn_1HI4e#m>;pD&RUM@rlIwz7M4b=8qhbkcA!Ji#EQs*4;oqbdgFCx zR-y&y?pXuTXg9Y)?&JH2R+jT9p4ONnSOTlX4`4{KGdFnU_WFn`_4`u982=xv?GuChK>EbR2P+91sRtmZ}W3S(>5Sz!#Y zel38l2UaQMu~=(dMU3gKD;2Rbz*;a9&9Su~{th+z&qa+P%R)LK7ExgsP>9O(_xKf7 z^iNb6V({y-l663-v4$_FGM!>I6^6FZB(&z^H<4BKICc(Lr!d$IvAT|=!f+P9Nv&Au zlUX&dQDJC`-%!hZgvEJldNwTCTSXe1C=5HG472Kkrn1T)8mXh@>{`4kcnK&hcXhQzqT2KBz z##<_d^(r;(A-Eq-72djXR8yqH)AAVoOQK4U&MF8&2l=g{xPuq7!U5hF4F{%G09nsv z^so2I_90q`4+@ev?>#)}rLUj9)|$zn@vp@f&LO#kRfV#=yR9dK*z`Oloh8aB5Vds-N3o z%J<}E%gSFvH4;-RqiBtTHmv|!9T(G(00T8w=TZjR0Qc6CRp_LI(2p|pYH_&{i zb#kvRho#mUTk;d|RxRP-iVSY;T=((nSp-m=1iqpr+=Y>nI!QMw$qV35TEefIk&?Q< zqbgx5X|rML11=dYYHN)g9F_)^?XXzDel6jqUrHJ^uqDlbJ7@_<+It#xUsNCQq!Fr5 zG@4=r_*l}=?sCJsbrCALzG7x26fBfKu>fe9gIi`Wji`R&CXSj=2@pGh_Bl99D!3jX zhNCM-8B|;Yy6xclhv9m(@D3CPy*^)j0CI(Ezn>ucMU540&xH{$d57}HS11_BLpaB~bxq9%#F z%T+&mHqd+r(_6KoCX0^ORnRsA{pMg=>xr5ol3+U|hx{DS6$h72hoDUr=l0?=Iux;& zK<^y9Gz(l$6AKY6#;LNSk;SDR$*(I>9%hI=*#AS_98nCYbO62p1obCVns7kPH#;G`Ys616`4olR2${)bwIxm=EBHty@*;Q z@|7}W$WH*Np(qV4qLzp#Y@p$%^$*Y!aw+rK>qfxKgg-{j^(8_F;xk+dce{!>FBfPN zr0ZNj1st3%74QnNAEO>NUJ0m%gFQ=tSBhClmGKy$&JMnW1}tio2u+||j{=(D-~vaH zpsU3pbPU+|VxW}{j;e}~uMuxEEBpu0K?i%<0k=@w!4WPRYUgUw_KZ*62sAX)R z#Y=!o#e3*fxLzlQmREWFbD$g!{$e-q&tet2_Ut+WD9XW?&;~`V7pX9F#JD+78wbz% z7I>p*vQhax80c#UXZ;$+H;IS>D%IuyEp+fv9Q}>@MU;Vh?o%VRm_zlk*{e4H=?z~!sMV>#Bl#j+eK+%p`+ zG2SP9A60t&gCYE%8u*Fjv{-x9m_Viz7&ic=lLHT`YzV{KE`^s61jwfr417vnvy<@Y;?YxsNO zz&KUI-*6Du?)OEebLvpbdk1mN{y?mJrcyI423jg!T&q74r_gt$^FgAhgSbY2Ec%}| zWsP3bL0p?Z75zr5X^##L;+p(lkrLfeN;xsoL0pSJ6Es7`XugBE27fLZW5t}&RtItI z{X%?;T>^~GIEZWRSK{BKrmVT21R$!lUyCv5y>qP{f{w9_@@P?m+QGNtPjqXU#d2l& zUhF!fvQ$Yej^&E-gNRJ1P+bRcCHYbG-J(!e2XO`YNeIlBad{Z$Ag&w@^MqXkEp`xB zjKW;>K$W839mJKQX`ZdB&_xGvh3GQZ_ECPla1d99ZnF?_0tX|MN;D;+5z7^!#|)jT zT;+8TSAq%5@(qj^U2A{=@TH{4I!%d~F|cY@Br&HgMudS_!rM1KqglBB}$ zwOLo_!q3&faft5k;k-Zo6kkHs1Xp7ED}=YUN=c7bIZP?(2|QR!^5K8VO3$5`Szs$O zaq~wlp+ja$(x)vNT$XGG{zFUFV0>?c(~k8r1AOVRnVQ0K3HWaN}tr@8!Q2FYVn znHu%4Y=UI!nj4rchWW~%A@`8~_=mRtb0DJKRIZ}kRMMi|0|fn2E{%529g7$Di5zfB zagKIV7;yjGcnhN8Vy4kZx23t{+zt#zu}lYK~_FMQ6}{q#z$c z=#FjV*jJcVq8pQezmF>kqh+7S#+8`<3gPK`RRa&fI}cg%9QdP_ti}KA8u+Ut%1Rnc zoMpu&tpwJ zWXU4nwOS%$Bx~TsSPo;!KHw8tLWdjd8u(C2CAkOuTuY=CSp&~btb&^a87&Pi8EI)n z*1)qzs<0FUF0Ccf%7jCx4~EY|8KWm8>Hs$)$ps{VT>}r@hOQLR?jW%?4UvAx8aVA1 zC7BL9PfMg9vIee-{uf*M1$dX1NGq}i-j86g4g_jb6e)bZ5;#=;mwwyx?P$K;@CU5vB=WgU z+TS&>mErT4x9Fh_>}dEB@aIw8sYv2WXqMZJkBEU4`U2fIT#4xqUNTdAA!?z1^(8So zpfaFxE*eABf`pIBBEKTVm(1M!0G}hm4bdOyYi);X2B}GIMh;Y(IpE8*<`diD?NDK6 zZ!9Bl1GN+UFlopeHS@vSp;DVW-zm*4@W(+K-s+UrY* z54=Q>hPPE^Fq>m9Acv6v_XtKJa#Ux0*eDTyL{oT4=T9bHy~1AW@pw{MOJWlk zuEg}0A@OITFlN;mR{*MR;}A9|HKF1!R5z??3*KF8wm5de#JNlOxC?nR4t$2zte`M^ zQtX2YPAa zkav`Z{MI?YS9HV!;K%n_DJ-(#Vjn_eNGUt{(}}zpl%^!`Qh!RDWomlYEK^n@I{*0nrPL-YJgRczIP`31E5ZsS6lUaO^Oi(Yo5B+642T#4x~L(*$C2AYz#1nF#3Sw5uXujVE2-gYuD5_qzf zaMlm!tbctxMufa!Y#HzxlH6oJIOpH^9P6;WEo3jqVTW?YznKRWGP}JA^2nwknejg( zoT^d(tqc`aR`is?^T);JLu3dz+uzQEOv@!BH*m2a3FrF1`>j(}sslF+l5nQKbMCaV z(hYcEkc9L6-H}PufMgo*+#m^O`Flr^k2oxwfOiH-I7at}VK~l`^T0Q?gbQ*w$LQg5 zOzyGdEwHDo9cd}y7(MRVTg507aPA-p$LQ&QnUtggaP=Sw$LQIr4l2@ZfV%}rI7TlH zrdN_Nz|(>xTuA>*;X%Voxnw2qI+Dn2#`JY>H!TB#9soIIQ(64Nxrn}*5v~l}2YzZx z3`yU9fr^3+Btnj-b2@BZ8Q}8!?#u~{A1MU+fJR?^nPf4 z1SN|?+7oy%Nhm9;?8pW4W8()(G86d6xRRVK`Sk56RdhFMOh$2Yd^HrxZ?dF<|7bhJ zdGM>Gp}!0-(}b>GSP^FY3P?mK91_i%abzK#tHVajx}zx->A`c@8hKonyD0v%;ssWM zJCQdL;8ksnv?D_@wbWY`l2*W7w4?`l#YbxW(-M4bN-Lv)r^J=;VOamnzt>=mcrnmV z8k4^&y5CJ(p*-0Sd{RsP7>^W@ZCe&suJ@`)+y{S2ntrgL!pcQr&OxjNagj(?9y?8N z1xo1HyMNw-lxkhBFmMT5V(^zw{XY&0LwZ%i-P%Mr$+PD`@7ljGcMp)ZxZ6n+{wAt_ z#bnG4v!`E!j3Y|nGP2Xhs{N}bB|_@X#ogt$JN2Pz`edqq)9lvD@lN2wwqq43ItuLn zwF9OR*#1r6d$z>LKp#}~S9Q?`9>fRSc2%&0oF0cy{U5~k!Wd!K=lm@tE1rOmGF<2D}?-C}CvL%0QpE^`|pO>_Rk0f=v$MbZEk#-K=vL zpE1B1@oGNaCJ=R>hr?W@?4(3GcuMn<^ zDEhdZ@W~x~8R)Que}d_u(vTa1Qt^pCp|9yrY*rWxpK3zTIF88h4*3T$spayvP)h+l z!3S#%hsOIBYghh`u2oo@<45)__<|tKHDq0XGIRepxn)mm1>dVR^65OBfv}`B>n2y* zbFYHmvNeXc_-f$P=0~jF(NIXd2Qnk=$Dd)wdH68Le1@$yA}wy`vJpQs_2B5M&i?7< z;be&B$0wv?wf@7d z-{+|m+6>VjafI?4eg0dnZ;PvPb)D=ZG%q-z+ahL?th(BNFj})sDt6bU~r~_f0@3E0FE1dhpyX2|^H3EEMTn&Gq z&%eZcy9@8irVjs7@L#ls(n^(|+ZPecJ!VR@$6TV1Lv%5Y(D1V6sQGk+suZ4qo0aT9 zu`yXE(kpfS)x_jhRQ@5zMk21WC8tf~{_5h$S%j!0SY%x8eMh{8Xp&l`cvJ9Jwg&Ij zB3x4}HC2ko0u3iDGs8dR`^n`-Mi{B`M*mt{7L-ZvQKzCBUVE#QndCuBgJQx04^J zBwuU|w9@{rVlWQOFltC>E+KEX z?m*o|*(Z2YSqy4`?m&HU$>5|)h<$(lQ|9OBW6?l!639HFoWM>#PrWA%3iDGl+kdD5 zz<0#a7!nItTi_Ew=WJ}Gp7A##RKYblk!jq=-Iq2A;R&VGHSy&A)5WgeuwAn%rao{< zzbQ1bMogXY5W=`flzxqO0fU!{qcKuv!>pBmrMO{Xvn^1oIG6{#a?~sB92N9c*uD^r z{$HVyD(4%7X9#buq>jKmXjYJp>kl56hEk22svNcCd0mBa$&9-X8e006I?4zk%`kPQ zbR}JbdQ06SXg59Mx1=3A|W?oz!+Y6-z5fi&q$6-o0nMo@sbSfd* zO$!gv?rGy_QEhn<=^fstg#X3xZ?yXw42IH;P-;b@-Sol}{L)?eZw%kSFK)O8W8yoJ zRktl_|AbetrfT)2U>OOEVT-HPkJf+OIY?tQsMZlLkb+E9td33)uEg}0JbWu94eKp8 zq@*oypEwd(eM?=Vr}&r;o0>#M~m zMHEhP4CJ&!>FqaG)9qNuVz&=K{>L7+B4V^;hjs;u^?TxY)9M2{6wXSS@N6RFeF_ zC4(e1*0-XYV)qaCTx$V;6(pfa1*>JZFO`*Ez(ay0G#y~IYKQ41+5ZJz5G0{_2di~B zc8{`T3-F#G3CAcVG5Y*0xeRNlt%A*Ou-v&uIMqSLK%F0^cEm|To2n}Ja zt|1GRl@q|1gCrcIZdqbfujD!K#~=yEsQaVWN|FY-D=RLU8Kg%XqaGiSjGQi|furI| za&nA%E}o(!jpJgJI(qGRw7UoHhthvjY)3O?4IPfZJ-tx{VM&|b!5(Kx`(9V*75-ACR$#vk^Qc4-WNNqYt0CczgB<&yRr%x_G`%{RE*Xl>bL2;H$) zqmQghXs{$BaIUx#wWQtP7Ah(@i2$ui3i2U@?$}0-y~RVL8+5LrOI(Rs((YeTDn^1% z4pPV^?K{{MPd1i<{v21Kmb5R{HVlgTanS!=(oXV=Y1|?bxTIZff^?DqDIG$|6yQ!R zY4^oAlB}vF?cIgcpK?jN)=%+Hz6d;Cfw&*_ zrohx2b{Ekb`Tuuqy9?>#>@GS0@73<2X{h{9;!m*#s?E3((_bO{>Tb2Ro&2_v{0V$X zOUC1W_S$y$X*fhkR-WPJ2Q3L)+uo2@Nm8SSl?9jd=sPqn_S$xZG#G7=l~TZX4}g+z zDBEzooV9&_||0Pe>F1E=H28 z2)w4#j~E|pSAx&aT=5*bptwtW**Xl!K~@LVmCR^;0DR?G>p zWE1dCEs<8_+V*SYH2D)&$yQq8~my~1z&aEZV zBe}Lc3+J-fN(JCbw!~iB9_mrGaSM>P4wY-$8%C@8aWKeOo67vG*0z7Bk4gh+x)e0z z6!IVcP#1^;5$&eEs4@K8o`12A2;1Zu&e}yU@BGb0ADbK48{hMFeWE9Y1#N4mi&DXz ziX_%9*MC*jC|lpI%L`h&j;poW&CU1(Phx_)e@&J5&%s1ON5$d&x&$6?ok0ywRQ z8=?wOJ#B~f9xBZVm+_6#bOGjL;Kt)X3zDm>?132e=K@PrNQxbuM<8LtbjFYWMT0nev3T!^LSqN|*( zi2|>sHJsVJ{JoPauHJ`Ki`oIa8);!{pkF~D3awDYN*e(NF z<6zo!YyIUaRz`J(_5mGnFm1fGuDixpR=Myt(0vEfHd^b3>nf(c*tn}9f<>1M8f~Su zZn`qAQhsLx%I#pG=n)XEha050u5hv;*6E=qi0#9W^NpRNld~$=!PF8njm( zYibPC!ogb+ChLjobW7AZpTpb!Ktmi%o87Iau9-(L>yicdJD|A^rVa1bGgrB!>R8h+ zK-(Qm+t;m6E==3WWH|$L$-%Vo-9pL7pq}IX9O#XMX@|Qd-2FZna)*0L=)Aa8cA#DE zmg!!Z-H^N7ivX2$Fm1TET<*n1)WM0`Kn)#CJJ2nUd$WnJk7hu`x&!qMz}SUuC3K7B zY8U!spqUP)LmO6NcNMHQ@TrWoKpQpYLmO6z`#~ z#MK;ED|~3fO6tD672!&V3Nt0H04~23oWlLj4RvxUA9xYc$Z|p_m#ma--&u7Sq8dqZHQnkAiR`-!*`pb~m=h>f7;cGz8Z5%?zxpr4oJR6JhxUtB_ z#*%)8Q{%YU7^{`V%AV+aN>doTjMm7Hn&!YHk5$7{B)2J74(o$Q+ZwfUSm-z&Wlhhw z=vq@S!~pQ2q>18ykE9rX>ABcP72R1t^Bm0M+*+PD7Zv^$XorL8B@|X|Pr~*Jp9Q+? zV47#P>UhRxQ^VvJKyMw)%}YJcP1GLMC{4qf;w(8XnG7Lg;vuz>3`HsJ$3(4>fKPD z(`pKBpqk#ZWi|5@`&lipJb}{P?EecltDAd%%c|6wpe(A@!Qp0g3r}U#ryR@bP`1?S z;Bd1#+LHv86sre9Ia#ZN!%gcwRx8hPk7|ULL%CV2`9)$fsae?CvkDVp+$5ZU=(-ki zkOPEmJSXuoJ{G@$(l~!v2iqZT>!e~;K^B#si%7KS68d&{{ek)@YGxg`7}>5Gy%Mh zmZlZjd|WD7wr51`Ki%^~Q^S}|!}c$L%4p16Dy*5F0fn)`R2#P&5|Rz_`y>d~x1N(r zROgDmG16DN^wL%h>pM>jjB>V`3^dchJcyX(>5RS?HDA0Ku zhtN!mL3=u^Ii4PSFtb6=`w8${Es=$pCm9!bnqvuzeF);P131pv;+K>7gfhwDO&6K{G;9H(ITf%OVK*d-QLQ}9a`jgC%;U; z!ISNn5}k$UIxZOj@=|@hexqmbUn)p%z};b&B5E)ei&YQ=cTp9Q@f!d-+4J0Xrhe+J_yL~ytKA@DhyFC z1y~BvFYyWKotM@&&#m88q>e*$Ej}T=^U~VxnSvnzjp4o?Dlk9Z>oS*!|CllX-6&P(fe&n%3m=_P=o7ersjC!}{? zT01>c4rAe)gmWNT9iNcid1>wPJRc+EJ1_S_^k*EQQSno0Xm)$On(_Um`1$Apn&O8kZm@Vy>04(g(Sp1WvW8ObI_2fQ@D9mi(ew%MtIi^ z@U3Dev^>1E@g=!yuY3#m5=f=UtEDi!M>+^EaJVfAkyfaItrV5$fRdB}uB0WqDB!$p zu~OwX>(LT?1r(z(88vv{aiyx&2C3?P2=F+P?1y9J39aW;sx}}@RgepSR|iR`)u>b> z#XQw>*aLjXmKfpFu)tiYW){@`TzlRCx$DqV!(sl*(HM>KarRFjo(?Jm_(lhYNR?{6 z!1gDR4tKK?p+r^df$uf}*Is}uPsuOJ0@DXrIQT~P5om`h)oFwI6VVWNTWQDKT@FtY z0>^b5#b7xV$u9;14|5!UiELM?UTW+e5i@XizIH61ahuJs-Jr-=6{%l=cQ}qWu~UbK_NZiaZDYXggLhtASOxN?&<~sd^+$N6h-+k`IRKY^v}> zs6ZIum3qRvrfzJcRT z=@E^WEBA7xQFX^B;LtAc=oi@J7|AhXIPGhy+~@njn7u+`id@hX)w(DSGi_O_+^};=AGEB8{=+_CDdp) z&79!`IBv(d=kOi+lyS71Rw(h32V|3RVkDN0C|c2OTAzyH-)Q$OvPU$DZ+n$ISi%}w8am)5cIXORQ|dL@fUw} z&R>t-Sz#ok56$`OQ-s_JX?!XFpQsZZK9~PbnsCM=+;2cWB{%qUbN&{mDU@Wt6J*i6 z*(;1b=;Ut_xe@PGg!B!dyE~qGW&9x@cvzZmq4;X`W4zZ3H#30d(+c_?o0O%j&;tH7 zHPBE;09Vx#t`Ae*Er~r`%`#6jjbwGLLQ{(fk|LooGwOK{tbw0%;Po^76d45LzNozbq;^K@T}PX2GS@#+WrJe zW+#x?I8+(nedirIC&T_P;Cb;#!uSwI$0j*s*4_lkHj*{w@bh_xPQRXzeS?z#=QSKJ z=ukuFVV7m}9|OFxp?c_?tGdk1B~vdsOs2slZGXcrIq-LVb6wKBni$QfCrR0aU!+1s zin3d@n-<1m-1PuL>A%tZU(XK%P(xNJSr&b%B(VrgmCCeJ(iOh%6b{doy}Dn{oST#3 z?0fQqgtB8AHVLg&mGVjdmQxcygZ@g2NGJ>mD-O9JXFZMqT(F_sz9<#GTBu)XX5$Iy zTdm+F*zhyhnN_9AFL;M$P1tm$#E+M}r!W|jR-KK8tRB(A_$fh@{SWN~TZkha%#C(e z!TnJAU%DUdCSkOjVjAO)At?V#zwP;UG~dpAHJ52*&Xk@ix``wkjGq|yEc!3)QjKvR zMXxd1y`BxxhRCtv85)^r_fMeF+zDvUzj!w=s#{Mn9NHF@OV5UeQ@C=3=%G^hDO|k6 zm6)JR;gpl>qTQ%CVLf($_r@krTufz47?uEgPb)`e43(`wVbBt`LZ*M^sM}ceqs~c9 zfW`#p>n4!Xzp}qx8L8+F8mkpF%ZCz*;Z)_yr|{Y*YHFu}F4PKVx*%*Sn(E3`YGEaf z+R`nM93vUUgIinq!+mXOvigV4cxxU^-iGdpHpycdX|2XH?Cc?H32>#sC9QFj%CiR2 zP@R+5`%8ujKvIfi96xH=u;q$^RX4hy>;=>Ujn;;^?PEinjVd>Oa!__~T>YULV(W~Y zlm#m{Sx^ys4RF&njR^TcPyHxA<0bejl>QszrjSId-|cjpZn%HhhMu0k=M!X9Iz;{t zK>UZu$p{XSA0_klA@Ur3(NY8*A}?~uG^ka~43@YQ^>_jfkyk}|R)@$L#eayr2F4RV zz@=yh8(qi_{iP3)C;!fncr?&d8;7t#`w;oy%*w<{@J(8?z_Al1x*AGz4E%!DM6gC3 zB0q+?O?ndIU-17(vy8DiMBZnKT9-?X2bl(!!s-xt;t%+89=R?AWZ5{R0_^BRga6BBTjgGZ(P!M_gD(EOo4y{L6u*_i{rEJ#E1hd4w&xwNvg6Z~+H zhUO1(h1W7p8|6R3}%B)j? z=LAVO)8BcGtuvfgHv<12B;h=N_sk#4$~oX0K@!gL_e%Yvth@ns$Ex^-$l%gSfd783 z!Ag=5IG2`ip-_j&FQ6mOVJQz>El9#KdK_WD+pjfn*B}YU=xHJ}W^83N@YEm)$LLw& zbSg$GfHww7I7Tn-S5=ZDz~_P_TuA?$gs_~WZ1x!V1xaK!WBNK1DAng8Ddy$U;$kX` zpE^W7VXiVz2>1(IVjm)J4$1~sE}$6| z8Bu_<;Yv(@=|kkF(S9;6160YzAv{#~szc-h(P7}3)@blfwnl9Qp;-zXB6nrP1Tj67 zk>HbUjkKc@#UO0Sjyuh$Yelfh=DCBruy*~%f{GjS#A5P2+mX5t>ubB)P`eTY17 zITfEIL(uf$;^@jr7yA%-2h6x~PAvp(ktQi6yquokLO$osF_jJL0yhtm@c3ok#gb}f zqA&0uTVkj~JWK>HAtnExVughb%^{E-s#2RIskHvD22;DL|!u) z+}*(4hqk*ohsa-J(8-S7Ls9kN3XGIIL|*KGstR%e7qBJz5c%P!nCFhf?J9&g$m$UJ zTx?I_4ns?j&bC9+!nOkzo`&dFd_tQ0#3AzOg;hy?4^hGqffn^4a#|l?V_CrS1!;K3AfLED zLRGa<;MGXOCBQyJp0orG(NV{+4Nynhgkc{d_g+@`YoKusR)@$}oK<)s&~lCKL*x(2 zV&aL~tX)9+3Cq&Q(_)21!B)!kUqF8o=6bJa%2%rWx=I|+2&!RiqCgoCOR_!Q_BVfn1oA@Xe4k3cy}gpS1g zKQ3il9U`BTM7b^qRGhGMtqzf|$Mg-mt_f66yS5LJd+*^nb-?Xz+NFJnJQNFBVkB;l z*T_CZ{%<9fOBVsHCCp8ZEbCTQq=`>dv)9A+gP)A6u@8~2{>w0EtwY=gf2%c=R;v8) z0r5R%LL?EF=&(^3^x~2pl29Ka-;IS$)|3RV97m(7J9UWsH@p!?G=rc$i8z07$oWfU z{_4VVgAWE98<*RM$iK^~>iq@a%WRE4M1BJ$nNxfx&_2R4GpIx4xv@0LUH)r8w;k8& z5cyL~hOz4pK(5iYYx@v+k>UuO7q>GL;wNn%B40Zls2FaS*2q3YUS+S{{sT28EQ7@T zzlp9NQ)A+WdOJOV2HUPxuSp#uZ`BO1b)-l2E%*Z4gwn8`mf|<;DP=ob!S`xAGFzxa z9MR!~axqee$QveAX)uRSQ9|}1^07G#<75mT zz$Tz=xMXnbL*%tHxeOX;o&vc^lyjYv&+S9xSuv7+1ujr{9F0Ciz6$vNIQtIhsEY6Z zH@ll`vVcnCfJ>5d5JtnJI%WY&ex$l z{SrBK#(0B@+Aqu>lKsJd45DA3(!Li5V@4UlITdC$b7uDA@2Wg`P%(bG72yA(Q!;x@ zM8X)8J%6wuD&Za;nvP8NkiRzB^Uh4iDVGt8F_Z4NdU#r%aGYGq1rw&U7tsDJyU+Cb zJb3zhcxI4n`ciYU=RAWHoa`aRdw3{M$-M8uA;}(kE53(^UYJkjeGd*v_E7C6d$dOS zoIVew7*u#@$CcuA>QNZU6QgE{8-8Tp< zOW>ajUT2VklRY1ABCr{O>yJ~wR}4~cvS;-M0$(C<6@%X~NWpVd`q~)9^B)TqEQP-r zc5t7soU1(7@D4q$JM#5eM4hK<>;)D3svLSG2`nVe;jKp)NDQ^noV|`FP^xZfv!a= z`V_wEf$32wR0*d`@BoE-8&CWmCo(g=WBU)D6g{_^yPd(iFyaD{ejBi`(=~WVcf16Y z7l!9PhiF;;_Z^Jab1Of5J<)Y%WJSS@gt>d7`@(je@ZSbu@9m5MZuH9(;6xA_-G53K z4AS6u9*&?$I`I+ed+8`~(yZMCA8u>41X`s{A3b~@!qRPny3r$6gPN`;#;nmJDbz`m zu>*peXCdkfrE?-Y`6C1?KcQY#5$O)9OGNL>xd0BPU{Cr**hfU=eIFt9uOMogEsY?h z*#iWtG#~$h^Oku?Vwwx^hex+6#^bo+d;ca>%|g?E_y zDxFWH^Nx$?JPKbZbE13VE^{)>LPo8esUlMe7V(&^tvR*n*Z5 z&#TT`29Rho>ml05`#y1;6F@G8puX|Ax19_zc_HA=uXud84ftUyl#Jn+7>NF%(RYq> z92#MffP?p#O|da}KmSCRa|R&B_D%@`x!C-VkwWxih3GCd@`~e7W*P#<0t8KAJ$;8s zlT1Iq0$y6Rx3J?31U@B{Ls2y`y66fJGpU_Fxme&T5O+LJcA_hNkF33@u3*lAO8$Lt z@P@1;%xPwhZ2?hn>W2dOUL_#kmHm>6F2KxlKZl4CYVmdab)6>_`~b`)x&r>~3oBPG z&Z=_hW}e#`1<*jX#*)mY7B39DqW^$_Au--W&HMq4j>YLF@X=22mg@0`_~N<6SxMRn z-d5cW$E3Z*DQmi@vRrx@>334KQG?SE`U!DZJ=!^$awP!ntB%Iw+XaB`W7D_VdDNwo zseWz11JtaR_#cTdd~6$=hOG!rMweA4@3$zcSJYGVsU^Xz_B`8(*@)%L(WBJ0A2Gp( zBvd<)k`2+x%J5Vb(@fyufF>DOH+@>fY*ikP1QxLpIK8_Rq`2lRS546@Gv^ra&q6ps zrJ&hc)%=B6dPYj!2Qwl(SYm)3ti%yj8K%Wia)VyZM&SzJGUC=+CvaLt;0|MU6EKrQ z*+Ik$>I*bqOdJl+;;7cus?_E&ykUw-N27n z4&RHK)4+A+s>t~a_$|xP#YGd{(XCzC@k$ZP`3txw!ju9Pm;Pt<=x(kD%I(litX>43 z*Kh>x=lX3K{*{*CL_jqN<|dIRm7)i`vUbIv-xAybP>PMM;Zd$qaME+^k$~uLcXjNT z-6*x_$*uty-(Y6QQOf|Wwy`xl%XQ=gk|g*5p!Wi?mo!D}#jd4Q@$^LS=YVbmVl%wj z^>PI~bP)UppuYpL`_0Gwz1g)K!yQ&FQzYhfv59Jv@oH=IE|-6jXkHdjLIB=Hnjds2 z^mHt|1)z2TcrmGV!d3gQz=Hq{55P33AAQbsra2t*r~@?*(2@X56I0Qjy4>S+kDzt| z+8=<6WdwZ1^|-pk{shox7S8@Vrq-jsbuCzpDbgPh{ForJZGGFb^=Q&Bu4zj_^84_% z54Hfw$^PIdggkQXbz^8<0$9AkotV8ec<{NuK#R@FHwM&_V73UJT93}-zVS6A_d)Ow z6H~XV{K`{wLHD`yz-IuPV{nJ(L!wK%KSr-jJ)GJMXeYrenZF<#UDchYHs%(nLeBuY zXkaZ}bDFx7(DS1cf#(+ZAH=Z*z%MpM_i(>F7k`;clo#-#RaR`AiWWnzi0F~--G5?0 zOO#T86NwU#!qZLBGu`Dd=3-7O;2jJ{Pd7!+ci&wh$_@cEl3<+|noo*e?w;nC6czwl z7KqL8I`>Uf9qYIU(1Ac~n$d~g;Xd$(v=5&Gx^7}iJHwp)?oTno<9q)ha3`(FgKlS- zbJU$_nzSKVf#aOMGDX*s&>W==oP!lF{{Zv+3(a!5{ac`;5pM(gtY^yyCrJdpsD}p z^PW!l^F;0;#sHshIn?y(eCT$G+1bM;tVQdv39NT4lOp?qM3x9EJw=M|0!X(kk@eH% z%+l(Fy^ALtuK2$|%7|MosN$b3NRHAe?7}gTT@>`{p;3ZLli35qGGoq~6KD@+-{;v* z3=^k^eTEeTOq>ML(okYhxiWis*wO4*0Zr}CZZMBqc6%xbZEUm#IC@W5mUktC{{!g< zOJs?((>{~v6Jd367qdindi)6)HeC`VQ8=H4Ehr?M0>I0MaC}VUDedUnVWaSfp&EkF z+>o3Y`tWu1ldzg*RMHR7cmoFvR@x|LM}-&PDC#c*^T26r|V*&HkhKUYt5It}_4{}DxsXnS}wzp#G?^99U71S*^> zGw9yab$2^_6drK7hzfvSJ(Vbd2R0q$=kUzQ5~V%pLsE&t*$67yC*hOwiDI)r-;_!e zzTaslc?tLCgJH5_$3XvIDp9yGp`Ap@5{_G*uB$)c{;>J+d_3J0J76 z`v`6eXn=tO&(d6OP7JeWdAshHj7 z`d2~v-V&*Wl%(TH(L>%+n6qZ0%7nKSu<0@lN}7r1ytnape@rY4QdLW|Ne7F)>irrI z*vxJVX7A_OP7I5^>s?<=2J{m^nrDeYibjm4VYheJOd)Os>5wG`Dayo%h|OP1(w9K` z-V&cxl-Zdgk{6i#XGZ?9>HJ%^6T`%U5icK<^b3QOV2MGB{?CEol#hr$E9tiYshcGR zDayop5n~z)aWqKtEYT({CCcnp5h?ve(XC(}dYmwmv0_ht|3{rG6raz-! zjhKUZNUo#5K}ws&WIaexCQgg!2j3$T^MjONiO(v^>_rjB@Qo&Bw*a%-^K2)Ei5nvt z_A>bg>2*sCQgrA|jR3?4%AUYy) zS~Gm0liHqPAWgJH%8?VpoPv>qx(R0m@LiT;g~@n<*)<|7-iP;}Bz^$q_y56WC4x0+ z8TsZtJ#VNKriIdC3)sJC(m(PnW-?fIe&7j~6VQZ;OxV*Rm%l9%TYx#>KiFD{9GlT) zP%*x^r3yy!eR1;pKn&6cL7blo((@x8_25#uUOM1Xxek%x{RaaTmkI?Km&(KxxLnWR zlPHufo%jg#Ee&?5G+2dVBA1Fcn{}!9K^2z@g&LPi3Q@(Sk_+L=PpG(5mQ%XoQlVf^ z`tK29Tq?2X0mP+JgJOzHr9Vj&m&!0c*DjUTe6C$8RS{LC(Jqyj*3h|jsVp8&=h~&R zg3iUIG6V9(rP8N2KInqWE7&4)nfx1)=GB;m%Taw@{@yaJiE0W`2N#icR|{cvXl_A#-1oT#`|dd`Ov4#>1n zR9q@~^5|)gH-NrL46TxOsm!UXRXPmdoQ+vg`KLqvVB&!#fN_VV6tN^%PDim?4?1i(r6f{Z(rH7$88ob{d ze|k|K;Aj973FO@Q8=)kPOXYn$osm|n0l#G^oIO4LZ(J%H;Q2WT{AwtNqH3aXsT|&l zPe&m1XAqqiB~2}mb8lQKLor`K6HYPUh6RPLedCs~|T<sq8_sHwnxI&$F#dW$bJ$dO#9tJ4kyB(YjP>WOHfw9H1)()=i&w63kXD zatP-E@W+vFu9jwF=HN+)RhJZf9 zMzIDI%s#CO7m-}A19ML(o11m5$pw{Tt`N_GbjuR0T?LE1u7+T`kPGuKFg>v*mo=#h zwM4j7&>=DBMc~COXAPR(U|~{3|@(t1M-b*a#}Aqg?n5#VPG$EPck-5kYTUlhfP8RFam{-fovog0_RA9$IKIiB3; zcCqOS=X=q(R1OyrIR$~2u^e4o;!@cgFZwhD-o|pMxU5U%^<>APn^+A5{;J_vmr4?v z1iFXS96*Z*<|fg&RPti5&arm_+Gk@Mm&)HYB=&hgmuzg~QYnD8cr6LP2k2KD+qhI# zV}^4P!D-OxL}Alu$B0X1#d5raL2zL}B?;ypP{XTTKDZV+b`qc_f!N|wxzSKm>ka6o z04y$*j`IYb2543Q7MDs!bfGMKBcSa8SX?Upssg_c=v)96m&b(62Y1@uDz7MDt& zD6HG2jJfk7Q?zlJ$B0X10Vbjt&I72Rg^f$)7xaOuGJ+csL`9+-3AP^NQYl*mYkj(c zFd&3vT`E<7g^-EBrW@S4RN`KcLh=y=pD{6YA7orALklBg*MWU) zaO+Zue^Xp4PXMWWMzV3K)GLY?sHs@80m^S+E#0_Oe#XOdJK|IUoA;4)T; z5hVq1|4=dFQrS`qelns=20Vu-0V&3%l6M3CYmzvdf$uaN>r(l=GuG7+d2^k3DtI{6ZAd-f zEi6a3GvZPS>n?Ko10QBNx}6c1N53uPR+8)WeRC=G1q)UL55JI#rm7{p`o|A3?yqo3N zen^PfJ+JhVyp9HGnk8~xjZ5WHH1e<#*d~ihc_mowj3TD1|()@ zcJ{DacvMx7!SWR}Ip$$zkjN5YjlYpR;v42=?0n#>*;R>5@mJHUMRdA4<_lszCNbp@m!Ly3V>&<>d8VeNZJuj;{M zax^ww_dC#@=*Jy?0|hRXhnRY1ZHs|a*%DbI?W{{>)<%)o8l)6UB#G9gvV4)$)JWhn zLpVMr8kfpk%s{KvAZ#!snaX|=b_jFqtk8RaE*Usb&N3Ea$3j&2lxkAg_rOepjzQBSBx7N|e9@n{la78_DIg1N1YgMB!}E&R9tJ>-h2? zN4W+1<5Z&X{Z2cH67J1kT#7bhQH=VrJzH3TCrzzbE^mb>$x9v3JJ=|e=;H>(xK!p< z*6hI`&a&iy83xMAxKz4f@f77^1K3AXi4mwi<5J1`SQpjjVBfJZ0zBhVxxZ9~S57fJ zx?q4NG}5d~#f1k>h6ex|9Dv28 zGGY-%k*EpvI-vOhSX?T7v&uMi8=zwb4m?Zqooihx`|$n1{Dq z&#)+0aZK!B(qVo@C_vhKxrE;{nC^`nDS(X^2sJK*Sz@@K zm&!+|XeNFF(zllQtfJylIfsv`GW#De)0H&&w`}WDiM?*}4^lZx3{up%R4PjPO+ZSv z#2`h*rP8XlNE{B*EK9UWOVx`@Wiq}&sPhlz{^!}&rLx^EVm|@trX>a`DlV1J;LT!* ze}WWI%49uAQE{n!izS{+%nedGOMF&Qaj6W$5_M)b0Wf_=hxewf3+T_{_lktMM zRQ~u>B<29K(tog7iC|4yMpoV;@meBIvW-VYW?d?K@fJL5I~@2d%L!-_#GV#e)37&! zdF(&fS_yWkP%*MgWmSKikV}RAC4MT%DEjY^O!X^48UI%h71g~1Ueaw$kpCB4dv-5p zmrIj|0hddYGH|)99Em96a-jg@aw!B+r%}pP5Ee-%K039ET61H4U)@cBp`W< zYp`xgJvVTP$xQ*tlGNCW+#5 zdBW$~h?sC2b zcmTkAHm0~-Dkb6r^$5IfV)-~xakdRin3vw2ytiAvh#a&VGX zsW^Zt1af}Ar%dY(M3?M8k%vrtV+ZuYXCj~@Q^?*aQ`usq;a_nndEXP zGa1S`P9AJbVLd}#E{PAY3>tWYP!2^6b-7GliB(Ss?FQoD=gIahmi)iz_lI5sXR+lC zCW|mGm-J=a&VE3?0aWA!=>jw^m$aB)zLFX)E|(qi@xH#rSye7w<8rAv3u%=%@_(kR z(9XJCPWjOZSe$MGAMLEmC9w(Szb(#6($2bETEQvus>NA<&Yy9)jBleo&5MY`>e0@= z#j+6V%C`X8hfSN_W0G!ME`Qy0oU?$wwy+fuR9432(rho5L4z4y!3eW#>vFj<&*hMb zt6U)EH$>}l$zKci7{OHlB^g*ZecFjITivZKoUXtJSPm<$Im=ak%)qmpslZo+aDqxf zv$v|eK9RT&%#Z(r9jwF=^*&yc;{@)2{TGfF|gxQ%eoXL+(mo>AwS=X9e zQ0;Ix>HLG#!VC_Ut>AB(DViid!mZO zim-zqePD@Htii;ms)2qOPT~2EH=({sLQ1grkleNQJ8E7DDV$0hlen5fbdGgq{?eZW4{lW!ri9iV4mQ zr~tuK;f`^+Y(j&>v8w^9V`Cea%L2US6^(92B?IbVV;h&tpovJ5;IV)v2V#rMrPoum z$^@?hv_249-eUQ#I{sdq;3I%e1Y(QJrAaSQ?F&F(1z>TxH0g^wfim_O5WOL-^Bp5D zml8jSYFPp03c%uW`Q#0y)2;xhN&ps@%N@K$Om~551E^B~7MIJWass~!XmkJ;m&?o! z0xtrz!otSo(s>jn#C9S07(rAWx{+Y(F)o*{(tz|C2)9B=*5#668Ssa|o*3M^Tuyz6 zud0&r(U{Q8hE11@ak)5HUa3kTIDsIWy#9<8-eSo<50aYzYh`fjatVX8h~Hv)3D6LN zx%)LPmt9Hdu_@tMfR-9q_i)DLva+e;d_g3opaJ_+dbsQ3X_3WT27EJAjJRBG zmU3w+j{v)>gh(+im*yx~PANO^+=gRaF6S|Cz^Nnvsz$KRi@01~!?PvFZU-otV7_l+ z#O0FW6CH;G8XJf$E|;_zgmL?@1kgGYTiO|MxfDTP&YZ)*Pg{;|XT;^w@@HzmSg)N>vCC&xqL3O2OvGRM9!;m zxfH?6EXrRErjJdRg_IZCPPklZp*>|8Wq?<)99D@sf=4+$%1ny9LaHmK{`HEcP|e-=9g+7eTraLbNWI`R_^6e*h1! zZn7CvUM%c@XTeqxmJ6i9mZ)umy%Og=313V9QWJPv%b~V4xLsm)_OKRD(RvI3Ym8;` zFf&MGiLh%~MZd)$ZL~zzPnR=Gs}pt+OG&scj)HXUd1A2PagKsZ8DpwY}JnY~!m+n=EfjP~xW6_)G#~tHx zX@HqGPJazZyDX6<($2bECVe0hKLF{nC6Ywza%r_s`tqNE{}aOTG10hOVo#%zGSoy& zY|?PCE8$7lDZKm73Y7v>$H0MdmNtsnQQ<$Vmx@dVbL@Yx1CeD8zHs=X29oV1h_gGD zctJJAN!1KLepHhB5cHe>5k(T{5I*9vv?_msnE}IieWTlQ4YFK4$v+_civp5B5zwpI zC|qZ})0QbNmtR{-0`0&YoC^Ed94rYhm>@;_I_PWvBZ}l;d-&X$qRt^OFQ>u|vO3o3 zcKD{zQmQ|J?!|M7&U7FLfd@9@av5@3Qi%mUA(bec4cdufPs0BhBROvY`hZlT@cm9Z zi4yK@eo+*g3i_H7Z4^uNaf4!9E^RC5qWum;r;f>ZYPD@# zE>CW2`7vOZP9;X5`i#qEXb)Xf^}%j$V+44{<+2v95K_u&Fi6vhNCOA`L~k{+E|=q& zl2fa|+H6JA?PpysP4l`ON<$q7e#S_%E|v5nn(q?pa;dUi*bTw#XxX+yvv09nf1oEs)KHM7SYl97m0ORl zc8B+smt-XR21q+Ck-B3^+PGXc3Goa_pIc&3(&BP?x>krkgA`WJ6uwP5SnO5r&t6e9 zCz!>bXIqy`y={{9x*)Z`h*x3%#FDJm|PHb02OtRNM##2`h*6kevD^ z>(44GE|;(FNVc+qS?GDTb-7gkO2pOxsktQvDJm|P)1L~lA4sDtF-TEyxs3c-hzmj5 zVu{ZxDlV7G;nJL(0Q2JWZ0m9< zJ;dcQ`|3S_yW!P%*O0 zrNqnPa$$c-R2zI=C{s%+PCt26{B-7du?o9b_Mpcw9}3$8Fg)`ZXeKTe3NS8~o!{cK z&u1|xAU){BN2sq7&a8`N_ZHL`xmakaskm5P0YO|W6lz>7XNW2;mWK#eenQ2?GLVSk zVxeG9`uDImE|#fVt&1h55n{?)Ef-0mxL9uR`Do-by3G+j*DeQ@WZWE*9^2tki=>@t{;P zG~;5Kg4ZgR0c;MSErFane_oWNak1n-bN+Cg zimBn^V!1UQD|Ia%C_3X}c`t`@Mp(QBO2tPz>tb06_v|u@(@o%`oprGsSmSaITAY=n zoprJFT#P4Si?jZmKjUKg(5IW&KZ(QY(ayS9R_As*X`8|IhfUZ1YLaeTEb$fb?OH&! zEo?;um6dU^Y?zI*0JG2YZ0lmF_qXHFEv+VkG~E!bi>3NTf!6}sZeZQ?X{W(#_0cBb zybt_><*?$Kvs?{%8-K@3$=n70ZwM!-6f}FQibCtp>@3Y4rxdn8Q3Tk*N*qynGm8@S zK~J_(tN{hHPpg^RggqS0>7i_H*0m-Vl;>@ee~|WDqP44FvDZ};-VbNJKLPW9mc4LsL~*ff zUmvX#-C&$@w4f z+m^#EopG_$9w>7DCA_663SC^{VmUj<(Q@(tFJ?JZT-L>Mw!X`un^@HW-q3KYi{uGtoj`1HvHWsPVmqxc{=g=&#l`Z)XHb}8=K_?UV4b$OSduHcv}#oV z)e6AkV(D34;7)+L1z>Tp^uOWK!bby|7=Xpa(k`FCD*&wxz~W-*mH~fEjh0It0(2|@ zi;HDE*0wQx4baU1EH0K(IR*X`(7zToE|!(im;lSz8m~TL)Azo;;~e8+al1gO07A_W zl6A4Peu#r49Y0aZ1Fk_7N=1ti7t3e(1RYCh54cCD6ysuv!KXHuGZy${!?7-w>{!jlsjLFD zo?x99ak1>iD|{UL2%r;z*y3Wzi6=OY{RN<}0)p0GYHrii%WTF7t78MMWMyO*IJI$4RKm| zrhh349RmKo<>ZuSS_sj)SXz$|_1XdNV>v4VE5aBk;qP!-KFc&<}wl0=FhPWN1{-W54u>BZ{vc#ewmA6EaXk9E73rkHk z1>Plu<71+6u{?zLNeu;Ilp&c3^su*&O7SfOw8g-Ia+a}>xLC^kD8+XI%&-1~9f&Nc z6b|o)PqA~hA0tk5r{}UAG@RGYfSTcVR!UOEK(Fy1Q6zy5;R$|8paYmgQ(*_y8Rum{ z_`}sw6|+HKZ=-OX@lIQ&xLAgil5#o%=9N^~LAJ(GmV|$cwSAoF2cUa8n@k51&}|;G zw}-dDf7LSkMKH^!!hSXfx5Kl)BRVw&y>BW}0uOA)#d39+v47B4r4og+5v16Y@M&ix z8~Z`OkV+K3-)Sec5$?T@w+A>ccR_b2Kc91MOlT)ja(R!;ktjJpFJ+@xqK_LC<6=3! zNM|Dn#BP?%B^20kD{ovZjSA`*qrhI2N{m4D85c{@B%SXaV83f)1bD{9l7f#fQljb# zNIw#hhbLV2RvGJJ*+Anorwb;wu<4thO3J!e#_e`Fl!nR&yfAU}Fho8SmUI@Ac?8!4 zloWu)#S&E>qev91>I$fL0A?4*c<%>A;H4*3CjeS(;K0o%O%StZd1qFVLGN2&9<^-S zp;;Hp$<;!<3exwM7*tf^V%gVPib|zmEjTt^R8&!tw76InZx%%hgOp&2K}m~?CH+;A z*aD>9mS~d>7JJp3a6uHE0Oq{s+1AB!t+Eief^^6dgA^4P%WOv!y#&%XmKda{xL6{? zMA5%Nit1{z{;Z(44GE|yQx4=_7FnDNiEt&63^FOq&^kUCppkfP#Z z8D7-obf>$17)aABkrI*HLtHEyi;L4@4M^K8k#b~REGzI-&#sD7z^_@36(-{aak2dL zNZ7xE83hl7zTrdJtVFOTEhFFRD~_DPh!bz)QIS~}%SJr1vnGv!ce9*;>>&2E$P^3{ znLQfJ#s9(9O0bKCijiF`{|pot3;Ro=ieknzQyVHyKY3LAbe8k&GWcJdGq}vz2~UxJ z`lqX$bN0I&{}(uOa%K5nNgQG`S6jB14zFe9!>rSMn0=iObN=MR-2D59GOrpR=J({o zf(d+BxQY*p4)S5~Cwy4)1s|5Gw<+GTI6f?|%ZC+%_^@&oAKqBchc&18u=W-o);;0F zo7wkM^i7rcu(b;xwvXq-&J}#vwVw~Wuk&HgAAH!G{vC?9uP`6puEmG_o%!%i&I5!U zD9eX~E%T~XoW&YV+GvERic!J8V6*GjjGX(gjsZSrDMye$Nu%58Wg_Jp!1pa>2}_|#&X|Eu6#gWY5(-DWC~P|8 zIw7VE`TD6#QwjktYbjbvk9LqUs!2bcQ`Hb~8$;2vyZPv&tTAK1LIbJ#0eaQIK1$cg ze;KPhV`gr`cV2mY@NB>fiNb{ymwqSE1*a>!ovozhW{WufFMA<+Y)k?jqrNZUa(}Ye8MD@XAB3oDh2ZC@N2z7pMyK^hV*Tp(h~NV; zJ+{aXfjJrXu0oV1FJL;6zybh@S+HPo%Ym$Lq2%OO`2@|+r<7>rF3>Y;?fszsN1}Q0 z&DX5;GvU*goj@9gZ3@Y~5R~YlocQl!1g^xk&VtV;iuSDz;KD<{M4~S?EOKHV{Prco zdY8s!w!8EDBe$>R#Cp~r=~IhQ<-d11+3r!pTa>0CviNhd9|D?<=ieS*jfhW}&_&n@gR-pYBjXeF%O?ad}4? zIaz3;Hk(hykHWjp2$*CzP8J%PW_v-^Sd4eH5NVS^e8khqXIbz${$DS%nu?Go;G824 zodl;qpAF8IQ)R|{CP5EU<8TqgsmzsJ%*jY8upCZ{iowY;oeHnGY6Z_AmkV(e22Xf_ z5_p!fRG?+mR7}Lvb;E#?-*p61LG8M$OR1lUsACuJ@p4ZmTcWCsua;885^voEy_%Y| z4u3a~Yt3?^ih1xy>ZdZG980dLjfvlE^;Ex?&;)Uv)>rhhXDP1K28z0|%$%iW>d-9= zMkqxuRQ07}eYfJeG*xRWwIz#I${8T2rj(|7ZKr1U)OTXeP*hiJCslZ|9z@h2I3vmD zT~NjLP&zIgh&vLk8sUW0cXQ;uLR;7S&l&UWm$c}$ME_KDuQk9o0hpzJztd-=7 zou}51)sFmHCZdk5D|V3@=67*KU9rp5(IkDXSx#*BlKGKXZ1z$m`B1tNAIj9>L;Poa zD0hnw<$vTug+KU^FoqA6rt=|j0Us*A!H23fF-(fhUac4(YBb}(njQI2s}~9*Ys{496>umy`aNo7wkaBuX^Y&UXf2Gk z$eoG=Xp7vZ7RD;)WwZ>wE+F`NV(0i1am^NaK%KgxZEikM2-Os}$Rlb{QC-%%LQ!pz z$JCPfdgytX;QkbucR?0;PHh^mE%LtMh(%sjRq+@={0zuNAfirRTjULOpn}U81Wq~P z&`E&kWMPZ^PSvl7elkK9a~$Z+qHEO{#_mswMBYelW6idMIAg4Y$2~L4)v#x6@))f#`Ff|U>W>eP&^kT$mXgOS)R1i{| zZC#_W=#&C_5@!|2jz2Rlb!~QZRnMv%x}HL?R+4M8i|ZB|N~+B_O++1A*JgKDA|AIW zqOQ%}uHE@jJGj;?CpJg?dL$N`qud4Dq_H{5|A0f`c_Yz<@o8}J{u zguV^rm_hXiG$r9L|CO=mWdoap=}QQ)v9F#){MguGzwu$z&|`Epc0L~_Z0Ezo<9wKO zg%6W|sGrl7|I>%QAZG*J2qT>&PT5*e3Gss)IGkARB8Cy zr)uFCo4ae%-E`>YK1GKfFYuvf93OhopPt6%?%j+JeR}bs?`S^so6m>-d-*Wn5+7c< z&xb)7-=}y(%J5-m3qHI$f)B&z@L|LTK8)SXhe;>-F!?GUru@o>X`a(0WqNi#yjG15 zvl{SWP8S?XUYv*;&T~l3eHHBwebph)yNax)6ph^T991-!Ek%Eln&*VNg2%s7wB#_) z`-&EZmFli%-$k4W{HIEn z*2QpcBprZ#r-_p}7Dk)Lo8=S`+^vw?b40_I(?)cy2)hIJh*1}kanYYBuVVJ3=C6#&0 zQC5|AF5bb-o3Igr^a9Vk@sw5NefSx|E4_zs4==mSTb}tDH%~*{Drw`eE&^)(1w0ZW zBk96-h18)aPF|+f_!;hPLR4;W3K*V~msVlqtvl!kO>wom|UAb3GevnkBv%xPm}Yo0{Zs3u>!h< zjTP|dSFC`(7-p=1zMt}cSwX((_^v+^c0;!BN6J3=VyqRMn2IHq2q+K&`#vI$v4XFs zqUp0Zu|6z)mOx9=k zZ{jiUuocW5VXc6&YOG*81f^yLrx0$efcattU!s?8a>j9<0{25?BwhHflR6Z|SV4}8 zE~cph;1n}FV+DsNyBuPx+CUl*+6q#P71WuHH}wha2BeQg#R}TKg--|&IswQui;@*k z)jEFqbXv*1)4+fg(3)yv1$-`T0gpJv3g{&!V+FJT{Qt6onHanuqJ$yaHx?0mU*gJI zK?(e~FTuq^VBbaJ7%SL}`>m11i7hh33O+xJPtYT@7jY&d3CF(?0p3>-TAU_*a zfBiuE%PV`Nzw|&hM>hQ>rJVDFQrP`7Mme5OpRoD)M_cowGB)N{1hG>yznTa)=Er<7 zzYoXb^}e%sH4yl0Y>{-~>wq&KMKR`g9&IThY9j)-8=f)0pWeh0ECi}k*nLRoJK!4g zTRc`dBv5^g-S-w1^PAtqrBMeN3dg47lKGKMIVGdfkCNrlRI{->J{Qa5(Xm(_`4^4l z(M@ISHFDFCzHb;>=p!ue%k)n?hh;L*f|AYY>IEzAR3{M21-2BCN0? zpFFZ1E*{~H6jOE>X7vBzs zTvZ)VU2KtbWh}4n3VfHC&}1Ne4XPJ~isk*;O8z`{tbvW?QOY@gK7#JAZ8*&5z)rTj z8Dp*GQ5hS{+W>NEmiI2gjpZ?4EbsR`%6S*@{{$WZk&$%a`wUk;iefD9Q5Q{9vEalR zp0T|D^#KaDssf}Ip(i25Sl&7`nj}zl1k%-_VtKRg2s#qTc#D$dkxe=AE%7)Uy(7~` zK;;_I`CFOFV_Sr4r#t{E2tU2$=qEpXh2++yo%~gE<*#}G;T79GMYd^hA6K#0ILAq7 zx)LMpgk5;7bS2FG5Zy?^-SloJBH_yk_}lA*v}N5+Y{FD@_0V6vyg-YCn z<)0AZB<>jHa-KeYI<9gzj6BBUH{7YXcL+GF;L8U{!7quL@TwQdCDg;@mnWh0T_l!p z!RLm8Z=(f^O}z9gNF=a8A*BW0F9&6{zymLs954Ha1UAANN+%&FGN2M>*C(+9(;>;k zxmOTQLcVxGv?`m!YE`iYgwRY|-0?!=5&dQgxC!ZhBHhZqkHSkF_JhupQ{|U8m9u=J z<5b<639WKmJC|CDDAnp?zBn$$RpBVk{dfsDuB(e4;bMpt*U9z$H!kNA+3hPJ55pEo zS5Ea)$Vpsh*P;YzhhI04+zmB$?0{A^)oIkOs@Ve78COT`1xYDCrCY0ek8Vy}k`8j! zoQFD&YpAb0wR-m$?!-0GR}nS8LY>F8)K}?i`ce0BZS_@bt(UtEapF4Yt7rkq&az91IJHTduD>HJidh;#TP^r^YYUakWFy-J)ux3>@gh z?NS+0y(r&5A*oi%kRDFlULEABIRcaXaR>C3r&gbroVdgKBBIvILs5k9>8tcL55RKc zj_a$~8f)H#y5|)csH)YqM=vMtf*MYVIQ~vJ)ao{LkP~-F2dP>#PL8{xuUt-Sf#%=B zRALLXxW`9hgp)F$LET*R{y*SQN9^~}RD z?1Nu$gB7WhZZdpfonaG2>TN=>`6r=W!WKyvK4SZb z=4e{uu%n7;4MAycXii4*?G$M`2EG}(5&8glnZUi2SVrNTeyL?inH>Zi!rG%lxT;kro$m2)bx*by}t!~c58coZu3 zC7-L>qg!IAcvD{tbk)0DQaQzL>C1ZSmbjc^U+Ie)%kT(V>FDgT<;QH+!mxPU3@3VO}e-vNP{S7^}Qfx2)QfB224X2`$3RA z3!v|h`XcEXte{v=*QZpf^~ofP^>Wd(k41ky~1EBEi)Tk-vFW`|7 z8A%tuE0iWhF$17*EPEnE3EFQ2~lZ~Y!o);nM_|RiX{kOt3p6Z5V{Xslj+54 z(MS+l7f2(EN~Xio3fcomKZ{bPM|=zg{F4zi>@UbrCHCwB9yJ-R+7kP}$828|JzJG{ zho*L-KE_Q^;=mA$ta5b3D2~FMoKNy$RCfd;G+4=onYO^TO$ij(afnQtVEh+`J3+w0@T?}NUMXA6BaDlyzsD%f>0i#M5Xp$AvLaNjtkEhalE`@Ec z*;07(T%Z)rKu&61}hzT7FWU@u26dF8nX>=u!brz*knDQQk_zxqhC+$VP zSJu34GhMSD%0pU3`i5?5nZAs0lWFElrt6@88;5~}AL4Rhi=+$RJ+OTg#bo*>)`}3K z%7atc@NA~{x*TGwRzNxsIt5&l=~|f9B!Ox$kP#M@OsBo7G&&E+5{pu%uRTSkJ+8Z4 z$#ZAf{H`ZOB){7cBendVLb%B<^CiDmq0AP(J(}GMdm}4{jdD}py-$Jz1GJOW&CezH9Oy^98 zbs~uGg18LWBI&|+6Ko$vF`3SYp)et;FgPU*&t&@Y+sYxfst2Soq2GXOGCf|o9TKQ| z0_ks2$#mw;N~4p3%(N(F`s)gm>Gg=}iA13z)6?hLOs7c>Wcp1+OD)q!5N~^9M{}FI6L`Kqu?=r4@6vbpZs*9$nT;Sw4Jd^3I9o!DFRb?PG3C#j2CeyDWE(uf} zfTUPdGObz)Is(Wzi&CZ=cBV`(MbxmZs}aA%o>Rb|?-R-CC4FLj(IA@i7+H6b*0C4UJC8x~(-*A_$?$ z8z-z)TGH^{o&dCl!AX&)L6RD2lA;Xa8??+=zw~%Kv@i9bvJ3eZaD=VsURw=u+7W{v7PsZ6L!L*u)WDbwUe z1U@`Y*Jq)}$Jiq2%F$@EZ6CQb`W=v84C?F1l=UQ_^=XWqXqm2xghJ8SSb&~<%lmIO zP})_;$I`|lvMLI=JW;wrfNv>+98KwT`DK^$I#HScZf_}XGKGB4WxD04i788>3<5ln zD5R-x2!ed%u6FW~gSpIrqupWZi-B*n9E!$7CofI!mw9DOEqq3oWW5K@DdLev+T6%J z?)Ygrhi5M>vnZ2LadE0eO~YtY)O2&|Z~By}PUCD-)O7cnqCUS4)1`D>W)UWuu|?9A zDe7tskv&420qJN^-&CgPqQ03ZAKD%Qc$}ex6m^3$F6T$&M=b%ojwr7~fX|IHQ`Cq4 zK>Yh}xi2cbYUj3vt^>_@9vA@tlkJ#8>@A2U`THX;G`;bT@AIk?`_0@HC>ccj1S$KPLptxAuwm1nP<-;kC5RB8OzRzRpmhy6(DH@w83@v= zq2qh4!#O{2#rLKK4N-Le#rHWxr!FHA@1OS5q5{{sm(JBdX_ z@vj|OuXyo7Yb2_d0~MWsS&jJFH#$1bKnh%d7`$^@U&FIb{Ja5k^lGuz{otaAUwFQR zUhLQU9S_hY^^kd*xNDsRcU}DQyJ#r*vMfAg@vAoNkhrx=0$p?UMSU6eO+j>8@tc1{ zf>F1s1KL81Ex0Y_nYJuVH%sL2sB-)1^=sTO?gMSsDJ;wfB30Uj{VN zz`lpXiOEz6!hdnS&=`YHKxzSY%ZTIjA$T6Xaaiu5t440+6ef5Nb_W9RV-$M1zg*)h zVlg-P>Qg|U6U++4FzmRmR!|Pvg8CWI69fCWFOL~TDTKNEw-FK1%N!>gHW9&aTKDzV zBBBhSDh3u2^qGlrQSLU6(eXgKY6HA0aVQVI^a#Qm@^6BZ$^H94NoExAsaB5WdtWmOTbCp)xfttBWEh9`=a~Zg(Bx9@QqdJ-|sD*bMVj{J}S#!A%Y%bpgo68r$=0dN3 z-JmqbA-yS-CS6%`N!MB6Hvnxhux}f>Z)+~M@?r5IAaw$}v&8v^tx3$q{|_EQ2>uGY zI{{eCWg80SE-B!wKwE%KD`3p!0d57lCsZy#g$*2PF2{1Zw1}F(lMDy%gHZLPbvFXc zBDw+^VBk=5IfRE^&cjsT^N2%v@Kr_1)?D(JlVr96f7{B@95I(4cB1VoL_S5aN6H?3fT^#48p45(H{~%|NoKj>j9E*e->0N z+db>5{|_CC93}}RpCT9W$yMLrzJu0Gp$nn4Q8>^NsPH+%K;!pn;(Kkzx%4EoC`x*g zV|1!}5?T}`J;|d$Px24-B-Nm!^dv9UaPwbRtwE4p-&s`mBundK(GCT=F;eH9=}D@8 zuH8V=lXP4rorCU4exELvx+i&zrYNW6+Wh0L1Nm4eroL+#`4eY)lPJV`^Y1mx_qep`O#?H0c!qPN++S+l7 zkOJ8O*Tvn|MmDmeKTunSOxuKA|+}%9_g*JjycsJ)qwV>`Ox&V=mp` z@LLQ>rCp1eAZ(GD85VPyoe85Zf{Oqu6@bND?!o_`gA}L_s42m$fH9Zf{mP+xLiGVO z#K58EGOmP(m<4=+;aGE7SX@MG2lS4CL(S#NPgqt<$y@;b1#u`3z8MIz=5nF7B=bA) zr&f;Uh`BVvvJ+M}1{ISRTd*84myddgoJ8Pti9LX*k+k$QHOKVRH$~y$xB5Po}khXmx4DA`Y}N5eHg;7`|u(GAeEGPMk{{OiL1_ z4L(h$x(%i!iP8qoq)8AxnxBhP|0$>;ZSWe*b<-lid`MKU8I(5ovqH+LLV+u(4W^xG zgSUMv19Ux_Pq{D6s&0dGW3U}GnqN6XP(7NTGgad1HaHqR0FlF*;+r05gAXD>X@hCG zB)7r5QZKMfGOTkw+Zt`TiZWGsx<^ke*m7~4 znMUMjEYKOmIE3iFpAq6{MyI9?@%2JnuK~KvGM+F)Kjk)yS1jWM(2K+%rF@@&p&xQH z==p>On54fA_@Sjx!pw6r>gj|mSRO<1(xTupU}J59ir7zf*Cx}Cy2)y~DbQr`e3@;s zZUr}4e*`yKKL$5hx2B^hCA%Muv?fw|bY+{Ya*N1=KsIP&aX|jrA*i6Yx0zR8Klm}lTf^3sjyrU$u3HTl>M{}gfdZmV> zbq@HIXXHqeHE^QHc>w(JGjgQK^7j%s8BxJGu?6cRO_mE&)Kn3wJn+hfqnj+U1#Yrb z8RVeN@vK;Fh#qd-mVmkNWUe)rLBZxSJ=k2v1e?nb9q{S~rMV61?WQ#8%9_i4Ogu6C zA)wC;>?=qdV=n1GP|k2b>OOYA6Q>NrVlK@$xtu8kr`wGC51YVZE>RI~ry?m(6i{h` zSpj1%IlXR&?g`ZZP-_E+noD-9Z($KH10QNQ)?CKt6A`lkEi-Vaxiqfo=sfHJ{w{GS z559g#*_z9XcvGH}xdQwvD@Sw0Tn;pKX>}h14@2by%Mo)KnFTX^l;fPh3lWEMENO|k z+#N1*Y5;Haj2tnSO;6EMlboKw`x}ln7qW$bxrBZ6JxVY>nbsJiPotI5IM51c9B83) zIITQ4JzPPYOAkj&pQVSZMyI-mqovQ%!<9ITQ{BVG)0KFmF{>VCnyK4>$XPM#D0_ zfD($|yaEYI4@b+gxrgHw!GY!2VUPYsDV0h17m9OELwY#!LU2)(sb*awWvY{tLV7sz zjz|wT0Y3H?xO|F4!yqk^E=&)X-3yNau5$n=U_f6xX6PO+q6MO%hpPfK$uL5CxZ4nS z1j4%j?MIAcME6}pi0R=PWpO!Ya6J*|EX%mT4Bf+>z+)N7coXP8Vvth4-3STk;Z~1_ zAi$qn3Poa`>EWtj$ppo_56bUEBW;3;*iUxXrdD>{!_imj&GZfxs$-k1EaXx#&v3=~ zLI&k|=)w%j_w0s;pX|Q#c0B)Ji=?YSla)u{F@UBU*f)+irpcNQGc5v0t;KE=ab_|s zO;-L1%Beu`G3-tUU}>_pL@8%3DR2|eZGu?=(`3DdF*|>j|6hW32prmE-N2xnMdSfq z&~R*%l@l3q(y6? z4?H7BnyeZPto%Vp#1?;X6X8^-uF8}ty(=@>kuzMJQ#ax!0SI%Hk;Dxswyl-F>Fy`{h zN6O)UZYTz*f`LQLW$qmj(F}MS!?EU)2{4No2xydnL(S#w+Af`kg}_%6hw|WS1a+;s zEdNK6IRN~mm7_UgE_Jd&?5AeIiCT&@%9rebeOMG$3@)wk%hf$ta}hNH4cD*ickot$x39t@nq&8P z_ohYopL8DKy@I*Y3V+dgTJI?QJ8y-@be`Tj{{r|==sen+5tUrwZ#s|h{)*?!3jfe~ z4sYMLaQ-iy$0iM30uDX~iHm$m?Rw)v@kPO;0noUDi!X{M{c#)@9(DR8eBeo6W29Um zTz!O#vPn&jBTj@OZ7U>Y8V4jTUnC|CfE`wNK}8+K9B|V0Fd!M!R?uoCb({inM)eL# zt4>lo6i()Q1Z9%A0N_~%X20BqWzj8U{t5H2f z)xui$iUseZ8p4V_LZK&cAKvbr6S^~p=i0*`ovCz{mP~i>cx&c$Ii+r3)lsD$ykNa! zL}H6C-&IZ@z-c{+t()SQ?o*UlVq1!luEtKhU(=CL$GhS#=E+*>ivIcOOu}d5Jz;%b8iH{UQc3KbAB?E4>9p@`oObc-#=e8g`!ofM z!Kk?XB)^M?Y~N3EQ!Y(_GTr%mIP@_$-N2;GC<_tyTv-wFD}~Yy(a0cEvZ60YjC9jn zEp0yDkyyi`nO-P41kUu7E!jbS%!25%a6ZB`FXc8t>D?5QCU1PalY~+b;3sa%OPF|0 zZ0sTyeMyeviju8eP`wpH^mRE6k(91Z%EYt4#xh2qoD0EbQs#bQo#;DsTAgkY@UkWT z#-S|k&~yb$>2Ia*S#W|RHf1Z7*b`QfK8qJzn1|89CMq{o7=0>_Atxn$VI-c+ zrEtp1X0cLCXKy0fbSBU@^>iHwRs$Z;#26O&gfNn=%POT6m3%LbM&FkUl&ONY zXQ21+#Fsdfi<_D`AMe;IrE2M}=sx&&2v|jy{RffQ#3_BJ`*OV4lDKgiNc8!@fKpEP z-3m_|A{-bJhM*_r8d?(uf}5a%=KJi=Sy5I8gGJgxT<_LX0w z^Yq^7pDV1;rSoX-&aw!fMdvZz%gG3zP3JkhGvLy$JcrI>y^mkV`TP`gwE4Wrczmq9 zfQ+=D_kC@~M0GkrvnwRXB6K8A8#OC>>{R1A~^-&{`jJC^}(A@TI7#Xu1X zT#j1Br4)N!DzQ_Fpj%2@%SrAhoU4}4ypU*aU8=^EgZrVKo2m5u#z0C=N?}YyC%&)9 z8AzLk{=%8lA;Ob)GL<@MkWzzqA1QJ>(iY6~c-s9AMiMbzRK%w5K?dcP#icYQ{BuPm zNLxUHZr?h1!fJI#6B?TaxxTJwL_^#2G;bC3I^Dq;NIL0 zog$p>W+!Fv1r%954*k~3rV`R6p3?9#@P?cP56tE{sWEjRwHf32Qp4MIgzl{vuVrz* z+q70~s3GadH!6MelJkbvdlI!DQ#hEufhobw(rrWVH?$`e>9d%+Fi4=2<-65DBNZJ8 zrq5++n68{=mmeT2Khd79=_{JSk>7d`k)stI2&S)V21U*?83WJ6s)`N-)8f5AY$>ak zFbAIau_7NZZ5lU*lM{xMvWOVpDOz;I3y(;Yj~G(n5n)xS!gp6CO%=V!MO#3Sp?NE! z!n=6rOO9PU^o7ozyzey^6VAOkxF_#BDA$dDiTM#Y7%#NJc%g#|Z$}4L*klxipXOq^ zc&hiMJ$-}G{WoUT@|C9#9OlYb;Uq#JoWAAP(?efA>>_&|Qmj9P(+A;tdgudsU1YCA z=p%7aL({mOD*0$^7quuFUXc7WD2}@ECr;z0!33i|E(bypDvqcj#4WjtP8Sll6b)FS zGGTaFr3{UhqRtaHfyyK*DjKKNS?--Z;MQQd^D^VKCd;Lj=~e2n-1Nk4$a23UZX=dE zm$;2tZd&5DV7WKGL1=rHJFFU_bzxzdU~*Mb`1E)NoOWZm*NNMU<-SVX0W2(k#_Z zSqD%0TbNJm>G8cnB>KEq7uo9&`h-^4irW}7SB=5^CrWAcT(e4$>3> z>4>Nl1w^Gvm7)}-SLsEXfb`y_zTb0Z?%ta#zQ5n|ynpQGX1|{~b7ppSc4l^V)}1FD zytIW2yVo?t?>2nAh_MV5%Hy3p z5jD}tvwh?Bo|iXDbav{?d#>sdo!mT*ck(>SL?=&Hjo16`!tg3#tpX$4FGWPWdY60i z4l*J;aEwOxJ{@})kqP|UX@o5U5!rDb81P-^qRYd}d?~&gCq(nz`8W7^AR>DlVm@W$ zfH`PjL~Qf$133>gKZt(^8ewxmL=JunK5W=lGOEqu8(7%5srdPYT!g1^300fT*Fv#H z1;GAowuHfWXFKeBu#^4qL&h%E0A{-a4M4f&&M=WB-hrQnKRwfLE(0;S$$vQPG8;(P z^&@g%D&Nny^FeN?7zvN~;0z{DdJjJ5gR?ljx9x-Nwij?1k&jI7Zl*;e!|RY#{c0Br z-1v~^m`0{?aJCm^lC7(1yWPAfcvn(pOV(sboM_jnC61_K^u6X%El6FYbvTD5Zew_RDMq`a=+#BGlc2x6NAESMA;P~l&$Gs<@=r(aEu59P z&HD_n14f6!7)yv8AWel{H_(5N97HM54-V#&XC&0dC`IHV&fvU!kkb~-zi@8&ic0v3 z^`AL$(Mfb=JYhJ73L-ai>FD+zx!p0eC?gNZSs&%maXZb9v(jBM;afh+5viM{n|*4R zZYbjHs4~IUrLE8|k#jw>gG=uzmbkpCdB6#8Frqe}SdL-0rVAkQoICQrM+ zW*Ov@TzT_+ZFmArboUT@L%$6S89xI-#e9&C|;20l6&|H#o7o}+n^qQt-XS!<_mJ=ucib{}IWk^FPf6`26~(~{a%Ol@J$mlDEA^=o z!@g+)iz_*dGAW7u=Oz5qiB#9=x%3FS)8vxH%li3WHIn3Zg)mrACY^-mMgP3vwf%u8 z$7Sw{+q@c}99365J7Kh|au+!eAqnVd>--A|=!ZX{l8S=3QI&aQ^2Nlf2x{9KIZM)r zZC+GR9qlj_4fHY@M$hov0jDv0Vvk zQkX+=w7g{F_zcXUy2Spa>@nXBzxjA)VG=dTtLnu&c@e=xCoesR+wLIV^Q_B6=V;mU z4L9ET6~eaWiY41_9iIb7c_LE0^IUPJ-5GgbPxhlT^KU-hS(rpk^7?J@PF}7q(RoKg zy_S6o4DG}_dFoEQb1)(Z<)4X8UIz`Wf+4)$v4Hokg}moA&)~2eS0o3Dck+~!L?=)6 ziPw8(;+-i+|FjhU=Hs1(N!0saJ2KBtU*nxw z(Mt;DpNJ0Q0*OvuQ!CNQ&yf?IH)PMtVovPl2HR= zywr@5aIZR)^W3-QAkHstt z9FID49<}FE={Fit%lV&W(#;Gsiai8VemS)U7FH!IM$j|zZ6+)QCNbB{%(r8l;IX{F zHJbO~_?;-f6XiGBvxqHG_O1C&&Wn`v8;l>gF~vJ`0S`NZx9@1RG}m7Igr^~EIN@Oz zLveJi^kS-^R-<3}<`|Yf9gc319?!7-m|M0zXdjMt%7(`u@SfN)iw}IZmlVS-egPALfgO4J}Pahleh>l@Uj?vm#Cpyg3j`LMu%3rlR&yBb4(h zpbH98VC}0Ha6GI+Ej-@2R(CTQ?$I?ISkR|7j^Z8JTR42Z4V4_F__m=s(ovFki(dQ|BohB zvD`Wi6zx-ojO4Y6mL5bg%limkIOucGQ73~CIEWqqGK#&Mjend!lQ4y08`3+p3saH0(# z!4YGaq$QAYAdwae3a&{2P*H(R?h{mQWo zVXAfoy7K~0<$uBYFF5!Qo8y0i1sN(xC2~3ODm;#c!Cq!;3JJs!?NBA!bd8J<94MMp z#tH=-*Kk=tuJuA*slz(<4u#Xo!c~ctuNVIwhh~mxIf^;Z(sgD)3)|`bmusUEYUPdL*7%?A1Ju1LyqP-m8DO%))b-n{) zGe+#m;E`_;Jz;s}C+xu2*poF6F`L$S?6H!?vpl%o-H%MFoq%%aerzT?3=^RoC|Su? z4#Rz{{YVfaDZy|DIckkYERh>9$I0E6>fs-XCpe*?n%?8`GH2Denn+um=fNz6f%D_G`>}U}PHP zIX0pq668X&1sYikd8>{1xO*w0n@;&D$d_&8JI-h2%U?rQ;)>#kUP2By;z_h1xp)yO z_tjp9QBpEM%4N$O!ieC-pWT12#p8C)OR4}lk`Z1+$B3AF6KTE1%ejf#0!qAB<VcHgQ~uVZ`^nB_cny#*s})ezdc%tPba-n#9$@tVl%w9Tb5XmvpDk~r)mu;=*lMoo z%i-{gEu0kRG1Si3)b$wgjy?J(`#OCtaze?+s`4n^A$at%Ocj0atpcU4M-7(Zn(Jg9 z7r1Bs-2dUo#5jb4#TGG2$Qj0pH7C` zK|}EXovU>!481lpoEO2_(CSiMK=xf-&MHU%mBGwV3DOSuP&-J0{|w@$)G2k4nZQ@r zL1YL`BJhtTh~A)QDzWSa{+Au3FcSEF$CA5(EQd2M7BE_*?!2h;` za3fsB!Xwe@m(;cD`uWgSJNfv;Q@VTPj?2-uCV#!f>aAW zbV+KMLetejHn(YRkEoLFLzkkfvD%Y9AjjEsi-}3;5*WpCm!?h^bvxl3kn3#P-*2JI z&>RdCvww65M;|pB~jBv^I8dQ9;_VF7)KfMo>e5^?y71H^*7trw}pb;+a)uOu# zw6VL;U-&WNSriS&wIoF->>QeY*i_N~VNO!d>d<$nu?4gM)p;K%p4FvYOLYUP1E8Ks zKz+f*QeR9)5@X|_e_=B#ys?UV^(pUp4gLgZ=fA<=EeN7>uK{hJt$n-z^4`B`4K}2g zxPeOi?(^vNVpFNM-MUALBmX4P)TMA^AB(xDOOk|aoSa_jzcNc2%Qm3U4@Zok4 z290oDaNXUNKDevR&Vv4JQYK@MF6f1Kqj$5kx0|5vOTvhwM)>tkFxH)(V)9QsYFD}f z=w1@g2p{kPZVx>ue1T@%sBcqYQ%P4&ZOw-&ttX{^M#|0y(90)bbcDqc0QRD-AL|OJ zF`xt+^r`e=Y>T7m5ph-69Q(XwyhYBESDR7Gct+zp+x=+BqRH=rJ`Y@o2Ht18O zSvlZiKPqrcNBsg&;3ZFjeS8$KKYbCa!5n~!*`SY)0uG?H7|jzO>i}wDgFZeAIFKG9 zuLbN2Xp9Z|`1tcz@NqCbZLZJo96+mVP>Ph$Y{dvax)!H-2xU#C%hf)R7ypy4SPG?Z zEPb;~+kOG^t%o+kMgD}Yp#deALi)e(_A@rsZwv2N7oL4evAAYME)A&y%hD%Q@&r1# zT!(G~siimcci9p8Gs+*JTZ;W44e^E+c`}{+RvVuI=}T|uD%(+1r&29E4VAc8L)zdC zE%J2w|8~|Du>5>7RVM z^_mfS0h{r0PmC?0?-Mjw4N!~?D$j&jN^=|P2s=UVV>5geX{VNviC5VqnG>PUvKi(0 zN=!<3FQ;8-%?h&;`X-xEnJdf+%H2T6bqx9in^FDD}(Fq`SXUz!;QeY(x4 z{1N6C`g)A^nO9d>Z!^kge&p@mLM{w*i_eFlU$hyiGE`+Q;8x0o28Vzz00sW-$pEQV zR3lNqZFC3&asuW6RLln1`(OorvjtIar$7uN2v`SDTN|{a)}>46-{=oqjzSLtIsHAf zPdSqyztfpsI>=Js+ujpI<*3j*h|sQ<2+n}KXVa2EpHvFHlg?mdLumIkoNH{Vt7bdl z9e(yr^e*b~jSg2CVH(@v_?*b_u`j)wUgO3nvGf2rIw|d+p?m1fR!x5m@+X@XP$KZj z{=JkAHI&%i3-Urz+TZqm+KC}lp`U|He%+H^$ryk703F36BB67Gw35>Po*bfo9GY$f zvV%=aGm32+;Zn2?QvtlIC}xKN8kYpb>N{Mjj?tMI?dUhqf3g{AVEGt3PUG>!OQj#s z@g$%T{{2wgI?mF4jK%GpgO<=;=q4Kas+A)N<_9kNY)!^3-+hiYqcbveKIlv!i~c7q zwl7fJOj5R^K(?`I$x(mXm#9Q{3n~^OHMooct$_dFQR82+aN!d3a;9a&w94Li0Tnl*st%QeEub7qvlKy%ayGA44uK7`cY z4n2zE&`ESBGYcZSq=7LDni}Jgj2T7W)PjMO=8yOzz|a1`U2X=ZF{@&xfB>ic0f{2q z4D6~cJYirX#xya+B-S&UiMX9f;FPz$ni$S(PHU!JE9j$rzZqU-HGlUEzSU!m&z$NJ zjH2k8@G6`6O9>rmPX->~aia$)mKmosyU86GiFpbGcD)PNB#H>rFcF~EyPcq~X1 zxy>)pq8AHC7~pqq6%f7`g~?sq{49&^;@*P(6q_pYJjE2TR2zhZlrT4r(niwVL3nwQ zK^4qlb>U_y^LSca9TkCI8JpjI!U(VO8Nkx!PS4n1GeDi+2fqFdU>UOj`qENwjRG{y z2EBP0e)2tebU%3spiKjCC4j$cHO-&!sFCxNdIB1OO{KxxnbMKgGVkCm zOCcB8k$S1{Fm!y}bY8=&m1?nc)3zjlG7@9%zppdFyoWbe zv3Y$$xez0<=DD*vrosSJPN}xp>0>B24b6FYAj;1)s2235wvnBCL8}5(`yaU6$ZYZ_ zR#e#ruos|_?*sca2iVx$W$GBe1oY$kz<1RFHZfoQg~_sP@i#z6-v_40_^dn5>@gNo z7&ijE4d~VTz>-;Tr8G6iMPi;8TTF8wkAAVK9Pvra<3Lz!W|nA-Z+!0qSP@XY_kp$X zaFg6NNw=mu481YOmngZynB%l%gt{j+_=9>^xUSXp((6{(8 z=~lzD*5-rHbZh7o^y|#X(7XNE2?K8owlU95)}ZkKkN&YKkWZ05aRRnATMf}*en91H zkWa2J7;p9+s=d@Xh` z7tYk+K|tqi(0)9rEhd=PXKC;mAlE}rs_lo88tiD!?XSUXfJ)jRpQ2#&ROoKW`fP4&ib4UX{&7UyJCO`}W zerXNoPt&;vnmydS{WomBjFitJJ+Rkq1M{P#skECmbS+2D%&$ppJ^J64kD^2&O+D_;* z+=#HLv@1K}^H1hZTtebc3Fwvl7)kpob5;{=rz!OIevG7RwRskAC5oM)&_D5Gx=+V7 zxZ7M<1k2VR#{FQp~J`W9KVBR zpM%pBtA@%bKdJ?YyyRVo*=$1>+sT{PE1Z~(IIdavkP|-AEqY?B+NGpAUzQWj+ z`){)WPNoFi&q0&#VTUcugmYgrXSOws)g2M^Dx_O>P*p!aF+cuP*UyfB3?l@a%I~S@ z#TlyZeQLJD>(f$?<%M3{kJ)+z9y~L@*{!dOy3iXiqk6`pc_!CCW-Sa~N^$QBsh3wC zj;^8mrMVVoROIoHrg&w!iM%#{`$#+a1EdWsOQDeFmopQ4D&QM4c!>s&06J%b`9_0D zTX_>)N#-cr6f@u;881C{q;0{`8)@V2f=TZ9Z4bV<4LzI9NIO1FpD~bAI4D@%^~*r6 z#fa3S;?6A2xb#DwfD3VKUa6Y#{lR#M>Nq%&-fg}y?BazQ91qvHyu;dAlI z&kC0WBYia9ICf`pY|5$%UNvtRQ8GIY;@aXct-WDBM`z5P#nBekH7f(XVMNL57|}>6 z)4XA3mw|8D9L-VRaG0guFrs94bj_%I+vyFHGAn$`;n>(gS-a>BBT7!kNK6iAYyWt| zEXap=A{=eD;f$iRgug~g?VLB#*F>+#oy##4<%Z=lesXi%rQEq4MR3z&yK#Q^@{?cs>vIa0dc)Iw?t zIZ_lbr2`m~#6+;SrJsM&y`2M} zw1-#5HR!JE*gn`a7678(5oWI^oDnLY7A=>62A)ikH%mL;V)S|t?z)E6sSm0{E21Fo zd)7~AqC2cdOL=Df=!uvWZ#Yw=!IVg|EWJZ-HFI0c*N>Eop9WkFLx^hpkCO%*uY-T8 za}f!o0YCo=tOoy+oCX}rLNv&!k~ zpr6{LID^-tIG+-oDPSs8{p7v#BYf5{jTt))qxF+HbbLz{g2}I{Xp`=p=yaHpE}>@T5dMO<0Eb=oNtEU04wLQz)$Lv6^{lBB+~i*tVpfNyNb*OEY8hU2XiS_@#O z4f$9aP0izxkv*T(26Yz1HJef=GD7mGcQDG~KI9y|h3+(U78pwH^Ae{?)XY%wdemTc zMk9SEd63GG>(~gpVnj&p^&8(?|0g&B630j=6FsVqLktWU>_HYnUST6D z4$0SnshVmlyC5I%AV!3!gNk|7t5EKHR2_#PgD2zci5r;YZluDdO1+9ha(u`&pg{I)h5E!2o_6uV_%23;|gA za6lBQGk(!3s2V@3wEERRHE4A2*VhOtAKV~qcc&VRoUF%T3#Midg33O?%$Wf# zOyff*8AGrI@jt=Curm}KvpU5L@`27B6zu6d-O|X zLG{Z6uonJ_SS=HyYq%|p#^oIp!_FJ2=Iw`}hCSji7YbZQHufnyQGFW%q#AJ>YNIbp zVL5gvpW3RlY~08JBUMv$UV|E6JY^bRL;lG|_yShzdSt~hBZALzP~6wx*goyS!DBWo z8LN<{r*k4EMs7oXW+Rfb3TYPi7>kiH65=8w12*NeWUWG)hhe}>kYbQ4*vMprQg2oT zwTNqg(zF?+xH06me#m}yx8=k>_#6uoLIWX>_8{tAF?snasMW0bkY_>q)*}bAQ6pk2 z+KNGKYP~R3BpV@b^&m!s6wCPhA((N_E}VjL-m7M4i+pdld#zTVLV4v?o2P)AC*u47FpnE{L-(j>dVy={I#-qq7jy zDKIxa=frOHgxt@A7!fU5?c5!MFQR@1Wx7|TKj2oEwJEe)OQ5Xts4@y|M6AS^Oi;I> zUugpeA)mGp>G><9`*(0t;&=f0m5p$Uw3QxfJxFSdMP$XM3W1EHDJwmlU9^?bkgM7V zKVHyQK1}UFnnO;o5q{rXBfTFk)+rhWd7O>#q6Hf1)5C+zhrGl_WI1@{OTVKYcYlL? z&_=k@(N_9@cU!yrH{=I4!d0L~2CVfUff(6KjZGz*htxGPkiU&5S@!|t(l){i3TR|d zK~JJ%AUC%Wep_B6gUfr6-jIjc2){+Iks-f(BAN+#zK!rh2aODk^0@mm`7{!yJsQ)Z6nhDRarOu52r3KZy*QaHlY$N9WRB9==PaTbau!e*oZv*Q^-dfF>WvU zQVnv9jmX%(LPkE>qme|&y=_E>6%{gSl&A2Ihdk3ps%^DXG-kM`Ff4=ovyJ@H#YR4k z#~L`|%VEf8Z6uWMYI)=$nGl*@C;FZ(?`PR?PC{#lg1+YDE2riaZ;oLft`D;&BO^by zpzrWsu$WWG{5iPs3sMzww2g>KRT+JA5e*nY5+HZ=Ab3faE2D1@p?NOqXegh0RjG^? zTtHJ>)Ni0H_Nr2!ES&7|Zwr(iURCOoMHc!Y680RF%eIXYy8p;asDGmoO`5;P|Q zkprQ8_ji7Bz+pH8iWcU&r;8C#TwPUsG@xX^*QUV&l?PrETM+-J9$`gnMGq;U)a%u% z4^3?#CoobHh!G(MDpVbh=d5gC7?g3g0d>s@QgN#%j`@(6*ht}Re98r>Jlcc&2Kk_k zRQDoPu6vNbAwRGYRb7dds!u&gARJ1KO(murTgh|i3R+N+M=`C2tx{f=B_U{OrGUA3 zr-ehI{4<~o6QQ*Z<3QZx0yx?ye}6Ub7Z-@}(a?Smi>hJoxV?R$ZVbmmE3SRxrsFYD z=%!7mR@O*0<1F!J%ZN z#pWBBi*v}}*Qh$!T`B~*1S1l&yigu8EEN*+Q5KBYabD3>7?|ZTqLvB?8M$Ge4!#1)T3a1Ud=f)O=bmp{{}HD#WXy}V z`as0368Qh)&-Q5R_Yn52C%kub$%x1^8*YxPhPJwRkuD_}d9Zo&Lg!{qJ{9AiPtuK{ zN?>B%$Nl3#yc5qJ)m$Q&0q^6)zsWbVX>Kx@h5zQ%XWf;PQ=NNs;x+^P<3C~Xbo$eN zIz=}CzWGmB+@0AwyN1(-VcrHdzvL@7#u8r~Az!reoWilh*Ko+}$-n4SL}aLq)PMCF zQ;4P5B*4^%Nz54$Jqy9coHjFb$r=ZFx*yV{3arj+xn5gY0(qSu@+rzy$TtBI8aW90 zbW&t2@wFSW(3M@kyEK-#P6=65Je#MCw5tnm7mq{_O1w>#3Ijmcyoom=oTx!Ue)t*} ziy);SSMfvsWUEV3U)ENdLGIv(gx>cI)yO=^Kl&kYL*eeK zhQT_`+aVwDL(cvLch^+G#3yn0D&+fq$lz#1w61JBjkwWjN`=ig(R=V(LCA)h1$9IP zAeZt(T7C#$HZ{ZPmWb*>Zsv!SLSH!Km*l9U1?dHOs2_4R1CTAdPwCv90ePMul6Dv( z+TLf1j%YpP?S4r5%CPc#y&xUY8OT@tkn1CmqMfJE2^C*nLw2W0n&|Bq!VTHI4^0$7 zvOzB3hfL*4XJ2)@@gDUKl;<8*S7`jT=8#kKOKAh4Xw;^~ zCgs405cN!mM=b=UtVi|Kh>Kw0+-(#m$*}s6TlyjV&6SV~f1&RyNMFb!{E$w#wT4{U zzDeiCEXd#bA%kB5xtukV&QorF@9;x1J_d5N74CQv(K*Q1{g5pf2Mf8GbFg9XJ(Au* z4!{qcUQusN9;DSQQ1W?HmEMm@nA^qh_+2big&u7)7xByZn0RDAvD*U3A#^ zDCNYi5Vj!xPoH!_Dz49uYnhQ6*wwd@QTV0CM51bJnPwWFG13{kzDW^}=kdg(Sz8JdsMMmEU5lv_ygbo}$dqeKkKeqc7}XVk5f z5#^;E&%}_Czq&ONG2~z!&4paG&R|d01+=k@864y!C$0ZwZS#_$5HZ+}E)kE1>v zF)6~T1S^5oH%}3r6^7efur+oKKHh50Ma`Go%8#c|DXcSm&aLt@&|tNy#F|D*YsPk* zB&!?hrBv3BvrHqk@hLs8rU%mMrgr|wzASg3sbCfF%f3{{z=UZ{{GELnhrQEkjCwP` zs)XY%>luQE!bF`u9uq~Jg;8}{3o+-yu!?+%4x9A~51vhH_+qT@WKH@C1EE$;F_FEM z2@~7lm)n|N!$fMTe#EIcUYt`?$i=Cti3eNBt&j06BZZY8M?$QWm@^-0eU7xIw9=!( z3bUT#f(eHclUsVSw6XIPJ25R9XULj@Jz1`joTr1kaXNlRTi0p*+>O(*s5U#1t1&yV zVIybh7EB}$vMQ%T)7YwsJ8&`!3o*ip(m2s6th;}*69+Nw8EQ3(!04+ra|D{{)~_`& z)8E?B8(kLb2Ut#HO_*#NX)XRjWLj%oWe4U!@Iq-B;Ar-;$OInps5{r02M=qlEO-`c zSl=L@$hvW!9i85Zv;7`^JFHG;xd=SWi=Ljf1kDe76@~5$dma?oDJDr z)uU+9kE14ytHEA@c5JUiM_2+|_oXN5RZf0_Z*5!4XF0MYM_04}N7p-+qf0xJOWcUv z99_eYkvj-H7K3ui@9oYN9C)K-aI)j@8*+t6j~^$U7g_!cBcX=%J*phCTFv7a8e{LU zDj{(r5nxsxPk{IUo;hKqM0ySDqY@lo8U}JrV>}(n?SUQ#SW73uB9E%`h-KKm;-(Q@ z`~!pxSb+vpN@sz?nQ>_~T(8}9MkTVl^&ZGt8x0`#`60PFk6_D>=D(%uc_-tAb9If`eDT)*sKpV&O;cfH#bA@ zj_(Si=?bw2gub@efWLC+?2#oqJ~IYKzJ}nla5YC4%z=!8{2^awug(z;V-qtBdqE?P zU#oETGsa?u4wTR`9L9O+0Iu=qx6QL)MZ77Le+&s~!7>oU+QGT0V7qiR+*>ZG>UO@j?%rmsgr@!@h3 z@9c;}q5QLH(GEDH7&2OfBPIBVK~?z}`qA?-|B?^W3^u^OloK2$m&C3(Qnd1O(+H0) zOlOg9)P`k|dcMA+f2Q!PD1o(R1GR!PU{K4-<>Koxpdw!g-^Flkm>=amz{-ofbXmRT zq7+&aUvc>iK?;JbRm+g+)}0Pq5e>nFt>nf;3Xk4L!(ljT*>U)|U!palX75DK9iYEC z@1rDl4icY;z+z8J0Xsym@K4k^zGx0p6oMy@D$SYw2UX9D+BE8?)1ZzJCoGM@3+zQ7 z75DL3L0q=Z=o54)8w}Jyoe+IeFeB3O7gBkZcGpD)4Ph+$6m@w<#t|IYgD8$+3*vv& z0{v-{IUPpypY$`D{#>$eLw?A}DIi98VJxZ^eV!)d*N-HE5noztVnIEU2$x7M(B!Eq z5-JS6q=zw-e33F&aEK374^lIa9DH7);igdZCEAPH>k1A~Z|KAPnCiG`M*mG;96|pR z4$|k)zh*{xDqh^Ak3KL}G;1MkwN2dQXsSvyx9HJKQ$=$;scxjX8;|@dMulsV6ww#Z z-!j9c$Vl^n)NZu4K88T1N&OAaxuUDk z<3ChmJsXtVUiCG4u+dfN*ew;dB9v-g^=Tfcku+zp3fmG&JFofzGkv0~QEi+dPU2uF zA9>YG7%YgcPCueK%IX(T=6coC3*c2v`uw_5*Fo9lQKg13(sVcjq!z8m`DFvAAz$%B zDqld#YtwV|jv09c*@cILl5%ZjE$*VxQPkt4Lb5{6?}wbiZ7aGCUBz|7R;ogd_Csb5 zgfDd|H|jP<5+Hx*hl~sZ5>2~iD=Xt5PxnIxt%l_oibI~aKml3;d7X{0T_erU1K@5f zl|mzqk%N%=ai>a=LQ3`qQlFZnL7TiFhJhi!@0NktGr9@oc%X)uMnF+jJC}Ja z$I+h`RaG^YWp@d^Gt##}4IbT0zR%6G;ePgnHqtl2Q;_K9 zNsR2oQu=ayId`XoqRP=?xQ&YsD(|^n8O-<8V7?9ik9LMKJ%qBfRHnxzHU0l&bs}v+ z6PoW?=aX6$hyS;}&Y>1J)QK(3S;?nDWyAm6V4C81vKPIKy5SDXc51@l2yE(-`Cr(R zhQe;@_JOM4xUs&}w)ZoiA)k|ag>P1Ss62`aA3Y9GrN$2o<#LZ!(aqklF(K1Lw0^<;+;95S1OIB2)A8A7R<$fS9dl_wYOuWz1|k$e@qyv z13i=rYP_=v|Kxzq%Q?}&iYdyq&m?M#UWYW-Vk*-_s8%J^m4+2`p1UD+P>xMN&$=QQ zx9MW4(t3uj!-Qe2s){JB&8VVHD%vfAC@CW^}|#) zRvSZU;Z-MGgj)U39G$K{PzHI`XE%_f8Z~?A9GePdmRDVjhE7b)!nn6fey)JB)~j|! z3n!*_)4QfL+UNk3qh575Is!3uCSKL!{I{SK!_z29uex6TU+TXIG2gW8ZvD_B3Z^F} zHUGb?1C`}Yb1_mY52F^s>fcE%|1ax7WqII?iESO*w zvndjr!6dZWb6E& z5g}E}k@e_EN;i2plrgOSE$Ym*2zzwP9-Z8;p?vFA_hTp_=J-a8y~w4o5z1CuE!nN( zU?b+l4V(nAdYZdo8lcn~Av z=y(`7I}jDN7$^^=u18gOQl8jvM6AV-YRsQq8)#oTfZ@k|z7Y-F3{&R@RMuDhCy-~^ zh;)OLsX~?D(D}!uF)@(q;uT;v+8ldfL`WrYamZWMbE6}WPk9g{kDTqlE;iHG(rsHY zoV75qC{4^GZqG)^eI$qO+sln4C&>vNNnNmDcua(Rk0UUu|0pCa7xBF;c?27XdHO5H z6&~=pu8UEg2H1l5KYgyBZ$isY&PW$1AF}#PRJo13n1?Z2QO7}<TWvN$v`y83~@}1`i;O|iOdQ}s5*qB#o!t_(4zo1IKk$Sojs^vKfQHo|8$ z0Yh|fpJqltAMeLxK#dw>(w7*15jzW@FZW}L9|q%~MxmP71^tL0bL$VJ#Yr`<>ZIO+ z{?w28usQ4m(AJFFPDoKQ(qL03DLmg3ls*?#YOLi#kV<&vti_QZfwcW6otkJ!4ZX6H z6B0y^H)#jDLF(<5xnqWDV@)x=l8X~ffHc)B|8NPRlT*QW+W3!U%MdyRHLs;Q zhqMRMA+J298WJBu(Ygmp*CE~Y%5qyxNqz3>OW9Qn)<*L#FeX27=T_A^#e8d>;;PmOXDp^5-P?jjBK&+W zB)cFTVA(CQ)bxd^-zr@L{|)K3Emsxyi%>u_?Y;qDR7gA_Oo4ww`PS!Lum%IBuKC=w zoJ3`u`dNnS2Z{n>CF7W^gUjKZ^;m{nucSi5+?Yx?P!+otx9Wg`^WfdP%3=H^5!ZsL z?eH7|Fz%{|u$BPK6O9QO`oT8S%9;cW90+HY#LxjYv7)+JYR<24 zYb&6f3s(S)m6Ve=P*uF^B0H1f8iHwUb84>Vt@KFidR`2G%PIATJko>sd@01WVe=!j z>N#z*AuseGYPlwvZ{^xJBh*yLX2`p2gl{7{4>tce$o+9 zDO~#4RPqIpndq)Sw&w#jozZ$74k7|&k82Lj~{*;Gn$AVye^|gc2 z$yVi498?r)^N!0AO)1xJ{S>)P=sBF?xCw9cjYWlB3M-^ zOR)$A`*6P+raVQW@=&UJRelKIIx>Ga8B&a!Lutz@r_P8F_2_Bb*TwQcD8s#B`BNRP zV@I3nct3~owXMphI$XzT2TsRI99_qXvdW+8aGjWtLRV7@`7_Rg^ng6bMyhY)5-V2Dt&Kyr!8A>U{52y!g+h??dpyV*$XjegS>a`}T^CEE zCn8PLlaQ}5BJTQ>8{sak!wd)E-hv6i10==qnbBzz?yqg9be}a3n9?@K*RlA4=5QEKEy9L945NnQ?*KC!9XP&F5?*6q4k-!o)U1hQo#Dk4E{ z&3&bPZV0)xji`tOxji|B&Zhp5N7{&rh?mKB-7QsLxAbR2UT7n#;^tMdUH8WJ(a2`V zyOJU$d68__{VRp^*v$pV_mUv`yz#oxu7_jm>Py3A@!W=_DHr6?*ws37@BCmq%7>7L*oaEGAkPk=ttn?=I^?-Fq9PLH`L^{MSqFKW zjYvfDaU<71Rux>y$01#0*?SGi$BkSsQ&+?#_88LJq_V94>~hkH18NwZ(wE01NNiFR z)bh|S7d^p9j`YJyL#n{CR70}3${SkbRJ0XcQVIP4(lc*p zUUJ)&mByk0BXTINs9f08CBVf_t#`#|MlHGR%0@-kYPurGhW|n0^x$;mG%!3j;xu6%Z8Re8Pc_}L{X<=$ZZiCSx*$!+sC`UZ2~Rz-c`qP!yOb4dU4e2s7{#n_H&Rc|AW>p^E$b%qV!8a9l;*p=id`VWw6l2h}=4X z&p^5`_~Je5zMd4P!G-mi$OfoLQqad@3A%MqgZSd2(aZ+RE9Ts!d$kP8F(D*Y0* zPqNBV&Iz9M11e&Je9fx2g~EA(E>}64T2x!C4X9BP&`^v;D+}se?+$&S%_z^rPI;;{ zNvCxx^sjA3ImL_jx+>C0v{hwXe=YQ_%-F3PwaPBeXg54hmWu2&^eZ-_@>MRyNXnl> z`|}#Q8_!f!E||&DPL;LiUDe3x@h3ZUey!N&Qc$2|X?6M%{Wr<`C_v3^kQv_sfE5BT zcT2!NfJWP(WT}tEn)E@q&eE>|Eww?hsPaSdtTvs(TzRp$1JL0lAeJWN24NJPLsid- zryI~;Fe7;;##E+Ai>nT`fhJ&BBpErd{R`wJ$6WR3Lp1Z{K5YT2kpwitdC4(X47J*+ z2SwUI@8ZYsl4Gt|I*lhPVrMk;Nq!73Ip)Gc`zM-N41JX!!%L328c@ljn%M{agdfv% zJD7&_$?v-1a1Z)Fehe>V>S{tiuS2UEcR5N`jf|YwR0epLY6<71OkHvGO=gE$%CtP7 zy6*#dDN|Qdiuzo)2onJHdmqS4nYx-$@?&IhGoB^^n)^PGmojxVr;$A{qXdJlv>wo| z_kp~WsjCG=mcu)GZ1EzX`|ksJDN|QVDm_iDWJ7_~F|QTdzf+B+OkJ(0#2=az#38zI6iD%#-t7D9FPpnyiYGK>S+&8GQOt7fFCa(Gc`S5NAHMAKtI z&a`Q{8%eKLtu^ZEMceb}6S)qQBw3|f1HGv^CL>8Hl*zQuDC0iHA9%@7Ur zrBBgu5For30B=TUpdT)K-RP~vfM1eE5wGX%>QAFaXfth@lB7tQM^OwOOSlHm&7RuK zNCu>=Ns-pTKpMMHm&!RF0Lw8)oH)6`M|;--h6mH4**e@AkEY8nubJrj zjC$2Ejp4X>=n?c6*rfa#;UZ6>o_VkW6U$+>(Fw*T7lT?-(KVT7;_fAKQAnk|GB2s< znnIh>X*m{B6I+%w6J1m32pT^UcTY(DSeAa1lBZG1N)Baw5~LY+XjxLxHJv_hO-fz{ zX|-48B^6yW=p-67;@W;lM{HS^Omxkq>mQ*w8+BpvN2j zhIHF2^QVY0jQx36eam;&fnjVqG_Pyu`jN(+(KpQqNcp|83=1!%ILxx(+@wfI^;nj? z?cELzq}hjwWUf_IFVbO*N6G03xtnc4mLqhnp-#9jeT1V^?7(v2%A9Xmj?lH1mY||q z2z`ak$mNvguQrHa9W{Ha3jHp~2N;p`%i?{mpQ$dM=JMro4T@?pD`f)>NTw76WBb8e z5vpbVTpQ{0tSYxNvLYu!7W{Kcp*O5W-9ctvKHeFBg!w7XMwWT*&Buz z;&c5<{XSCGMtj4EvW2?MRMzI$VPwTO*G@Y55=-R|Lzb_Dv>BVaj6$;_jhJ!7IWvuT z&Jz!^$2<8~ypv}~CF(sN=`6+s0t-De~lux=oHi^9Hc6QT1<4p&IshsImZ^8hKCD$!)sv+@Z>%`j(7IJp-}$m zob14Cr`WRmVdqIS@tL0T6l>8vAQn&0GORN2ILK=B2$5SyM)Hd}>rp>uw|+j1b+W7t zT})$n`B-@J=3V(H{CWMZ{MWdi-n}hfA5Ffu@5)Ex>dv3Nd~&QanlF2W*?6Ay?p;a) z@wLFZN;1VNwiT_bhxk_EDW+j{LnD{0`_-_DmUV0ZzeMyH?JcLZ5W|20)-uHHvQnUN z<+e_A!(<5S?pl6-XCXobTivhnOGIV5@=HWBIDu5@)Ru?pp(^}i!Vg|W&zOVzyxZWP^O6%HOPR88~gk;S4 z6YJSpXU1c>0&64&tg~1fQR{Yg2Tt$&38s<5+MLH>M=Y(O`wo;=DQO_!lVfYx!dVrO1t%CUMOnvL~3|M8s8nYI|Z&qPUfNf+oS#BDQtxqtM zxry~Xs--yVU95@G*l6(0tY6UhXl_-?j)&#ejlTFeofY^E8Lh0rXdAS)f^V5d8!J0T zm)lyO?8ilFg+0VK6RgvlFp1ylJrbWYvikjrnS9ppMyAox+I=4{R9dUo{_|r?nl8fDf%JC~v*2B|~sOv`S#e zyN~s7mTC00j+Ma5z}67h>2Gy_&jYO1#W7l7eQ^ShOsw^VFk#**i!wIE`m`$Ey0p$! zHH=}_H#6}V$=Zc@M;IgKpvF*_bOxff4RA3GD#F+Fm)Milb_HJy9kF*J2XC3;p?d!geT~?3Cf{(32)?Vt);;-)Y4DAOF2Rv&*n;>!tw!(h zsBc+mq}5;_1ND~X)dq4vE@mU8(3%P6oi-J-$zv)COk6q`KGL z`gw0*odb4v3goYBMA|wkMGca#(a37ZzuJg=a!(-*x1cT&D<>ddvJt-78o9-nCbc}i zynyUz>`A%Y`xVl(i3iC9IggDAB@XC$%A@s)-J{Zg5 z@j%UHNZY;geU!i0anvE43|{$+&O*B6mDg23=uhbs-fWd&r+*;5^UAYui;bN?86K;b zlPJ6i?n&5m!ls;t@rjhJ6Y5CzybPp@UKvX~8nKh8!1ubr9S5nESLUya#!jX#m$YmB zAr1A){Cp^O3MD(I<(ZJa^2+5hz_qD#atA)4!3kRfX`@&EE;~X`qi?h6&_^Mi_R8yj z#Pu+Pe#cuo+|Hqgke>Uqj(n@+d1^}eDLNHdoaDgvpLSC-b^ z*Yrax+#XS!DF#wwKY0#i{n#)zap~>>sV~cNF^-b2f5k4K56YSfctsukMu=yZ9EsG0$%y-6Ua*_)TKjLgB0bJ3mrg?E~UL_8i?`skUD$i z>QV4~8NJM^C1~7B=r@oY&FplaeGcQRC=G_2M9vH;r&s>^bI5C``5GN}c}P{g za*ok3zLqK#(z(_GQoL6_5Q1!3N0orJ%b=>tGx6&i zv72c*+Ike$9IrlN^U+6h)fmQkmzEC3m1!q|+Ydpj-08js?6V;@Zty_2fF)mhfd zN0SuqrBC1L4EfAQ+x8L;9i)NNb+{jVwB;^TCP(PrNd5h*y{z%or|w^)NPrWRs;one zD&Jy&YYz1((ou9JH8S%IU08#cx%sNafU%t#S5;U)PZKYw4jkq5(WLUfOs(qS%c5Kn zRr1lK=D$MQc3?^x*ZeJfG^zHl(){|Ss`dx?Xj122qdCt|?Qs1w-A9uO{|4j#uuvO5f$Haee-RKADbdlk@Ykt<9ilzC*sG!)Wn}Hj1Pg zeNEer>vEQ|l{Yt}4t+zBZmkvc(WC->OZ_)!t+tOQwdXq`jJrwhC-`VmbsFX$p89E| zk0$jdnG0^~Yiy2>CY7dXp1>HE*xcZwNsZ|+m-o~09rw|sx^$XF^6797d^D*m1I*Al zI$UzD4>+%JO-n`TGArYjA@Sw&(WI7in{lhOR^8UpAD@Q|4mO)jR#F?UvJ73#*kopv zVk)vhUS)3?D9OziGgM)nZYxEs6i`x_Gtl>BCzNj(LE%d|-nkB7DE~}!@sMfL| zgZp`qOOS8dh@4(!Wk{;acw>*PINGAmgv~cayx3B}(4O~nM0p?=vyp3@PZ5F)n|nti zQIH$kh{_jUk11ey8w`XBWeY?lZ~j;BgnWu9^@m)6Kq7C9zi~J zXVVcafV|vBR78oK=5PyZ^&1m-1MrvRCvIou)6x@K*+`9 z*i=%*e1mgqflOWY7oJigHwr)vK8f-tJ6>=~sCXw|R`E{0(BhqYGxMHHX}oj7I39=% zLaF04$2-}_MA^qXyTe#09|-7*0d%Kp*aRHt-U~}3xJK|#=K1~9fP)t>(B>Rcw*!V8 zIU*x$LV5)FohR3Z@f30A4t|cH)_vKX0fPpt9EOP#*n&8m7Wcebucpc0f$)gM1|ss4 zALqV37zSLx2Qg5W2AhNo<|D@E#Gk}+?th8#LOxIsa+#z^YB6%)E)ujHL=4pCOmGar ze8gkqU<(XB@qyluhb2W)^HU_}p?!ghm;rU3AHmOhoQKVuDw=grwM8y5q!Sd<03yE_0Upgi~wFJop87Z${$QWkHB% zi!ZAXaRt!Nb-oUO!YT@e^rPdQJl8+o*%Ze@`DZAv@*MAM!Kr+Lo<1sIepd4D3b-#q zB&mQ`4znxZU&|WCM*K^w0sV?Ci2n};u#^N?@Yh;Id4+=Cb> zh{>=?VpJ0&LRG-kF={RmML;fWBPt?Q0SBSsAxKTg(H_K80eA59)%ndDJbdDazh7d$@U9A64Gct6UY?D#qpC*qy_a4*rh6>_Nh$@|W7I9?7n{R$6$ z0$om%=Z%e|c7`j!{DaRLUTZX5E|aswnT8>k+pM_VFit>BjW$vQwjlmTo(}3+7O_8J ztTLI|8MT27hExC)$>5)CQob4IN@4zd8+Rofpq7vlZ97smC?=&DIao6vL7!kVcf^iN zv`TIE#nT4KpoP#^FvHR4;Srf=mDb$)N;A8mAN6Bo5>Mr^)u$%L&;X6qZ;P6_Chk}_3gGFBF|oadA`N~#-9=MT7J)$h%ZFOxg#fBGr( zS=7s@|7o>v_*Vjcm0XBiEYX1Xl(HKDBVcn@4mDy2{^>rzs6T=qY#LusKcoKWPtcs< zC%3vLPat7E^;nNMLcq_7*tFsT`aCm)P~;3W+J_IQq#$^hO*Ng`aqlcntcvW zTONL;r8k#RFC#TH75Xe@YKw_!-(yL&bX0gNmO5s6C8Tv;ncob-!jlo`!${~ukj{AI z;ESAx@+sc>;nW2uK#J2N=x=OBdCJA9eg-O#Ni*rt%FBUGya-kd7lZm4X`1I0ThMFx zF^;DvsNVPQIkUSiSxS&l z0!R%_X(C8jKAE;6nsO7<|Q&pOip#J8MaPRA|3%hK^mQijB}|;z?6N| zJ)plVEH5-2?;4X^-TgvLq(!!gz$GRa=TUQk*+dbbG8PsSv=%cauX;LJOvHdUu{Amc z==@illGl5kXnKMV4AJDGSjndJe{&0oS zFGJJIbw4*Xtp?J-qWb;Nk}J(h8(Pv1xVtUktRKZ$|LQ1o33(~nXyAz?`H9`&oPRAB zrfYeX$#Rgj0m>Qw`nxEQ`Pl;?CoSqR@s|-r#c0fp?3E=e-owqmY>D;(XZxG)BGdAl zk)|^y-f^)HJX*rJ{#NgGVx>5+H$=jj{`T3^VkHi^S%`%5{GFjV8j2n21x#x>Q#!<1 z{_Zj4BbLkrUKAqX5Zxb${y0l^03Wa={E|j-h#oG(&>u@K1K$ggaEN~I+(Sa7x}ZeH zrTwCp{htn{qJXfngzO|@+{rG_9m={x`#K3XjGnPaj-yHMuLlhKj;33E}i;4k$ zfB!ji0&Pd~K{#HDY`EA5l9BlJ{kIVc5|(@bTrot#Z||#CM@{XJA2^XDl$FH_znHHZ zJrK!fz(a#21z7Umv{Ulx&ag509yxkcZM>9Ya%1wME=nD>1N?i^&@UsBsoT*V6UU4% z0Nt{%Cyq5E$wF2~@+NdJQI)FK#Jh8c+DbBTk6=l@5sC24)LW|&?<0UF+nC&y;7*^kTpU>m{EaPH zKMFCT>$cpEg8#}ZaUA?SY1+er_?2IY*@rM;#5wg(;D19TbP{XK-1!+~_AcY6$OO39 ziox4YW9IdZKztR$-BLt2%Jbz%b2DZ^AuQxj(YRaRCQ-C8HD>wv;ga{0Kspg6e;N6z zKf-e>$E8B-4#M3r)^qaFDB8Cgvw0>us_f%Mz-z6CB~Y}N1M}SSXIj_6R&U}$$F4~=H z8Q4afb7sy?`^#c#n3pl>st$skvblbqb~VK$n`5yIL)`&;W^-!x>&1Q9X&Xn(Xw$VC zj-=^{HIch1up~tjJOS;CAYsLBVAwvh#a6*&M$JagrN?_unAm4JI)w z93zl{=qXhTqQ)fTSC7Ih*@-ro#B6oYR6Gm2Lp0<~LfWt!bHwr8T#2FC5G@T7>XofA zHyqPS$*Z~>{78s~hNNN&tEe zReGy5vhn~G3}70niYcbHb&)nEM<`vB`#nsNvQfIXQYD-wZeKejH^S)|`2{>-$ z4FDQuKg|oC@gbYt6~t?EfffZY4T8mdpps&&_8-vR0OtIDSv9#W;r1%!sy^mO#YAUW5ag}}=OX*^sjMbg&h7_W-{N@}fGh!RN1 zMO`GVHI6B-nj%Yc>URU`9l+`CqNJ*z{=iunT#iftnnqZs72}G^cM?NV)csitv^ns! z8i%JpQZtH4Gw?^C(}AZMf2?*dk>1fmpvU&p*{9S;G*nVK_Q9~b56(ZqrQOZm<{$XF zvdW9GC6yPq3)v`=_B_W_QLDlvmsSRaQ*Hw)(NsNCCUft3d8rM@xOo{R4 zKy3)?%y5rfudn88K?bJe><=_F@HFEFs=|J$c;)~tw4cu29JO6cjQS%V{JsUZciB&7 zAAs?Tm{|4xLZDN){fmtv7iYjzacU$ct#$nm^o+3f61V@xI;y=dt)29rWBd=7eiwAB ziCcHgRfTktRHeW_CJiUK*07yK^)0d@x0)J(x3=x*Du6yj7t>1p&;T6-RFkS7_=q=Y z+NcMyqL~lA%GPMN?qSG2rk$E`+c3J4ogcuDkVXfo2|^c>tj-~pdlJ3@bkD|v)x?Y7 z9n`8un59bwcYT49;d3Z4@p1h|M7dxJWc5t@aOzylBQx(ajNX7R z3ep%FD@PmPEkL_0Y-E~p3qh*n7@rC!WaI8di+FfUDN{Wpe#~UGXP03-0y6qqZj*2H zn~~|A!|>xmRqi>KV}s`k(ioZY)`kl!)HN@LsDPq_F!ycl5#`IT>bL%o>7&H?|$N7o-o#9ltW~@k+`FoDy1$EwC4b4tlM|r{1U_OGQb!8lV zduZJmXl@4UTCi>dDwdcNjs?gJ^e+4hO&ScyX?MBG*7jKUtE2oaZ7&}*rGj{BY%g{En+PTOPM-;R&4V1aZ!p&1seV|(FLCt`G$ia8_6IRpPoa?;F7qLX$z zBsyshBGEZ;Bu%f4#(grD=%f+oB>p$ic@$>D=|(seFo{k&Qzg-PjqcK)Nqi%TZ#es5 z3_O)PE_M*so?gW4s=F82Gu$PyB-Y)VW`dmgN#pj{MmLURs#t#v{o@LwUwVJ9mc%z) zh6yE-!~(YrlIU_=>k=NNcWB+`&>kH=_e+mh?uI2zQBuN4c8+`1L`;$d@ zm&l)LJII~@r2}@{O?F^Pi=X`kR*J5XP_2Xw}7R}U0KnA|QjBxG{?*Ll$C$?e5R zLYdrt`L1CQS&c_Gk~7!v!eq~bSTNHOm2T)Tz=}w?FMW0PZZ1i4QE$2ti*J>k5)#~@v;T?kMt*%!>!=? zL}&V+P;ROUJj+er82{f{?#84~xy)!gT$g1=lS-p$h@WaEM2m2R(J#;E$LW3Ml}O#v z-xSFX-~+a#7yhzlxw}q6|B9?!#?5=SB;_pk#`i>`hN2S0r5zfEy2X%XMwK$7Sw&Xz z0T;I=TuErj=gF3&CUBfBNjb|s^N^{nbO7#UOLU0zEO*|ghL(&2rkQB%mwFr`z0Bx3 zCIi_o>w$OJ5^Y7#a+kr9EtZ@HzHCdh6+O$HDuYO#0^?hxL9zSwOPb{l|IIWgfmBxD zTqHSxD6nR^OGjX@C($w>RV?b!Zs=L=vS@F!&vIXnz^*2;(jR!FEzwr= zEcZ5y4Y6cC@G4uPt>{_q=jgt%WFPQxTcVSPB_r~nrOlGtz<=5jojiJ$`{Q>VS`vo5 znh_U=S2CQQ<(`3UTx_KX@CTN}n&lqglESz)NKAn0S?-O)rFcvR>0wcAUS_#x`A}vc zHYS03_8|Z9KhzH5&|=3VGJg{Po6P?v@`sueX6(UsOZP4ZeUp2T>S4IQb3CS`qN#27 zZU@DKGb4%IdmPVd8OAff-{Hn<@&*0y%p(^$z9NS^P_Z0x%uA9z23fwu`B%8YUXe+j zwss$J%r6Qj=Of`t163x>c4!r%XihkcF{1edysfPXOnx|r52)@SFq{A(7>#QToSaItB_(@ws>mfyR&heI|xexxgt>FziI$Xav>RbLv zHv;uPE*&n;Ct7pfQPI+T0AA77=;))}3hs-J9*3n$jR$W^8XbMK%+`I$G5V@xhF(B@ z1K70~k$>4y2tMUj$W)+N0Za>V-B%nX%S*Fs6VSE*rnR{4tBz4MB_Eyw`XzvAS*`n; z<5Csz+Mhtr0+?3Ty01IlSt)L(ABmMvxWwnQxYm8c5rbJ1_F8eE4+&Gk8Jh*neh+-xQEHsvu|Sgpm=@Z)?>Oe5Fz2UN0c{9i zT9NI(=a{=t2A+-pod{rBlAh6ffbIk^ zt$%kbXYW_C&&e2#CKxUWH!Xp8o6Z&aFw{X_%LSA_fN4d(+u>YPLiSmF1XL}6X<@qC z<=kQ#dSQAqpw=lc)~37NPPI(druPFH62P>_!yV>~#=HY>;+PGzz{b4C!|icC!%|ts z+ky7jnD=*4~t7I#F;@sCuI^o+ZTYteYLzNsi&1FM_JGW{|% zuIf7A7JLlonuR@NoJ)5p;@Ma=mlM-%Z0seJF8G6uv05zFbhRifnw;S8+8U~9jL7^L z>v7k0l_-Q&$rMpl!0TBWnL{jo97$QvH4SZR@`g$R??jq1?D3%#;`*-hJ>}IM4m2i! zX*$l`!1dz1;Ke{I1DHmf-7zkAJHh*a4hJxeIJ;wABl1c=`8v?u0OsnYq3b$IkBSth zY8=u9myQMTYJHxH;LsZKartl*R+qp_PMc4|W?zS+6A6b~}YUY-- z9Rty9TbROWI{(hy!L`eSRs*VCwHczrwve4(i8i7nE2}%XGQ1G=bts?NYIZ+`nvR`y zcXg$|gB~1mlS)4kjzVBV56m7L5$&& zaPN2ruiIqTtR`q9(CZcj^sbG0afN%T>$CSU*Ypu?S0kh=<>V?t$^IT)(E3w{SbqehYhOsKubw z9q!q#Zu_t?kkb1S@LgM?UuGUwkfN-a1U@H3!$XZrT)yg}`38JX zh~_LcOP0I7{ZvZR^WgVvO^SDxg)3bC?ovLR(~ya9=?F;ihOuy^D+b$ExehA~QF&V! zc)15FR<3eI>=BbKq4Kb$fV-kv2OW=cGr#XBv{`=bn;C?I$YDe!!-dNp=x+_)P0CvzDY=jYr1#3y8eSRZ?-`gffjlc zE*+UE{78pux_7ybzQ%eevRDD4x^EKF;hOI6Tr<$ArlST`TZnqSNf?d8HQl>i6OLe) z841Tj^!1yBbhxH_kLwA>FZgiHEfDPu5*n5ND+kT@t~+C}Q4m{A)VW}8gj2CH?_k&FA*p)RjKk>%n6XG{Scn8#dlfKc_Un_+yT`O z_fqZxKd~e!J~WHoT_FQQ` zd<(qOk{D6+xt`d1xf_ZbXFx6l=&3<4Uw=5dWW3}3G01b9=Ie)kQf!02uo_CGnT7Sw zxO4cD%HAWHzT%XLGVd zrb#zZLbFeYgN(5Z7_*f7Ia05EVLOEp7YNgI0kAn{z`QIK);K< zM2Ylx5&ns5Mm?q6am|LJ7{LEl<9{VLqOpnQ90}rDUT9<(3vff3bFuypR~Y>=@-uBU z3kxKf<_0NjQOP+hX?+4sbe2>Fu5U~3Z>RjilD6JYM3MyjsV(^@AW6P3SR|u>r`nQl zP{!&t)NvhO^e~LsW5t&h)k6Yn*6q|+ztvBtze4lT{{sSRq{|p;AoOiJV@lQA; z8(5ME+|ib#u=2%#n-Z*{z~gO+4i=5T#0`inDw%L8@V6vkKU2}H^K%r9GsF$dlpyV( zHBCp5+0q+@$uw*5i;R|A@OTesG> zSAhLD;-}-H>+lARk@LH(*!}PP5-hwN+7&r>WASd1Gc_hs6P+}CmguAgOp>z!-#LtK zS)!9BDifVOkxeG4ZkRnH?i6kG;@o2B-8_m&fn-Z{TWWvKZ(u_ z{I6p^ZqT1ed?U$8Hxiv6e@*V@CK$PyY!uu;H|TbvlbREWJh+*}f4iES4(!&em2VMR zGsUPS6;t=U_-d$FV(Pg{@bCKFVd|{}{DW$lzKfPICT<6Qb?V+W$%tu4M_3r{BWQ8N z_$WY5H+3@g->EwB;#t0*#y#aX-1n19>5YQT)?+@o`2q4J+3$pfl`VMTS46cnSU}ad z$|lpG-wy$w;lhEPR)R-lo(9DytA57{C)`Z80Hp{nt)MTz>3or)QggW1#6U$|0=R-L zAzvC9?v#NCn&zB@^EyEM7Bz}6Xx8f;EP}yJy&5fom)|BXDvUEdvnyjTz*y@E58W{$ zc;$P`8>rmq_ae}>wt`*MidF^3X~llfqn1J*Z~bE>bO`bIb%5V2=&6KI8WFs7zRfut z-$DxKLii0AhuVnXb;NCdZ>?b-fFc%@*ob|G*hq@XgDsaJwckYBoxq#f45V`q6$88s zJ-H)V4}*XwzCjYfdotQL&abofGDy~ttPcC1w?B0F7PSji_dfs}vEejDdmK6r{8b14 z8o)yfYUg=fM@*+V7zUu=J76-5F19^`4?T$K{Nk#nIc#Dyqn0FP6FygkUIEH(iO#C{ zH_2H8Ae{b8|u5H%O=( zrV--?LGp2$TY7wA5$Fn1d^a-RHPXj*F~Cd+CNjlw_g5@q+po52>sNc(gXo#k;qT>nY; z6P+YXbW%u@oQ(+TKk46OzMaUob6zTF8aZ=hqk?WA$-3g7B$nCP6w zhG=nQ%;TP9c>!P|w*iv*-$d@uxJqIRw~8w_8ubuIaNI|#n?&$+JnJ7_lMN805wt`0b@PeW@6<6~V4uztcb|~l+TM-yBh?v+BwQY0*Q`eI#A=ynb3Wu(@ zQ)t;_omU;P5DF&GLU+wJ$z2(3t?pwi@1ctMIcO@15VpoODmVDG-(pW<9WWWn1<89P zu4RJ1tYxKt<-M(?Oho-BgGYU`+jB7lUx<-GNv&iPfU25o|Ok zJM_!mQl5S~I!%Q801dIQhYea=%KPOM6SKjW+M4$Qb|O?~Lo~a=kJy@$FvZXxi6#8MEwv2%to6S2sGNlVuH64IeE#=DEZCU}irY+Gv;B0^M=I4^jS^#$lk#MfRRjZ|B)*-;-LL{8&Z$HQK z8P2OqfY*meIM3fXvsbJf0zMrg;Vgf*>^-sa0QhN$BykVkiu(ooi6q@>tbfAA5vE@X z*;4)s+VSj{62KKgBpjmOKeA5z^8vRAk#L9}r9x%KR{8)B36XG!9*1R>5X}N!5+dOc z{dK>VNOl1q3X$+j`fMEhvX3&-Rp8qs(boxIw6wbz!O6xdP_NlfgM^7yon@~ zl_fjsE#-?xisUHp*n-K6=dob~)u>9h7KXEXg{BtxIc%U^Fys4#;kVJ1OKVL=$CfWgawj_pZDc{i> z-W-g(BZzR6%a-z@$d_t1?k=#2Y$^W_XMC~0wt?&>O8&C8l-Em(=T779W$U@1E#=SA z=j4Z<0;~1GKGs{xOCFS>AS-Y#OJZ*+Kk^9gR4Lr{5@IjQmhw6Ga29+Tn2iHzW<4lX znrtbrjUipu^adaNCXLH1dPO(F)GY8Nq#;+d9cxQ@x!h>&ZwK2S!evYO$n2EZ$}?X^D6@g(x4C|vyT-}paW|g#g4MP;)r@)s%-T}E z9X%Y?0)nn@63LeG{FDWTK`J6%p=- z=;t>HY3LJM$|t`sZ|d(5y$BN8TgqQ2OYwF5Bnw;0?+=!uwlsJJ(&%!M zN2!XaG^H_rLJdPdP!r39{)QH|lt=z5xF^sT0W4d}m;Wqy3eZa zFK!nD`iL;UljI$p=dCT}yP8S_B|y|FNN8^8itrTo9qKR9Kf=reDon{1YQTaOIW9sY$?x+H3^iXl==p0e zTAt1gRDiI4TDFvLz~~J>{V`B=`)O-SdE{Lf{sgxZ?I*1*<>4cMdf|3o8(CY*|EwXo zbSlt1!d&I(cio!@Ik~E;jmNnJ-wM7jSYvG|Uvrz^5b@48(CY*qkpjKf1uigwU@a4H`XyPld0P& zt%15&PfM#wwv@MQiXCl~R3pGATP8%qb`sSttSjaA&MNS4Z96(!&}<8~l~lz}bfg|NbqgW8kWJDSOs@_4+6%q9{mNX*(&J|e$ioWxL|S^=~Um-dmh zr938w!=S$AL6CDqIpYPgy0xV|4?5Eiz@G+b>@DRhfj!%h{-GemtmhxVsl<_6d>>$j2UfuDvwv<1bgcyKm z_x}p*E#;Tm=;qrwXs(lvixBRbhEw5cZ7F{b>vE_Z`45_Kw6C;|@F;U;8Rkdoo_HY7Ro z(w~&`v4I?!G0}OK4N(jyIcY>P(Mi3BMCX#x^lvPb9g^^mhyUqBe^uShKDd00CeV&J z=#kGzHk2U!gBukXY6<BabvQ}_`Uf{|upNTfe86^Y z0I;2ZNyh)M9qO`?!-$?l=X!pC{!Ze*6R5BEe)Jf%{~-41sYe$vVn&~kiXN*z+lekf zd?mQ%JqzC{Z;qby1*|+`OD#8tIb-Gf+QJi`2Ofm5Rx3t%w8o_7On_g9&mLJu@YAL6;HvV;al@}9< z-ZD89tk-#A79uKokYQw*;@r4_RHe^9x)P$FVGqI+MN%_iDmQBvZn0bJ1E6+cyFJ@ zeeb@k2EI?15jA*0 z?~iEfrt;o$<5l&ZfKT4>PDN^!@YZ=oG27aOEj8Zh*rQ&>n+dDVs(L%0#

      K(zF$ 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

      ewgn$7fg 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�AZLM`1#%Y1Ss-VDoCR_g$XOs~ft&?$7RXs3XMvmrzAP5#dw-Pa8cL_E z{D~*y!sAdpIaO$N<#D^L3PCL|S6M4fjHU4_d{qM7 z^TV(3RS9&bORf@z5e6go$&(G`ds{2$8|M709>W*;SM8cyyK)xDSs-VDoCR_g$XOs~ zft&?$7RXs3XMvmrau�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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && __has_include() +# define COMPILER_ID "ROCMClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# elif defined(__clang__) +# define SIMULATE_ID "Clang" +# elif defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif +# if defined(__clang__) && __has_include() +# include +# define COMPILER_VERSION_MAJOR DEC(HIP_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(HIP_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(HIP_VERSION_PATCH) +# endif + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_DIALECT "90" +# else +# define C_DIALECT +# endif +#elif __STDC_VERSION__ > 201710L +# define C_DIALECT "23" +#elif __STDC_VERSION__ >= 201710L +# define C_DIALECT "17" +#elif __STDC_VERSION__ >= 201000L +# define C_DIALECT "11" +#elif __STDC_VERSION__ >= 199901L +# define C_DIALECT "99" +#else +# define C_DIALECT "90" +#endif +const char* info_language_dialect_default = + "INFO" ":" "dialect_default[" C_DIALECT "]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.exe b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.exe new file mode 100644 index 0000000000000000000000000000000000000000..30e6462cf6ae18f09b990ee627d03980c1f2f891 GIT binary patch literal 96256 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && __has_include() +# define COMPILER_ID "ROCMClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# elif defined(__clang__) +# define SIMULATE_ID "Clang" +# elif defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif +# if defined(__clang__) && __has_include() +# include +# define COMPILER_VERSION_MAJOR DEC(HIP_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(HIP_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(HIP_VERSION_PATCH) +# endif + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L +# if defined(__INTEL_CXX11_MODE__) +# if defined(__cpp_aggregate_nsdmi) +# define CXX_STD 201402L +# else +# define CXX_STD 201103L +# endif +# else +# define CXX_STD 199711L +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# define CXX_STD _MSVC_LANG +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if CXX_STD > 202002L + "23" +#elif CXX_STD > 201703L + "20" +#elif CXX_STD >= 201703L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe new file mode 100644 index 0000000000000000000000000000000000000000..87327d1cd84134d8911ab0d111e4fcb8f1f10719 GIT binary patch literal 96256 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 literal 0 HcmV?d00001 diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.obj b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.obj new file mode 100644 index 0000000000000000000000000000000000000000..e4bddfb0e7a5e0fad7d27ccb4520a510ab8a69c1 GIT binary patch literal 1840 zcmb7FU1%It6h1e*Y15LJG)0U-WrzbRrIXnovuzNZ?oZ6ZZZ>AOZD3c{*`3+VG`lVk5(?K>_7kspA)Zg#0IthIC}8QzT2@w8Uo1W&pMkL<0a{Vk4t? z0xZ8SZTjPlApeJ>Asv|lvLdzpx>4l+MBRNyOC8r$*VempQCh}LK|e{GdF>?bEeNy8 z)WU^}nL;KVpPxaO$QEY&WG<6jx{yufX9S9{kL?z=9bl&@T57&@+3c+6+iF!W)eWnZ zUP-#V96FoLUrLn2 zrG(jR<7_9bC018$HG)G{GAmbL9$q@dDgb+M8lHjuJ{B+!H}p=|Fk3~L zTj;!GgNRHZBFE$x9Y&Vz<@Wk^L$zvVr&+vgv^2Bd#W@~V?Nrx_c$w~4Gt>qqLs`>n zYOi4xLpZazTM#F9GvdhN)?ZV%gCZSjv6>Wx#laZi@vnnyFe(Oq9DKJM6dyJ7&i`67 zz<^t~rha$|_c?(r2y^Hk<7gQ@1q;Fz^phO1F$QBZ2+_9fj{7Ij2Y9B~h@N7abI%^H zJ^tMEH`8}+&fdLyEjLqD-e$Zthe}9*QPuIA zx8Bgo0HccIH*c+>ybUk`J*Al6T!u75;H^9~6JS(($UfeC_ct4f`B%cRSd0(2h9i0h z`eY9ox(K>WJ2GE&PKH&VCXFNd=v3uWvTmzD)g7Q0J%AwRjpJM;A(W;qcH}@4KvYd)1Q*noPQXc77<4Kov6Z)u_ h68b3DP+Rq$TGz`*vindc_F8=`3?jckk^er}_&;^sO5Fee literal 0 HcmV?d00001 diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeOutput.log b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..bff6d49 --- /dev/null +++ b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeOutput.log @@ -0,0 +1,65 @@ +The system is: Windows - 10.0.19044 - AMD64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.30.30705/bin/Hostx64/x64/cl.exe +Build flags: +Id flags: + +The output was: +0 +用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.30.30705 版 +版权所有(C) Microsoft Corporation。保留所有权利。 + +CMakeCCompilerId.c +Microsoft (R) Incremental Linker Version 14.30.30705.0 +Copyright (C) Microsoft Corporation. All rights reserved. + +/out:CMakeCCompilerId.exe +CMakeCCompilerId.obj + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.exe" + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.obj" + +The C compiler identification is MSVC, found in "E:/WorkSpace/git/IRIS_FODIS/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdC/CMakeCCompilerId.exe" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.30.30705/bin/Hostx64/x64/cl.exe +Build flags: +Id flags: + +The output was: +0 +用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.30.30705 版 +版权所有(C) Microsoft Corporation。保留所有权利。 + +CMakeCXXCompilerId.cpp +Microsoft (R) Incremental Linker Version 14.30.30705.0 +Copyright (C) Microsoft Corporation. All rights reserved. + +/out:CMakeCXXCompilerId.exe +CMakeCXXCompilerId.obj + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.exe" + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.obj" + +The CXX compiler identification is MSVC, found in "E:/WorkSpace/git/IRIS_FODIS/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/3.21.21080301-MSVC_2/CompilerIdCXX/CMakeCXXCompilerId.exe" + +Detecting C compiler ABI info compiled with the following output: +Change Dir: E:/WorkSpace/git/IRIS_FODIS/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeTmp + +Run Build Command(s):C:/Program Files/Microsoft Visual Studio/2022/Professional/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe cmTC_2b601 && [1/2] Building C object CMakeFiles\cmTC_2b601.dir\CMakeCCompilerABI.c.obj +[2/2] Linking C executable cmTC_2b601.exe + + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: E:/WorkSpace/git/IRIS_FODIS/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/CMakeTmp + +Run Build Command(s):C:/Program Files/Microsoft Visual Studio/2022/Professional/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe cmTC_5699f && [1/2] Building CXX object CMakeFiles\cmTC_5699f.dir\CMakeCXXCompilerABI.cpp.obj +[2/2] Linking CXX executable cmTC_5699f.exe + + + diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/foo.h b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/foo.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/foo.h @@ -0,0 +1 @@ + diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.c b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.c new file mode 100644 index 0000000..cd3cbc1 --- /dev/null +++ b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.c @@ -0,0 +1,2 @@ +#include "foo.h" +int main(){} diff --git a/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.obj b/IRIS_FODIS/out/build/x64-Debug/CMakeFiles/ShowIncludes/main.obj new file mode 100644 index 0000000000000000000000000000000000000000..e12f67ca1baacede31718fb2de0a505e8a845700 GIT binary patch literal 654 zcmYdkV_``8Zl1J>k%57S0Rr?=ic*tH%2J_R27Mr73ycG!xda&WQc{yj(^Z0DLTiAG z$1o0*c3=>2(kn@=C{fAHgGn(18T~-}kbwe2K!RR!Ms~5830znK$eM(vj)9ATK|w)5 z-^JC

      pid=6O~~fLF}}@f~4Q0i50y>pHfhkVwpj5 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 z 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"{cl!mk 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�bI(IV9~S{7-#%Y1*wY- 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∈nxxztCx+2w!mP-DCy^!>Xrvgvw^r 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