From f0ecbb871066df76cc5fe7be00d6917c07755d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BB=BB=E7=AB=8B=E6=96=B0?= Date: Wed, 12 Jan 2022 14:30:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E5=AE=9A=E6=A0=87=E7=A8=8B=E5=BA=8F=20=E5=8F=8A=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E7=A7=BB=E5=8A=A8=E7=9B=B8=E5=85=B3=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/config/calibrate.php | 45 + html/config/location.php | 48 + html/config/position.html | 15 + othersoft/install.sh | 15 + othersoft/movingliner/CMakeLists.txt | 32 + othersoft/movingliner/DeviceSettings.ini | 27 + othersoft/movingliner/main.cpp | 52 + .../source/LinearShutter/AbstractPort.h | 16 + .../source/LinearShutter/VSMD12XControl.cpp | 1416 ++++++++++ .../source/LinearShutter/VSMD12XControl.h | 146 + .../source/LinearShutter/VSMD12XMiscDefines.h | 108 + .../source/LinearShutter/ZZ_SeiralPort.cpp | 147 + .../source/LinearShutter/ZZ_SeiralPort.h | 26 + .../source/LinearShutter/ZZ_Types.h | 297 ++ .../movingliner/source/LinearShutter/pch.h | 28 + .../source/Settings/SystemConfigger.cpp | 191 ++ .../source/Settings/SystemConfigger.h | 57 + .../project/LocationCali/CMakeLists.txt | 46 + .../project/LocationCali/SeaBreeze.dll | Bin 0 -> 2670080 bytes .../project/LocationCali/SeaBreeze.lib | Bin 0 -> 129806 bytes .../shuttercali/project/LocationCali/main.cpp | 202 ++ .../source/FS/ATPControl_Serial_QT.cpp | 591 ++++ .../source/FS/ATPControl_Serial_QT.h | 84 + .../source/FS/ATPDataFileProcessor.cpp | 0 .../source/FS/ATPDataFileProcessor.h | 1 + .../source/FS/IrisFiberSpectrometerBase.h | 42 + othersoft/shuttercali/source/FS/ZZ_Types.h | 297 ++ .../source/LinearShutter/AbstractPort.h | 16 + .../source/LinearShutter/VSMD12XControl.cpp | 1415 ++++++++++ .../source/LinearShutter/VSMD12XControl.h | 146 + .../source/LinearShutter/VSMD12XMiscDefines.h | 108 + .../source/LinearShutter/ZZ_SeiralPort.cpp | 147 + .../source/LinearShutter/ZZ_SeiralPort.h | 26 + .../shuttercali/source/LinearShutter/pch.h | 28 + othersoft/shuttercali/source/Logger/Logger.h | 90 + .../source/OSIF/DLib/SeaBreeze.dll | Bin 0 -> 2670080 bytes .../source/OSIF/DLib/SeaBreeze.lib | Bin 0 -> 129806 bytes .../source/OSIF/include/api/DeviceFactory.h | 63 + .../source/OSIF/include/api/DllDecl.h | 56 + .../OSIF/include/api/SeaBreezeWrapper.h | 864 ++++++ .../AcquisitionDelayFeatureAdapter.h | 63 + .../ContinuousStrobeFeatureAdapter.h | 56 + .../seabreezeapi/DataBufferFeatureAdapter.h | 63 + .../include/api/seabreezeapi/DeviceAdapter.h | 308 ++ .../api/seabreezeapi/EEPROMFeatureAdapter.h | 57 + .../seabreezeapi/FeatureAdapterInterface.h | 57 + .../api/seabreezeapi/FeatureAdapterTemplate.h | 87 + .../api/seabreezeapi/FeatureFamilies.h | 200 ++ .../api/seabreezeapi/IrradCalFeatureAdapter.h | 62 + .../seabreezeapi/LightSourceFeatureAdapter.h | 69 + .../NonlinearityCoeffsFeatureAdapter.h | 57 + .../seabreezeapi/OpticalBenchFeatureAdapter.h | 62 + .../seabreezeapi/PixelBinningFeatureAdapter.h | 68 + .../api/seabreezeapi/ProtocolFamilies.h | 87 + .../RawUSBBusAccessFeatureAdapter.h | 57 + .../api/seabreezeapi/RevisionFeatureAdapter.h | 58 + .../include/api/seabreezeapi/SeaBreezeAPI.h | 2481 +++++++++++++++++ .../api/seabreezeapi/SeaBreezeAPIConstants.h | 55 + .../seabreezeapi/SerialNumberFeatureAdapter.h | 58 + .../api/seabreezeapi/ShutterFeatureAdapter.h | 56 + .../seabreezeapi/SpectrometerFeatureAdapter.h | 74 + .../SpectrumProcessingFeatureAdapter.h | 60 + .../StrayLightCoeffsFeatureAdapter.h | 57 + .../seabreezeapi/StrobeLampFeatureAdapter.h | 56 + .../seabreezeapi/TemperatureFeatureAdapter.h | 58 + .../ThermoElectricCoolerFeatureAdapter.h | 61 + .../source/OSIF/include/common/ByteVector.h | 63 + .../source/OSIF/include/common/Data.h | 62 + .../source/OSIF/include/common/DoubleVector.h | 62 + .../source/OSIF/include/common/FloatVector.h | 62 + .../source/OSIF/include/common/Log.h | 132 + .../source/OSIF/include/common/SeaBreeze.h | 45 + .../source/OSIF/include/common/U32Vector.h | 77 + .../source/OSIF/include/common/UShortVector.h | 64 + .../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 + .../source/Settings/SystemConfigger.cpp | 191 ++ .../source/Settings/SystemConfigger.h | 57 + .../source/Thread/AbstractFSController.cpp | 74 + .../source/Thread/AbstractFSController.h | 38 + .../source/Thread/MainDataGrabber.cpp | 140 + .../source/Thread/MainDataGrabber.h | 48 + .../source/ZZ_SDK/ZZ_Math_HDRONLY.h | 84 + othersoft/shuttercali/source/pch.h | 28 + .../source_rlx/sensor/OptoSkyManager.cpp | 82 + .../source_rlx/sensor/OptoSkyManager.h | 50 + .../source_rlx/sensor/OptoSkyType.cpp | 204 ++ .../source_rlx/sensor/OptoSkyType.h | 77 + .../source_rlx/sensor/OptoskyCommunicater.cpp | 0 .../source_rlx/sensor/SeaBreeze.dll | Bin 0 -> 2671104 bytes .../source_rlx/sensor/SensorBase.cpp | 14 + .../source_rlx/sensor/SensorBase.h | 132 + .../source_rlx/sensor/SensorMannager.cpp | 238 ++ .../source_rlx/sensor/SensorMannager.h | 78 + .../source_rlx/sensor/SensorOptoSky.cpp | 306 ++ .../source_rlx/sensor/SensorOptoSky.h | 81 + .../source_rlx/sensor/SensorQExPRO.cpp | 327 +++ .../source_rlx/sensor/SensorQExPRO.h | 63 + .../shuttercali/source_rlx/sensor/TCPServer.h | 301 ++ .../shuttercali/source_rlx/sensor/logout.cpp | 63 + .../shuttercali/source_rlx/sensor/logout.h | 16 + 446 files changed, 34544 insertions(+) create mode 100644 html/config/calibrate.php create mode 100644 html/config/location.php create mode 100644 html/config/position.html create mode 100644 othersoft/install.sh create mode 100644 othersoft/movingliner/CMakeLists.txt create mode 100644 othersoft/movingliner/DeviceSettings.ini create mode 100644 othersoft/movingliner/main.cpp create mode 100644 othersoft/movingliner/source/LinearShutter/AbstractPort.h create mode 100644 othersoft/movingliner/source/LinearShutter/VSMD12XControl.cpp create mode 100644 othersoft/movingliner/source/LinearShutter/VSMD12XControl.h create mode 100644 othersoft/movingliner/source/LinearShutter/VSMD12XMiscDefines.h create mode 100644 othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.cpp create mode 100644 othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.h create mode 100644 othersoft/movingliner/source/LinearShutter/ZZ_Types.h create mode 100644 othersoft/movingliner/source/LinearShutter/pch.h create mode 100644 othersoft/movingliner/source/Settings/SystemConfigger.cpp create mode 100644 othersoft/movingliner/source/Settings/SystemConfigger.h create mode 100644 othersoft/shuttercali/project/LocationCali/CMakeLists.txt create mode 100644 othersoft/shuttercali/project/LocationCali/SeaBreeze.dll create mode 100644 othersoft/shuttercali/project/LocationCali/SeaBreeze.lib create mode 100644 othersoft/shuttercali/project/LocationCali/main.cpp create mode 100644 othersoft/shuttercali/source/FS/ATPControl_Serial_QT.cpp create mode 100644 othersoft/shuttercali/source/FS/ATPControl_Serial_QT.h create mode 100644 othersoft/shuttercali/source/FS/ATPDataFileProcessor.cpp create mode 100644 othersoft/shuttercali/source/FS/ATPDataFileProcessor.h create mode 100644 othersoft/shuttercali/source/FS/IrisFiberSpectrometerBase.h create mode 100644 othersoft/shuttercali/source/FS/ZZ_Types.h create mode 100644 othersoft/shuttercali/source/LinearShutter/AbstractPort.h create mode 100644 othersoft/shuttercali/source/LinearShutter/VSMD12XControl.cpp create mode 100644 othersoft/shuttercali/source/LinearShutter/VSMD12XControl.h create mode 100644 othersoft/shuttercali/source/LinearShutter/VSMD12XMiscDefines.h create mode 100644 othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.cpp create mode 100644 othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.h create mode 100644 othersoft/shuttercali/source/LinearShutter/pch.h create mode 100644 othersoft/shuttercali/source/Logger/Logger.h create mode 100644 othersoft/shuttercali/source/OSIF/DLib/SeaBreeze.dll create mode 100644 othersoft/shuttercali/source/OSIF/DLib/SeaBreeze.lib create mode 100644 othersoft/shuttercali/source/OSIF/include/api/DeviceFactory.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/DllDecl.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/SeaBreezeWrapper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/ByteVector.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/Data.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/DoubleVector.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/FloatVector.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/Log.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/SeaBreeze.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/U32Vector.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/UShortVector.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/UnitDescriptor.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/Bus.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/BusFamilies.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/BusFamily.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocationProberInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocatorInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/TransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232Interface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBDeviceLocator.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/devices/Device.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/BusConnectException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/BusException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/BusTransferException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureControlException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/IllegalArgumentException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/NumberFormatException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolFormatException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolTransactionException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/features/Feature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/features/FeatureFamily.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/features/FeatureImpl.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/globals.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/Exchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/Protocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolFamily.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHint.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/Transaction.h create mode 100644 othersoft/shuttercali/source/OSIF/include/common/protocols/Transfer.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/Inet4Address.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/Socket.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/SocketException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/SocketTimeoutException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/UnknownHostException.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/network/windows/NativeSocketWindows.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/rs232/NativeRS232.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/rs232/RS232.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/system/NativeSystem.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/system/System.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/usb/NativeUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/usb/USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/usb/USBDiscovery.h create mode 100644 othersoft/shuttercali/source/OSIF/include/native/usb/winusb/WindowsGUID.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Apex.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/STS.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Spark.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Torus.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h create mode 100644 othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h create mode 100644 othersoft/shuttercali/source/Settings/SystemConfigger.cpp create mode 100644 othersoft/shuttercali/source/Settings/SystemConfigger.h create mode 100644 othersoft/shuttercali/source/Thread/AbstractFSController.cpp create mode 100644 othersoft/shuttercali/source/Thread/AbstractFSController.h create mode 100644 othersoft/shuttercali/source/Thread/MainDataGrabber.cpp create mode 100644 othersoft/shuttercali/source/Thread/MainDataGrabber.h create mode 100644 othersoft/shuttercali/source/ZZ_SDK/ZZ_Math_HDRONLY.h create mode 100644 othersoft/shuttercali/source/pch.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/OptoSkyType.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/OptoSkyType.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/OptoskyCommunicater.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/SeaBreeze.dll create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorBase.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorBase.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorMannager.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorMannager.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/TCPServer.h create mode 100644 othersoft/shuttercali/source_rlx/sensor/logout.cpp create mode 100644 othersoft/shuttercali/source_rlx/sensor/logout.h diff --git a/html/config/calibrate.php b/html/config/calibrate.php new file mode 100644 index 0000000..d9edfc3 --- /dev/null +++ b/html/config/calibrate.php @@ -0,0 +1,45 @@ +"; +//$cmd = 'ping 127.0.0.1'; + +system("sudo pkill ocean_optics_calibration_console"); +system("sudo gpio write 1 1"); +$cmd=""; + + + + +if ($a==1) +{ + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console -t 30 -slfs ocean_optics.lmp --cfon FSNsdfsd'.$a.'.data -p '.$a; +} +else +{ + $cmd = 'sudo /home/pi/bin/ocean_optics_calibration_console -t 30 -slfs 4000nit.dat --cfon FSNsdfsd'.$a.'.data -p '.$a; +} + + + + +while(@ ob_end_flush()); + +$proc = popen($cmd, 'r'); + + +while(!feof($proc)){ + echo fread($proc, 4096); + @ flush(); +} +echo 'FINISH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'; +echo '鍥炲埌棣栭〉'; \ No newline at end of file diff --git a/html/config/location.php b/html/config/location.php new file mode 100644 index 0000000..4dd8476 --- /dev/null +++ b/html/config/location.php @@ -0,0 +1,48 @@ +瀹氭爣

'; +echo '鍥炲埌棣栭〉'; + +/* +$i = 100; +while ($i<1000) { + ++$i; + //閮ㄥ垎娴忚鍣ㄩ渶瑕佸唴瀹硅揪鍒颁竴瀹氶暱搴︿簡鎵嶈緭鍑 + if ($i === 103) { + echo"

hello word".$i."

";; + } else { + echo"

hello word".$i."

";; + } + sleep(1); + +} +*/ diff --git a/html/config/position.html b/html/config/position.html new file mode 100644 index 0000000..c13621f --- /dev/null +++ b/html/config/position.html @@ -0,0 +1,15 @@ + + + + + Title + + +浣嶇疆1 +浣嶇疆2 +浣嶇疆3 +浣嶇疆4 +浣嶇疆5 +浣嶇疆try + + \ No newline at end of file diff --git a/othersoft/install.sh b/othersoft/install.sh new file mode 100644 index 0000000..d205631 --- /dev/null +++ b/othersoft/install.sh @@ -0,0 +1,15 @@ +mkdir build +cd build +mkdir movingliner +cd movingliner +cmake ../../movingliner +make -j4 +mkdir /home/pi/bin +cp ./movingliner /home/pi/bin +echo beging build shuttercali +cd ../ +mkdir shuttercali +cd shuttercali +cmake ../../shuttercali +make -j4 +cp ./shuttercali /home/pi/bin diff --git a/othersoft/movingliner/CMakeLists.txt b/othersoft/movingliner/CMakeLists.txt new file mode 100644 index 0000000..afdac17 --- /dev/null +++ b/othersoft/movingliner/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.0) +project(movingliner) +IF (WIN32) + + #MESSAGE(STATUS "Now is windows") + +ENDIF () +set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} C:/Qt/Qt5.12.7/5.12.7/mingw73_64) +#set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} C:/Qt/Qt5.9.0/5.9/msvc2017_64/ ) +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(QT Core Gui Network WebSockets SerialPort Widgets) + +find_package(Qt5 REQUIRED ${QT}) +include_directories("source/LinearShutter") +add_executable(movingliner + main.cpp + source/LinearShutter/VSMD12XControl.cpp + source/LinearShutter/VSMD12XControl.h + source/LinearShutter/ZZ_SeiralPort.cpp + source/LinearShutter/ZZ_SeiralPort.h + + ) +qt5_use_modules(movingliner ${QT}) + + + + + diff --git a/othersoft/movingliner/DeviceSettings.ini b/othersoft/movingliner/DeviceSettings.ini new file mode 100644 index 0000000..2f87a5b --- /dev/null +++ b/othersoft/movingliner/DeviceSettings.ini @@ -0,0 +1,27 @@ +[DEVICE INFO] +TotalSpectrometer=1 +[FS2] +Model=ISIF +Port=/dev/ttyS1 +UID=QEP02975 +[FS1] +Model=OSIFAlpha +Port=-1 +UID=QEP02975 +AEMax=0.85 +AEMin=0.80 +Depth=200000 +[FS3] +Model=Null +[LINEAR SHUTTER] +Port=COM12 +Type=1 +DCID=1 +TotalPosition=5 +Position0=10000 +Position1=91947 +Position2=219299 +Position3=347535 +Position4=474904 +[HUMITURE] +Port=/dev/ttyUSB3 \ No newline at end of file diff --git a/othersoft/movingliner/main.cpp b/othersoft/movingliner/main.cpp new file mode 100644 index 0000000..279f59b --- /dev/null +++ b/othersoft/movingliner/main.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include "qtextstream.h" +QTextStream cout1(stdout, QIODevice::WriteOnly); +void logout(QString str){ + std::cout<"; + std::fflush(stdout); +} +int main(int argc, char *argv[]) { + int aaa=1000; + QString str(argv[1]); + QCoreApplication a(argc, argv); + CVSMD12XControl Motercontrol; + QString m_qstrDeviceConfigFilePath; + // cout1<<"adfasdfsadfsd"<"<value("LINEAR SHUTTER/Position"+str).toLongLong(); + if (positon==0) + { + logout("Can not Find the position<\/b>"); + return 0; + } + cout1<<"Find Configfile in "< The Port of Motor is "<value("LINEAR SHUTTER/Port").toString()<<"
"<value("LINEAR SHUTTER/Position"+str).toLongLong()<<"
"<"<value("LINEAR SHUTTER/Port").toString() + Motercontrol.ILMES_InitializeComm(m_qsDeviceConfig->value("LINEAR SHUTTER/Port").toString()); + ControllerParams cpTest; + Motercontrol.ILMES_InitializeParams(cpTest); + + + + + logout("Moving to Zero"); + Motercontrol.StartBackZero(); + //std::cout<<"beging to move position"; + logout("Moving to The Position"); + Motercontrol.MoveTo(positon); + + logout("Finish the Task!!!<\/b>
Thanks For Using<\/b>"); + return 0; + // return QCoreApplication::exec(); +} diff --git a/othersoft/movingliner/source/LinearShutter/AbstractPort.h b/othersoft/movingliner/source/LinearShutter/AbstractPort.h new file mode 100644 index 0000000..0c0118b --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/AbstractPort.h @@ -0,0 +1,16 @@ +#pragma once +#include "VSMD12XMiscDefines.h" +#include +class CAbstractPort +{ +public: + virtual void InitPort(PortInfo portinfo) = 0; + virtual bool SetPort() = 0; + virtual bool Open() = 0; + virtual void Close() = 0; + + virtual std::string ReadAll(int waite=5000) = 0; + virtual int Write(const std::string strSend) = 0; + +}; + diff --git a/othersoft/movingliner/source/LinearShutter/VSMD12XControl.cpp b/othersoft/movingliner/source/LinearShutter/VSMD12XControl.cpp new file mode 100644 index 0000000..520e487 --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/VSMD12XControl.cpp @@ -0,0 +1,1416 @@ +#include "pch.h" +#include "VSMD12XControl.h" +#include "ZZ_SeiralPort.h" +#include +#define sprintf_s snprintf +CVSMD12XControl::CVSMD12XControl() +{ + m_iProtocolType = 0; + m_iCID = 1; + m_bIsSyncMove = 0; + m_piPositionInPulses = NULL; + waitetime = 200; + waitetime = 200; +} + +CVSMD12XControl::~CVSMD12XControl() +{ + if (m_piPositionInPulses!=NULL) + { + delete[] m_piPositionInPulses; + } +} + +bool CVSMD12XControl::ILMES_InitializeComm(PortInfo portinfo, int iPortType /*= 1*/, int iCID /*= 1*/, bool bSyncMove /*= true*/) +{ + SetProtocolType(iPortType); + SetCID(iCID); + SetSyncMode(bSyncMove); + + return InitAndOpenPort(portinfo); +} +bool CVSMD12XControl::ILMES_InitializeComm(QString portName, int bandrate, int iPortType , int iCID , bool bSyncMove ) +{ + PortInfo pi; + pi.FullPortName = portName; + + pi.iBaudRate = bandrate; + return ILMES_InitializeComm(pi, iPortType, iCID, bSyncMove); + + +} + +bool CVSMD12XControl::ILMES_InitializeParams(ControllerParams cpParams) +{ + bool bRes = false; + + bRes = CVSMD12XControl::SetBaudRate(cpParams.bdr); + if (!bRes) + { + qDebug() << "SetBaudRate Err"; + //return false; + } + + bRes = CVSMD12XControl::SetSpeed(cpParams.spd,cpParams.acc,cpParams.dec); + if (!bRes) + { + qDebug() << "SetSpeed Err"; + //return false; + } + + bRes = CVSMD12XControl::SetMicroSteps(cpParams.mcs); + if (!bRes) + { + qDebug() << "SetMicroSteps Err"; + //return false; + } + + bRes = CVSMD12XControl::SetCurrent(cpParams.cra,cpParams.crn,cpParams.crh); + if (!bRes) + { + qDebug() << "SetCurrent Err"; + //return false; + } + + bRes = CVSMD12XControl::SetZeroParams(cpParams.zmd,cpParams.osv, cpParams.snr,cpParams.zsd,cpParams.zsp); + if (!bRes) + { + qDebug() << "SetZeroParams Err"; + //return false; + } + return bRes; +} + +void CVSMD12XControl::ILMES_SetPosition(int *piPositionInPulse, size_t szSize) +{ + m_piPositionInPulses = new int[szSize]; + for (size_t i=0;i< szSize;i++) + { + m_piPositionInPulses[i] = piPositionInPulse[i]; + } +} + +bool CVSMD12XControl::ILMES_MoveToPos(int iPositionIndex) +{ + bool bRes = false; + bRes = CVSMD12XControl::StartBackZero(); + if (!bRes) + { + qDebug() << "StartBackZero Err"; + return false; + } + + bRes = CVSMD12XControl::MoveTo(m_piPositionInPulses[iPositionIndex]); + if (!bRes) + { + qDebug() << "MoveTo Err"; + return false; + } + + return bRes; +} + +void CVSMD12XControl::SetProtocolType(int iProtocolType /*= 0*/) +{ + m_iProtocolType = iProtocolType; +} + +void CVSMD12XControl::SetCID(int iID) +{ + m_iCID = iID; + + char cmd[64]; + sprintf_s(cmd, 64, "%d ", iID); + std::string strCID(cmd); + m_strCID = strCID; + return; +} + +void CVSMD12XControl::SetSyncMode(bool bSyncMove /*= false*/) +{ + m_bIsSyncMove = bSyncMove; +} + +bool CVSMD12XControl::InitAndOpenPort(PortInfo portinfo) +{ + bool bRes = false; + if (portinfo.iPortType==0) + { + m_pAbsPort = new CZZ_SeiralPort_QT; + } + + m_pAbsPort->InitPort(portinfo); + + bRes = m_pAbsPort->SetPort(); + if (!bRes) + { + return bRes; + } + bRes = m_pAbsPort->Open(); + return bRes; +} + +std::string CVSMD12XControl::ReadReceive() +{ + return m_pAbsPort->ReadAll(); +} + +int CVSMD12XControl::SendCommand(const std::string strSend) +{ + return m_pAbsPort->Write(strSend); +} + +bool CVSMD12XControl::InitController() +{ +// std::string strTest = "this is a test message."; +// +// char *pcTest = new char[strTest.length()]; +// strTest.copy(pcTest, strTest.length(),0); +// +// memcpy(pcTest, strTest.c_str(), 23); +// +// char *pcTest1 = (char*)strTest.c_str(); +// std::string test=m_pAbsPort->ReadAll(); + std::string strCMD = "dev\n"; + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + int iRet=m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + std::string strRecv = m_pAbsPort->ReadAll(); + ParseReturnedString(strRecv, 0); + std::string::size_type szPosition; + szPosition = strRecv.find("VSMD", 0); + if (szPosition != strRecv.npos) + { + return true; + } + return false; +} + +bool CVSMD12XControl::GetStatus(MSInfo &stuMotorParam) +{ + std::string strCMD = "cts\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + + //QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + ParseReturnedParam(strRecv); + + stuMotorParam = m_stuMSInfo; + return true; +} + +bool CVSMD12XControl::Move(int iRelPulse) +{ + using namespace ZZ_MISCDEF; + char cmd[64]; + sprintf_s(cmd, 64, "rmv %d\n", iRelPulse); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + QThread::msleep(200); + m_pAbsPort->ReadAll(); + if (m_bIsSyncMove) + { + if (iRet != 0) + { + return false; + } + + bool bFlagIsStopped=false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag==0x10 && m_stuMSInfo.fVelocity==0) + { + bFlagIsStopped = true; + } + } + return true; + } + else + { + if (iRet == 0) + { + return true; + } + return false; + } + +} + +bool CVSMD12XControl::Enable() +{ + std::string strCMD = "ena\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::Disable() +{ + std::string strCMD = "off\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); + +} + +bool CVSMD12XControl::MoveTo(int iAbsPulse) +{ + if (iAbsPulse > MAXDISTANCE) + { + //return false; + iAbsPulse = MAXDISTANCE; + } + + char cmd[64]; + sprintf_s(cmd, 64, "pos %d\n", iAbsPulse); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + + int iRet = m_pAbsPort->Write(strCMD); + if (waitetime!=0) + { + QThread::msleep(200); + } + + + m_pAbsPort->ReadAll(); + + if (m_bIsSyncMove) + { + if (iRet != 0) + { + return false; + } + + bool bFlagIsStopped = false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag == 0x10 && m_stuMSInfo.fVelocity == 0) + { + bFlagIsStopped = true; + } + } + return true; + } + else + { + if (iRet == 0) + { + return true; + } + return false; + } +// if (iRet == 0) +// { +// return true; +// } +// return false; +// std::string strTest; +// strTest.resize(7); +// char test[7]; +// //memcpy(test, strCMD.c_str(), 7); +// for (size_t i = 0; i < 7; i++) +// { +// strTest[i] = cmd[i]; +// } +} + +bool CVSMD12XControl::Move_NoSyn(int iRelPulse) +{ + bool a; + waitetime = 0; + m_bIsSyncMove = false; + a = Move(iRelPulse); + m_bIsSyncMove = true; + waitetime = 200; + return a; + +} + +bool CVSMD12XControl::MoveTo_NoSyn(int iAbsPulse) +{ + bool a; + waitetime = 0; + m_bIsSyncMove = false; + a = MoveTo(iAbsPulse); + m_bIsSyncMove = true; + waitetime =200; + return a; +} + +bool CVSMD12XControl::SetLogicZero() +{ + std::string strCMD = "org\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::StartBackZero() +{ + std::string strCMD = "zero start\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + + if (!ParseReturnedString(strRecv, -1)) + { + return false; + } + + bool bFlagIsStopped = false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag == 0x10 && m_stuMSInfo.fVelocity == 0) + { + bFlagIsStopped = true; + } + } + return true; +// return ParseReturnedString(strRecv, -1); + +} + +bool CVSMD12XControl::StopBackZero() +{ + std::string strCMD = "zero stop\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetBaudRate(int iBaudRate) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg bdr=%d\n", iBaudRate); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +int CVSMD12XControl::GetBaudRate() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes= ParseReturnedParam(strRecv); + if (bRes=false) + { + return -1; + } + else + { + return m_stuControllerParams.bdr; + } +} + +bool CVSMD12XControl::SetMicroSteps(int iMicroSteps) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg mcs=%d\n", iMicroSteps); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +int CVSMD12XControl::GetMicroSteps() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.mcs; + } +} + +bool CVSMD12XControl::SetAccSpeed(float fAccSpd) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg acc=%f\n", fAccSpd); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetAccSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.acc; + } +} + +bool CVSMD12XControl::SetRunSpeed(float fRunSpeed) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg spd=%f\n", fRunSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetRunSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.spd; + } +} + +bool CVSMD12XControl::SetDecSpeed(float fDecSpeed) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg dec=%f\n", fDecSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetDecSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.dec; + } +} + +bool CVSMD12XControl::SetSpeed(float fRunSpeed, float fAccSpd, float fDecSpeed) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg spd=%f acc=%f dec=%f\n", fRunSpeed, fAccSpd, fDecSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetHoldCurrent(float fHoldCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg crh=%f\n", fHoldCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetHoldCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.crh; + } +} + +bool CVSMD12XControl::SetAccCurrent(float fAccCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg cra=%f\n", fAccCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetAccCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.cra; + } +} + +bool CVSMD12XControl::SetRunCurrent(float fRunCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg crn=%f\n", fRunCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetRunCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.crn; + } +} + +bool CVSMD12XControl::SetCurrent(float fAccCurrent, float fRunCurrent, float fHoldCurrent) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg cra=%f crn=%f crh=%f\n", fAccCurrent, fRunCurrent, fHoldCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetS1FETE(ZZ_U8 bS1FETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s1f=%d\n", bS1FETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS1FETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s1f; + } +} + +bool CVSMD12XControl::SetS1RETE(ZZ_U8 bS1RETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s1r=%d\n", bS1RETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS1RETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s1r; + } +} + +bool CVSMD12XControl::SetS2FETE(ZZ_U8 bS2FETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s2f=%d\n", bS2FETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS2FETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s2f; + } +} + +bool CVSMD12XControl::SetS2RETE(ZZ_U8 bS2RETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s2r=%d\n", bS2RETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS2RETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s2r; + } +} + +bool CVSMD12XControl::SetZeroParams(ZZ_U8 bZeroMode, ZZ_U8 bSwitchOpenVL, ZZ_U8 bZeroSensor, float fZeroVelocity, int iSafePosition) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg zmd=%d osv=%d snr=%d zsd=%f zsp=%d\n", + (int)bZeroMode, (int)bSwitchOpenVL, (int)bZeroSensor, fZeroVelocity, iSafePosition); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(800); + + std::string strRecv = m_pAbsPort->ReadAll(); + + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetZeroMode() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zmd; + } +} + +ZZ_U8 CVSMD12XControl::GetSwitchOpenVoltageLevel() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.osv; + } +} + +ZZ_U8 CVSMD12XControl::GetZeroSensor() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.snr; + } +} + +int CVSMD12XControl::GetSafePosition() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zsp; + } +} + +float CVSMD12XControl::GetZeroVelocity() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zsp; + } +} + +bool CVSMD12XControl::ParseReturnedString(std::string &strRecv, int iType) +{ + char cHead =(char) 0xFF; + if (iType == -1) + { + if (strRecv[0]== cHead) + { + return true; + } + return false; + } + else if (iType == 0) + { + if (strRecv.size()<3) + { + return false; + } + strRecv.erase(0, 3); + strRecv.erase(strRecv.size() - 3, 3); + return true; + } + else + { + return false; + } +} + +bool CVSMD12XControl::ParseReturnedParam(std::string &strRecv) +{ + + + + while (uchar( strRecv[0])!=0xff&&strRecv.size()>0) + { + //std::cout << strRecv.size() << endl; + strRecv.erase(strRecv.begin()); + //std::cout << strRecv.size() << endl; + + } + int ii = 0; + while (strRecv.size() < 2) + { + + std::string strRecv1 = m_pAbsPort->ReadAll(20); + if (strRecv1.size() == 0) + { + return false; + + } + strRecv = strRecv + strRecv1; + ii++; + if (ii == 2) + { + return false; + + } + } + if (strRecv[2]==0x2) + { + //strRecv.erase(0, 3); + //strRecv.erase(strRecv.size() - 3, 3); + int i = 0; + int izero = 0; + while (strRecv.size() != 21) + { + std::string strRecv1 = ""; + strRecv1 = m_pAbsPort->ReadAll(20); + if (strRecv1.size()==0) + { + return false; + + } + strRecv = strRecv + strRecv1; + i++; + if (i==5) + { + return false; + + } + if (strRecv.size() > 21) + { + return false; + } + //return false; + } + ZZ_U8 *pbRecv = (ZZ_U8*)strRecv.c_str(); + + VSMD_BitShift(&pbRecv[3], &m_unValue); + m_stuMSInfo.fVelocity = m_unValue.fValue; + VSMD_BitShift(&pbRecv[8], &m_unValue); + m_stuMSInfo.iPosition = m_unValue.i32Value; + VSMD_BitShift(&pbRecv[13], &m_unValue); + m_stuMSInfo.uiFlags = m_unValue.u32Value; + + //delete pbRecv; + return true; + } + else if (strRecv[2] == 0x3) + { + strRecv[strRecv.size() - 3] = 0; + char* pcParam = ((char*)strRecv.c_str())+3; + + while (pcParam) + { + char* pcNext = VSMD_Split(pcParam, ' '); + char* pcValueStr = VSMD_Split(pcParam, '='); + + // + if (pcValueStr) + { + if (strcmp(pcParam, "bdr") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.bdr = iValue; + } + else if (strcmp(pcParam, "mcs") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.mcs = iValue; + } + else if (strcmp(pcParam, "spd") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.spd = fValue; + } + else if (strcmp(pcParam, "acc") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.acc = fValue; + } + else if (strcmp(pcParam, "dec") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.dec = fValue; + } + else if (strcmp(pcParam, "cra") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.cra = fValue; + } + else if (strcmp(pcParam, "crn") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.crn = fValue; + } + else if (strcmp(pcParam, "crh") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.crh = fValue; + } + else if (strcmp(pcParam, "s1f") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s1f = iValue; + } + else if (strcmp(pcParam, "s1r") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s1r = iValue; + } + else if (strcmp(pcParam, "s2f") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s2f = iValue; + } + else if (strcmp(pcParam, "s2r") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s2r = iValue; + } + else if (strcmp(pcParam, "zmd") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.zmd = iValue; + } + else if (strcmp(pcParam, "osv") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.osv = iValue; + } + else if (strcmp(pcParam, "snr") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.snr = iValue; + } + else if (strcmp(pcParam, "zsd") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.zsd = fValue; + } + else if (strcmp(pcParam, "zsp") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.zsp = iValue; + } + + } + pcParam = pcNext; + } + return true; + } + + return false; +} + +void CVSMD12XControl::VSMD_BitShift(ZZ_U8* src, unValue* dst) +{ + if (src) + { + dst->u32Value = src[0]; + + dst->u32Value <<= 7; + dst->u32Value |= src[1]; + + dst->u32Value <<= 7; + dst->u32Value |= src[2]; + + dst->u32Value <<= 7; + dst->u32Value |= src[3]; + + dst->u32Value <<= 7; + dst->u32Value |= src[4]; + } +} + +char* CVSMD12XControl::VSMD_Split(char* cStr, char cSplit) +{ + if (cStr) + { + for (char* cPtr = cStr; *cPtr; cPtr++) + { + if (*cPtr == cSplit) + { + *cPtr = '\0'; + cPtr++; + return cPtr; + } + } + } + + return NULL; +} + +// int CVSMD12XControl::add(int a, int b) +// { +// return a + b; +// } diff --git a/othersoft/movingliner/source/LinearShutter/VSMD12XControl.h b/othersoft/movingliner/source/LinearShutter/VSMD12XControl.h new file mode 100644 index 0000000..46e6a5f --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/VSMD12XControl.h @@ -0,0 +1,146 @@ +#pragma once +#include "pch.h" +#include "AbstractPort.h" +using namespace std; +// #ifdef IRIS_API_EXPORTS +// +// #ifdef __cplusplus +// #define IRIS_API_FUNC extern "C" __declspec(dllexport) +// #else +// #define IRIS_API_FUNC __declspec(dllexport) +// #endif +// +// #else +// +// #ifdef __cplusplus +// #define IRIS_API_FUNC extern "C" __declspec(dllimport) +// #else +// #define IRIS_API_FUNC __declspec(dllimport) +// #endif +// +// #endif +// +// +// #ifdef IRIS_API_EXPORTS +// #define IRIS_API_CLASS __declspec(dllexport) +// #else +// #define IRIS_API_CLASS __declspec(dllimport) +// #endif +#define MAXDISTANCE 1265000 +class /*IRIS_API_CLASS*/ CVSMD12XControl +{ +public: + CVSMD12XControl(); + ~CVSMD12XControl(); +private: + int *m_piPositionInPulses; + + CAbstractPort *m_pAbsPort; + unValue m_unValue; + MSInfo m_stuMSInfo; + ControllerParams m_stuControllerParams; + int m_iProtocolType; + int m_iCID; + std::string m_strCID; +public: + bool m_bIsSyncMove; + ////////////////////////////////////////////////////////////////////////// + //for IRIS Linear Motor - Electric Shutter + //Initialize communication setup iPortType(0:RS232 1:RS485) iCID(For RS485 device) bSyncMove(move mode) + bool ILMES_InitializeComm(QString portName,int bandrate=9600, int iPortType = 1, int iCID = 1, bool bSyncMove = true); + //Initialize communication setup iPortType(0:RS232 1:RS485) iCID(For RS485 device) bSyncMove(move mode) + bool ILMES_InitializeComm(PortInfo portinfo,int iPortType = 1,int iCID = 1, bool bSyncMove = true); + + //Initialize Controller params + bool ILMES_InitializeParams(ControllerParams cpParams); + + //Set the light hole position(pulses) + void ILMES_SetPosition(int *piPositionInPulse,size_t szSize); + + bool ILMES_MoveToPos(int iPositionIndex); + +public: + int waitetime; + ////init port + void SetProtocolType(int iProtocolType = 0);//0:RS232 1:RS485 call before send any command + void SetCID(int iID);//set device id when using RS485 protocol call before send any command + void SetSyncMode(bool bSyncMove = false); + bool InitAndOpenPort(PortInfo portinfo);//Init comport by PortInfo Struct + + //////////////////////////////////////////////////////////////////////////for debug or unsupported function + std::string ReadReceive(); + int SendCommand(const std::string strSend); // return indicates how many char has been sent + //////////////////////////////////////////////////////////////////////////motor control + ////init&misc + bool InitController(); //Init Motor controller hand shake + + bool Enable(); //enbale + bool Disable(); //disable + + bool GetStatus(MSInfo &stuMotorParam); //load motor status see MSInfo Struct + ////motion control + bool Move(int iRelPulse); // relative move mode,pulse (-2147483647~2147483647) + bool MoveTo(int iAbsPulse);//absolute mode,pulse (-2147483647~2147483647) + bool Move_NoSyn(int iRelPulse); // relative move mode,pulse (-2147483647~2147483647) + bool MoveTo_NoSyn(int iAbsPulse);//absolute mode,pulse (-2147483647~2147483647) + bool SetLogicZero(); //set logic zero + + bool StartBackZero();//back zero + bool StopBackZero();// stop back zero & reset register + ////Set&Get + bool SetBaudRate(int iBaudRate);//set controller baud rates,default B9600 (2400 ~ 921600) + int GetBaudRate(); // -1:should retry; + + bool SetMicroSteps(int iMicroSteps);//set micro steps (0~5)->(1/2/4/8/16/32) + int GetMicroSteps(); + + bool SetAccSpeed(float fAccSpd);//set acceleration speed in pulse (0 ~ 192000000) + float GetAccSpeed(); + + bool SetRunSpeed(float fRunSpeed);//set normal running speed in pulse (0 ~ 192000000) + float GetRunSpeed(); + + bool SetDecSpeed(float fDecSpeed);//set deceleration speed in pulse (0 ~ 192000000) + float GetDecSpeed(); + + bool SetSpeed(float fRunSpeed, float fAccSpd, float fDecSpeed);//see above three functions + + bool SetHoldCurrent(float fHoldCurrent);//set hold current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetHoldCurrent(); + + bool SetAccCurrent(float fAccCurrent);//set acceleration current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetAccCurrent(); + + bool SetRunCurrent(float fRunCurrent);//set normal running current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetRunCurrent(); + + bool SetCurrent(float fAccCurrent, float fRunCurrent, float fHoldCurrent);//see above three functions + + bool SetS1FETE(ZZ_U8 bS1FETE);//S1 register falling edge trigger event,see enum + ZZ_U8 GetS1FETE(); + + bool SetS1RETE(ZZ_U8 bS1RETE);//S1 register rising edge trigger event + ZZ_U8 GetS1RETE(); + + bool SetS2FETE(ZZ_U8 bS2FETE);//S2 register falling edge trigger event + ZZ_U8 GetS2FETE(); + + bool SetS2RETE(ZZ_U8 bS2RETE);//S2 register rising edge trigger event + ZZ_U8 GetS2RETE(); + + //(ZeroMode 0:off 1:once 2:once + safe position 3:twice 4:twice + safe position) (OpenVoltageLevel 0:Low Level 1:High Level) + //(ZeroSensor 0:S1 1:S2 2:S3 3:S4 4:S5 5:S6)( ZeroVelocity (-192000) ~(192000)pulse)(SafePosition (-2147483647) ~(2147483647)) + bool SetZeroParams(ZZ_U8 bZeroMode, ZZ_U8 bSwitchOpenVL, ZZ_U8 bZeroSensor, float fZeroVelocity, int iSafePosition); + ZZ_U8 GetZeroMode(); + ZZ_U8 GetSwitchOpenVoltageLevel(); + ZZ_U8 GetZeroSensor(); + int GetSafePosition(); + float GetZeroVelocity(); + +private: + bool ParseReturnedString(std::string &strRecv,int iType); + bool ParseReturnedParam(std::string &strRecv); + void VSMD_BitShift(ZZ_U8* src, unValue* dst); + char* VSMD_Split(char* cStr, char cSplit); +}; + diff --git a/othersoft/movingliner/source/LinearShutter/VSMD12XMiscDefines.h b/othersoft/movingliner/source/LinearShutter/VSMD12XMiscDefines.h new file mode 100644 index 0000000..6de39a7 --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/VSMD12XMiscDefines.h @@ -0,0 +1,108 @@ +#pragma once +#include "ZZ_Types.h" +#define MAXBUFFER 10240 +#include +using namespace ZZ_MISCDEF; + +typedef struct tagTransportLayerInfomation +{ + //Serial + int iPortType; + int iPortNumber; + int indexBaudRate; + int iBaudRate; + int indexParity, indexBytesize, indexStopBits; //Mode + bool Hw; + bool Sw; + bool Dtr, Rts; + QString FullPortName; + tagTransportLayerInfomation() { + iPortType = 0; + indexParity = 0; + iPortNumber = 8; + iBaudRate = 9600; + indexBytesize = 3; + indexStopBits = 0; + FullPortName = ""; + } + + //Bit + //Stop + //MODEM CONTROL setting + //MODEM LINE STATUS + + //TCP UDP + +}PortInfo; + +typedef struct tagMotorStatusInfo +{ + float fVelocity; + int iPosition; + ZZ_U32 uiFlags; +}MSInfo; + +typedef struct tagControllerParams +{ + int bdr; //baud + int mcs; //microsteps 0:full 1:half 2:4 3:8 4:16 5:32 6:64 7:128 8:256 + float spd; //velocity + float acc; //acceleration + float dec; //deceleration + float cra; //acc state current + float crn; //normal state current + float crh; //hold state current + ZZ_U8 s1f; + ZZ_U8 s1r; + ZZ_U8 s2f; + ZZ_U8 s2r; + ZZ_U8 zmd; //zero mode + ZZ_U8 osv; //open state sensor value + ZZ_U8 snr; //zero sensor + ZZ_U8 zsp; //zero safe position + float zsd; //zero velocity + tagControllerParams() { + bdr = 9600; + + cra = 0.8; + crh = 0.1; + crn = 0.8; + + acc = 100000; + dec = 100000; + spd = 64000; + + osv = 0; + snr = 0; + zmd = 3; + zsp = 20; + zsd = 50000; + + mcs = 6; + } +}ControllerParams; + +typedef union +{ + ZZ_U8 byteValue[4]; + short i16Value[2]; + ZZ_U16 u16Value[2]; + int i32Value; + float fValue; + ZZ_U32 u32Value; +}unValue; + +enum emVSMDTriggerEvent +{ + NoAction =0, //锟睫讹拷锟斤拷锟斤拷只锟斤拷状态位 S1 锟戒化通知锟斤拷 + ResetZeroPosition, //锟斤拷锟斤拷锟斤拷锟斤拷原锟斤拷位锟斤拷 + DecSpdStop, //锟斤拷锟斤拷停止 + DecSpdStopRZP, //锟斤拷锟斤拷停止锟斤拷锟斤拷锟斤拷停止锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷原锟斤拷位锟斤拷 + Stop, //锟斤拷锟斤拷停止 + StopRZP, //锟斤拷锟斤拷停止锟斤拷锟斤拷锟斤拷停止锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷原锟斤拷位锟斤拷 + RunningPosDirect, //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷转锟斤拷锟斤拷锟劫度o拷 + RunningNegDirect, //锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷转锟斤拷锟斤拷锟劫度o拷 + OfflineModeOn, //锟斤拷锟斤拷模式锟斤拷锟斤拷 + OfflineModeOff //锟斤拷锟斤拷模式停止 +}; + diff --git a/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.cpp b/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.cpp new file mode 100644 index 0000000..d5767ad --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.cpp @@ -0,0 +1,147 @@ +#include "pch.h" +#include "ZZ_SeiralPort.h" + +CZZ_SeiralPort_QT::CZZ_SeiralPort_QT() +{ + m_pSerialPort = new QSerialPort(); +} + +CZZ_SeiralPort_QT::~CZZ_SeiralPort_QT() +{ + if (m_pSerialPort != NULL) + { + delete m_pSerialPort; + } +} + + void CZZ_SeiralPort_QT::InitPort(PortInfo portinfo) +{ + + m_piSettings = portinfo; + + +} + + bool CZZ_SeiralPort_QT::SetPort() + { + bool bRes = true; +// int iRes = sio_ioctl(m_piSettings.iPortNumber, m_piSettings.indexBaudRate, +// m_piSettings.indexParity | m_piSettings.indexBytesize | m_piSettings.indexStopBits); +// if (iRes != SIO_OK) +// { +// bRes = false; +// } + QString qstrPortName; + if (m_piSettings.FullPortName!="") + { + qstrPortName = m_piSettings.FullPortName; + qDebug() << m_piSettings.FullPortName; + } + else { + qstrPortName = QString("COM%1").arg(m_piSettings.iPortNumber); + } + // qstrPortName = "COM4"; + // QString qstrPortName = m_piSettings.FullPortName;//QString("COM%1").arg(m_piSettings.iPortNumber); + m_pSerialPort->setPortName(qstrPortName); + m_pSerialPort->setReadBufferSize(512); + bRes = m_pSerialPort->setBaudRate(m_piSettings.iBaudRate); + return bRes; + } + +bool CZZ_SeiralPort_QT::Open() +{ + bool bRes = true; +// int iRes = sio_open(m_piSettings.iPortNumber); +// if (iRes!=SIO_OK) +// { +// bRes = false; +// } + bRes = m_pSerialPort->open(QIODevice::ReadWrite); + if (!bRes) + { + qDebug() << "Err:open Failed.Exit Code:1"; + //std::cout << "Err.open Failed" << std::endl; + return bRes;; + } + return bRes; +} + +void CZZ_SeiralPort_QT::Close() +{ + m_pSerialPort->close(); +} + +std::string CZZ_SeiralPort_QT::ReadAll(int waite) +{ + if (!m_pSerialPort->waitForReadyRead(waite)) + { + return ""; + + } + if ( + m_pSerialPort->bytesAvailable() == 0 + ) + { + return ""; + } + + qbaRecv.clear(); + + qbaRecv = m_pSerialPort->readAll(); + + + std::string strRet(qbaRecv.constData(), qbaRecv.length()); + return strRet; + +// std::string strRet; +// char cBuf[MAXBUFFER]; +// int iRet = sio_read(m_piSettings.iPortNumber,cBuf, MAXBUFFER); +// if (iRet==0) +// { +// strRet = ""; +// +// } +// else +// { +// char *pRecv = new char[iRet]; +// memcpy(pRecv, cBuf, iRet); +// //std::string strRet(pRecv); +// //delete pRecv; +// //return strRet; +// +// strRet.resize(iRet); +// for (int i=0;iwrite(qbaTest); + m_pSerialPort->waitForBytesWritten(5000); + if (qi64Write != qbaTest.size()) + { + qDebug() << "Err:write Failed.Exit Code:1" << qi64Write; + return qi64Write; + } + + return 0; +// char* pcSend = (char*)strSend.c_str(); +// int iRet = sio_write(m_piSettings.iPortNumber, pcSend, (int)strSend.length()); +// +// //delete pcSend; +// if (iRet!= (int)strSend.length()) +// { +// return iRet; +// } +// else +// { +// return 0; +// } +// //sio_write(); +} diff --git a/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.h b/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.h new file mode 100644 index 0000000..5d7d0f4 --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/ZZ_SeiralPort.h @@ -0,0 +1,26 @@ +#pragma once +#include "VSMD12XMiscDefines.h" +#include "AbstractPort.h" +#include"qobject.h" +class CZZ_SeiralPort_QT :public CAbstractPort,QObject +{ + +private: + PortInfo m_piSettings; + QByteArray qbaSend, qbaRecv; + QSerialPort *m_pSerialPort; +public: + CZZ_SeiralPort_QT(); + virtual ~CZZ_SeiralPort_QT(); +public: + virtual void InitPort(PortInfo portinfo); + virtual bool SetPort(); + virtual bool Open(); + virtual void Close(); + + virtual std::string ReadAll(int waittime = 5000); + + virtual int Write(const std::string strSend); + +}; + diff --git a/othersoft/movingliner/source/LinearShutter/ZZ_Types.h b/othersoft/movingliner/source/LinearShutter/ZZ_Types.h new file mode 100644 index 0000000..7ad1c54 --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/ZZ_Types.h @@ -0,0 +1,297 @@ +////////////////////////////////////////////////////////////////////////// +//类型说明文件 +////////////////////////////////////////////////////////////////////////// +#pragma once +#include "pch.h" +#include +#define MAX_DEVICENUMBER_FS 2 +#define MAX_LINEARSHUTTER_POSITION 12 +namespace ZZ_MISCDEF +{ + typedef unsigned char ZZ_U8; + typedef unsigned short int ZZ_U16; + typedef unsigned long int ZZ_U32; + + + namespace IRIS + { + //Fiber Spectrometer + namespace FS + { + typedef struct tagDataFrame + { + ZZ_U16 usExposureTimeInMS; + ZZ_U16 usData[4096]; + float fTemperature; + 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; + } + + 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 tagFiberSpecContext + { + ZZ_U8 ucDeviceNumber; + ZZ_U8 ucDeviceModel[MAX_DEVICENUMBER_FS]; + int iInterface[MAX_DEVICENUMBER_FS]; + std::string strSN[MAX_DEVICENUMBER_FS]; + }FSContext; + + typedef struct tagLinearShutterContext + { + ZZ_U8 ucPort; + 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; + + }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; + } + +}; diff --git a/othersoft/movingliner/source/LinearShutter/pch.h b/othersoft/movingliner/source/LinearShutter/pch.h new file mode 100644 index 0000000..d5ac3af --- /dev/null +++ b/othersoft/movingliner/source/LinearShutter/pch.h @@ -0,0 +1,28 @@ +#pragma once +#include +////////////////////////////setings +#include +#include +////////////////////////////Basic +#include +#include +#include +#include +#include +////////////////////////////Thread +#include +#include +#include +////////////////////////////json +#include +#include +#include +#include +#include +////////////////////////////time +#include +#include +#include +////////////////////////////Serial I/O +#include +#include \ No newline at end of file diff --git a/othersoft/movingliner/source/Settings/SystemConfigger.cpp b/othersoft/movingliner/source/Settings/SystemConfigger.cpp new file mode 100644 index 0000000..46e8800 --- /dev/null +++ b/othersoft/movingliner/source/Settings/SystemConfigger.cpp @@ -0,0 +1,191 @@ +#include "SystemConfigger.h" + + + ZZ_SysConfigger::ZZ_SysConfigger(QObject *parent /*= nullptr*/) + { +#ifdef _DEBUG + m_qstrDeviceConfigFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/config/DeviceSettings.ini"; + m_qstrJSONConfigFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/config/config.json"; +#else + m_qstrJSONConfigFilePath = ("/home/data/Setting/config.json"); +#endif // DEBUG + + m_qsDeviceConfig = NULL; + } + + ZZ_SysConfigger::~ZZ_SysConfigger() + { + if (qfJConfig.isOpen()) + { + qfJConfig.close(); + } + } + + int ZZ_SysConfigger::Initialize() + { + //////////////////////////////////////////////////////////////////////////load device settings + using namespace ZZ_MISCDEF; + QMetaEnum enumDeviceModel = QMetaEnum::fromType(); + + if (m_qsDeviceConfig!=NULL) + { + delete m_qsDeviceConfig; + } + m_qsDeviceConfig = new QSettings(m_qstrDeviceConfigFilePath, QSettings::IniFormat); + m_struDeviceContext.ucDeviceNumber = m_qsDeviceConfig->value(QString("DEVICE INFO/TotalSpectrometer"),-1).toInt(); + if (m_struDeviceContext.ucDeviceNumber == -1) + { + qDebug() << "DEVICE INFO TotalSpectrometer Value Err."; + return 3; + } + for (ZZ_U8 i=0;i< m_struDeviceContext.ucDeviceNumber;i++) + { + QString qstrTemp= m_qsDeviceConfig->value(QString("FS%1/Model").arg(i+1), "Null").toString(); + m_struDeviceContext.ucDeviceModel[i]= enumDeviceModel.keysToValue(qstrTemp.toLatin1().data()); + + int iInterface= m_qsDeviceConfig->value(QString("FS%1/Port").arg(i + 1), -2).toInt(); + m_struDeviceContext.iInterface[i] = iInterface; + + qstrTemp = m_qsDeviceConfig->value(QString("FS%1/UID").arg(i + 1), "Null").toString(); + m_struDeviceContext.strSN[i] = qstrTemp.toStdString(); + } + + m_struAcqPosition.iTotalPosition = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/TotalPosition"), -1).toInt(); + if (m_struAcqPosition.iTotalPosition == -1) + { + qDebug() << "LINEAR SHUTTER TotalPosition Value Err."; + return 4; + } + + for (ZZ_U8 i = 0; i < m_struAcqPosition.iTotalPosition; i++) + { + int iPosition = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Position%1").arg(i), -2).toInt(); + m_struAcqPosition.iPosition[i] = iPosition; + } + + + + //////////////////////////////////////////////////////////////////////////load json settings + qfJConfig.setFileName(m_qstrJSONConfigFilePath); + bool bRes = qfJConfig.open(QIODevice::ReadOnly); + if (!bRes) + { + qDebug() << "QFile open config file Err."; + return 1; + } + + m_qbaJData = qfJConfig.readAll(); + m_qjdJDoc= QJsonDocument::fromJson(m_qbaJData, &m_qjpeJErr); + if (m_qjpeJErr.error != QJsonParseError::NoError) + { + qDebug() << m_qjpeJErr.errorString(); + return 2; + } + m_qjoJObj = m_qjdJDoc.object(); + return 0; + } + + int ZZ_SysConfigger::GetGrabberRunParams(RunTimeGrabberParams &struGrabberRTParams) + { + struGrabberRTParams.atsParams = m_struAcqTime; + struGrabberRTParams.fscParams = m_struDeviceContext; + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_IS1() + { + m_struIS1Info.qstrCalFile_U0 = m_qjoJObj.value("IS1UpCalFile").toString(); + m_struIS1Info.qstrCalFile_D1 = m_qjoJObj.value("IS1DownCalFile1").toString(); + m_struIS1Info.qstrCalFile_D2 = m_qjoJObj.value("IS1DownCalFile2").toString(); + m_struIS1Info.qstrCalFile_D3 = m_qjoJObj.value("IS1DownCalFile3").toString(); + + + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_iSIF() + { + m_struISIFInfo.qstrCalFile_U0 = m_qjoJObj.value("SIFUpCalFile").toString(); + m_struISIFInfo.qstrCalFile_D1 = m_qjoJObj.value("SIFDownCalFile1").toString(); + m_struISIFInfo.qstrCalFile_D2 = m_qjoJObj.value("SIFDownCalFile2").toString(); + m_struISIFInfo.qstrCalFile_D3 = m_qjoJObj.value("SIFDownCalFile3").toString(); + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_System() + { + // QString qstr = m_qjoJObj.value("IntervalTime").toString(); + m_struAcqTime.qtStartTime=QTime::fromString(m_qjoJObj.value("BeginTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStartTime.isValid()) + { + qDebug() << "Invalid BeginTime"; + return 1; + } + +#ifdef _DEBUG + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "ss"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid IntervalTime"; + return 1; + } +#else + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "mm"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid IntervalTime"; + return 1; + } +#endif + + m_struAcqTime.qtStopTime = QTime::fromString(m_qjoJObj.value("EndTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStopTime.isValid()) + { + qDebug() << "Invalid EndTime"; + return 1; + } + + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_MISC() + { + m_struEC.qstrLocation = m_qjoJObj.value("Location").toString(); + m_struEC.qstrGPS_Altitude = m_qjoJObj.value("GPS_Altitude").toString(); + m_struEC.qstrGPS_Latitude = m_qjoJObj.value("GPS_Latitude").toString(); + m_struEC.qstrGPS_Longtitude = m_qjoJObj.value("GPS_Longtitude").toString(); + m_struEC.qstrGPS_North = m_qjoJObj.value("GPS_North").toString(); + + m_struMEC.qstrInstallationTime = m_qjoJObj.value("InstallationTime").toString(); + m_struMEC.qstrISIFCalibrationTime = m_qjoJObj.value("ISIFCalibrationTime").toString(); + m_struMEC.qstrIS1CalibrationTime = m_qjoJObj.value("IS1CalibrationTime").toString(); + m_struMEC.qstrNameOfMaintenanceStaff = m_qjoJObj.value("NameOfMaintenanceStaff").toString(); + m_struMEC.qstrPhoneNumberOfMaintenanceStaff = m_qjoJObj.value("PhoneNumberOfMaintenanceStaff").toString(); + m_struMEC.qstrDownloadUserID = m_qjoJObj.value("DownloadUserID").toString(); + m_struMEC.qstrDownlaodAddress = m_qjoJObj.value("DownlaodAddress").toString(); + + + + return 0; + } + + int ZZ_SysConfigger::LoadSettings_Test() + { + QFile qfTest(m_qstrJSONConfigFilePath); + + qfTest.open(QFile::ReadOnly); + + QByteArray qbJData = qfTest.readAll(); + + QJsonParseError jerr; + QJsonDocument jdoc(QJsonDocument::fromJson(qbJData, &jerr)); + if (jerr.error!= QJsonParseError::NoError) + { + qDebug() << jerr.errorString(); + } + + QJsonObject rootobj = jdoc.object(); + QStringList key = rootobj.keys(); + QString qtest1 = rootobj.value(rootobj.keys().at(15)).toString(); + return 0; + } diff --git a/othersoft/movingliner/source/Settings/SystemConfigger.h b/othersoft/movingliner/source/Settings/SystemConfigger.h new file mode 100644 index 0000000..6f237a2 --- /dev/null +++ b/othersoft/movingliner/source/Settings/SystemConfigger.h @@ -0,0 +1,57 @@ +#pragma once +#include "pch.h" +#include "ZZ_Types.h" +using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; +using namespace ZZ_MISCDEF::ZZ_DATAFILE; + +class ZZ_SysConfigger :public QObject +{ + Q_OBJECT + +public: + ZZ_SysConfigger(QObject *parent = nullptr); + virtual ~ZZ_SysConfigger(); +public: + int Initialize(); + int GetGrabberRunParams(RunTimeGrabberParams &struGrabberRTParams); + + int LoadSettingsFromFile_IS1(); + int LoadSettingsFromFile_iSIF(); + int LoadSettingsFromFile_System(); + int LoadSettingsFromFile_MISC(); + int LoadSettings_Test(); +public: + enum ConfiggerDeviceModel + { + OSIFAlpha = 0, + OSIFBeta, + ISIF, + IS1, + IS2, + Null + }; + Q_ENUM(ConfiggerDeviceModel); + //////////////////////////////////////////////////////////////////////////run-time settings + AcqTimeSettings m_struAcqTime; + FSContext m_struDeviceContext; + AcqPosSettings m_struAcqPosition; + ////////////////////////////////////////////////////////////////////////// + EContext m_struEC; + MEContext m_struMEC; + IS1Info m_struIS1Info; + ISIFInfo m_struISIFInfo; + +private: + QString m_qstrDeviceConfigFilePath; + QString m_qstrJSONConfigFilePath; + QFile qfJConfig/*,qfDeviceConfig*/; + QSettings *m_qsDeviceConfig; + + QByteArray m_qbaJData; + QJsonParseError m_qjpeJErr; + QJsonObject m_qjoJObj; + QJsonDocument m_qjdJDoc; + + + +}; \ No newline at end of file diff --git a/othersoft/shuttercali/project/LocationCali/CMakeLists.txt b/othersoft/shuttercali/project/LocationCali/CMakeLists.txt new file mode 100644 index 0000000..3f78fd7 --- /dev/null +++ b/othersoft/shuttercali/project/LocationCali/CMakeLists.txt @@ -0,0 +1,46 @@ +cmake_minimum_required(VERSION 3.3) + +project(shutter_calibrate) +set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} C:/Qt/Qt5.12.7/5.12.7/mingw73_64) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) +set(QT Core Gui Network WebSockets SerialPort Widgets) +set(CMAKE_CXX_STANDARD 14) +find_package(Qt5 REQUIRED ${QT}) + + +file(GLOB_RECURSE HDR_LIST "../../source/*.h") +file(GLOB_RECURSE SRC_LIST "../../source/*.cpp") +file(GLOB_RECURSE HDR_LIST1 "../../source_rlx/*.h") +file(GLOB_RECURSE SRC_LIST1 "../../source_rlx/*.cpp") + +include_directories("../../source") +include_directories("../../source/FS") +include_directories("../../source/Logger") +include_directories("../../source/ZZ_SDK") +include_directories("../../source/Settings") +include_directories("../../source/Thread") +include_directories("../../source/LinearShutter") +include_directories("../../source_rlx/ShutterCali") +include_directories("../../source_rlx/sensor") +include_directories("../../source/OSIF/include") +include_directories("D:/02Raspberry/2020-12-17/SeaBreeze/include") +link_directories("D:/02Raspberry/2020-12-17/SeaBreeze/lib") +link_directories("/home/pi/SeaBrease/lib") +add_executable( shutter_calibrate main.cpp + ${HDR_LIST} + ${SRC_LIST} + ${HDR_LIST1} + ${SRC_LIST1} +) +qt5_use_modules(shutter_calibrate ${QT}) +target_link_libraries(shutter_calibrate SeaBreeze) +IF (WIN32) +target_link_libraries(shutter_calibrate SeaBreeze) +ELSE () +target_link_libraries(shutter_calibrate seabreeze usb stdc++ m) +ENDIF () +set_target_properties(shutter_calibrate PROPERTIES AUTOMOC ON) + + diff --git a/othersoft/shuttercali/project/LocationCali/SeaBreeze.dll b/othersoft/shuttercali/project/LocationCali/SeaBreeze.dll new file mode 100644 index 0000000000000000000000000000000000000000..66bc74c7275bdbbb154cba9fe216d8e8b13f5bd0 GIT binary patch literal 2670080 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
9qc1yVLHuZQ!5 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
?GXIP@Gdnui*}?APZoHLr|H)M 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 Dcm#4H$)cUKRFyn6&n|9435ybw%q zWLlx}Ybx}TaQSr;yInpJ;$Z9cy&1LtVXdwZlO<=Pi5&U$X9=d|*AL3rzgAj)tsTU2 zq>qLA=Ux=2t4Ds7?2swH()$j2JC;kYI+al*FXR0%CEf;vi3iVt_@fUm0xqQ#36|tDAODH^)8I5*8X>rLTb0z z>E@B1Og0zapk;b1zfK1Bc+%>1`(2CCGLH?i0I=gcMt4E-rJT>Xi_47OIcKJj|kLA~WmwOO#-WpBg$glDm z2GjCu$1--0m6l(p1+n}=f}Z|0isE$j$gjgIGv(LQSbyqy#bdayovnX8{u4&`SbnV| z&~nSKyLMEtJ(OR2-|xz=QTKTgWGb`%i+a_ORE%(5nUg<+~j>{!aTGx0` zGk{-BbEU`L2&w*YykN-`R&stK7IIso8CcEBFhR0H-3Ty!m^yG%V&U!{-jAq5giEb3 zycBMxcXy%awR#2EvZrdfx_{-LWKO}Pr&u<(NRQx>i9|}4T!MCRLcm()H9-ZWDWgYehg|bW(pqqDo93IHKrMKgsrDGfo4>|aAvav z?tk6kN|aA-_eOTHMaLmq=z40*E=ocN$`n4b#ZJBeMa<-C5Brt&WJWup3)M#kU8&ep zD5Kcvl*TuBQ%l?dY#Uamz^mft!9EfMukwhjgp&yxWwa z?=0I1!s?FSqs(__Kk`Pb5_+(nGMM7fcSFvDwX)l-TK#9V2QgXlE}F)XU)$~+Tu*Jc zYUI~NK`f6;&|6P!PjR|>@AlI-g6fzdpU!mCUjwj=^h1$u<=2454Ec534Ht4OOGk_` zLo^0=)6C;AfZ1DUWpr!Ji+B1la=E?MJU`HnsZd0KGdohuNjPP`qD@861D`xsX$+z) zNiCsw+6uc5@P3tF8C+{n(l4WdRQam4J6|HG5$=2|lENiw&+ijOIk=%>w8PnnRmD26 z26usK^wT>vOy(QwaePt03!$DcjaR zV`3gg7pak$o7qKXCUhWp3_VC*l@o+%Jg(d8*=rJU&%9d7{j7 zj7Q>yE{T$~k0r6eA+f0mMQH8&Y3$SrGMLoN~x0QeS^CHj-Ut)pL} zTyuBJSy<=r7P{WP9$G0F?dz)vN&zsv+PuS+8j=dTf3-65{%n|d+K7tse&b3jA}P7Q z*hc%L-ZW;+SEKxxymyQXlgD>$<0Gp!9qhs3(l!T^o#;aO{o4(K{I2l%eU{X_<4S?_;%?G6$eWHvn>f&)*UIL^Hs~vr0%>z%WqR;H{Kc1h@!i4O zQ{g$;9D0Fo=O8}pt)SCp;p;y!9bc@+B9O-c>a<@F{!8DN`Z!sG>CbAq#koNa{P}PO z;a$`XzH=RX4pBMj-#;HbJguA!!=a}&mb<<4z7_ni=m6}&$&!UpzeiNhi4}Xj0Dhla z0l{MN=Y+3NukxT$K%GKMMy~PN9XtY9-=X(J4|0wH*d08jZxas+!9T?VY~9c&<2M%4 zCj;%#KWBU8!Iz%TZW^#U@WoHfg>TSm z!FT@ma^ZUzHgz3ctCF9G=j7*Ms|DYmu+0_Te(!9)I_mf4^+9~;{&`l9@cHtmx|>&R z_@K=j+xZG+O9vL8DYKk=EvPp&&NI@=1cMJqP`7?)alj%dWsWWN^0#!v88LAy8!;yq zJr0*96c}bYj5ix-aSa8Q-f@c?pe&H&6OqrkkI~F%+{cK+)%{;=lQJ$@@|-vM`!S_H zi8hLlbe4{97SuM1OX0iYs5dr``A{&Hq)y6f*i3`U?ZwzvTfOphvD)-rt=XED!zwKO zg_S1x!peC0=!BXeYe6f2@g!D|=B-~6JiK*g(FHChvNP#D(VH@5B#;X~DfQ@OQp&zF zbJT$dbyo6|IVjQY!@hYhn~PCqC+6}iV!?MXGaBieT_w?if3iP9lkB16q&_oaKBc)( zKF5tRc)j;@C8Yv(S%8(jm<0kYeTQK_!!QlgjWljc$Dh=ufDhK>|sBe2+BAb!J?WA<)WX^Yu{(`5cj(4Z`B1*Rr`7W!_{iha&<$iWGt$ zw~ZtUN9xQc>mme>R4^4-n9JP2^5h6(J&x3w1rR?TM`8kPy#Mi(8iv6Ux|Smn<#2>y z%aH`U$`ShbQ;tYoHWTWlJNy&}XoD3&1xj)3!HtyBd1q5FQik|GTT3L~TLKny*P#;P z+qu8p6jtE(uVZ-J(;SZ3+LeDE7ahN>HCCCOBcPu}!_x6VV_!(cIN~Yl{1K0}EN)vx zS$p@}oWLiRC{znMV0^1G$8StYL%R&jOsCR{!eLc17_k_m)d)p-lLncegk1-XZV#pX7MUO7q9xS61_7-+q_10xT;y>p#K=kw8_4ydiMV4d9ezPtTM zQZ<;WLab==CH~V|b%^EYsx(hrXxpoaQGB)AzUa-c_oBB7N~C$>Lce2VU-V{wVkZ|D z+dSGOr>F}gadSB=8+vetFM3n1;-9|g%>aMw<@93+Fp)!G5~59VB#UaKebIYzf9TIh zPcgk7mI4gR^o!obC~ZDG2TV+s5A3H8V@ccr^ViX*v!&cFP|l?DO5M^=XKPhe2v?C1 zR7_k{EXpv(7G3+Cv_v^$i(!3Ex)#0+c??hv zXyZ&XIv;9Eel}q@MZA?J`Q;K6<5;>MY%$liDU>>v#A8^?aAXNXD}kWjiTt5}-kALg zo&U6SEdAazzPQBsne*72n>yQn=$j#r%K7l4gkKC^IYSLNxe6kvw|4?q?!_in~${T`Dx z61xb0Y;XEm2=wc`8gDTo$6mVx=JE0J;W0J~o0tb|%>73}lbS5?c-UN9ba!*#-ikZU zXTIW43fh<-UA0;8upwU=u5?r|1&?Eii|W*ww|Qj&ot$~iuW%BlbD*7mr?Rx<`H*TT z@-W6+fII{~lgX_FK11qmyDe(MzR5~!x1OS|02+H18r7c62Rwo>0|Ac%Z#n{ebFT%i zzAwHtch3Q50b)2D=<^qj{@=TNzCsf8;Iwgf!oV#YK1?!>Eh6 zs7ur|VE1CtS7>c^A8Z78AHlLN!iHr)4PAVR&VP1}Ve`ySm5dsn4Ep#ZJcxPwSrw^5 zm8dH4?rwHj#?fUHy@%)C-3SA12dD#jPK>?OA6s0vh1g%CxkrNNNqp1~GinnLy2&usy6ptgV>hzW7PimN)T!VD&dT;hI~^Q)MdOUEmPUmFn&rm!Bke-au0wABfNA> zL>(2(Ap^kCa0DUp5#k_QDJSe&I}h83Cn0gTeG0K5 zA_>G%8TU6yu@_B&(khRzlEi~v;^wNvA!v7o4OH#8w+5tN1&DYS4 zNSmw}5@y?;v6s|uR z*;5OckP^BAv5$TpNPh5{V%1!1^F6VAE!);M+mNx!1#r{G#1GdPaLmT+e*t1}a-e!- zkvaGuoU7S0x;h9+`T_pftfP0`PMt$iHRBk{fUi0R1v{glP_ zK0$*YQ-;+FzgjFb;@wv52Nuw6P`NrU^7AePZIUcx?cf#3or3b{! z>#){gB!{fNLiEoJqFsDUBB`L?--*nu|FA32Y9WKZ4MdVyzEk52`gV!7!{TQLfKGI^ z8g_+gNHK@lm^$jW_`^#oyJPJ}(_cZ7^m_ADUb_ z9)U?1XQdBC`01lzC_58T?1|{Z_8Z_e<}R+0xFWNlZ^J@@8a?s&H$U!O9~%8}xKgGX zJu8;8wVZ}8&>POb9NUGYKSuh&G0tF*o(QV)PpMf=lcN(!_mTCuY2~^G42}{>tr?1) z75WgwJi;j=v}4)&y8S07D%$$L!m7(!xd=SUu?J>%DMA9AkN=o!4JE!|bQQ2u6$jw>(h z4zl)`LioAmXI`si*Se7M_xoIP_T{SMfyS8=qb(y}O9kjfH}U4@VU@+l#dD2c8bnn8 z5do)u3P{m;egqy0JcCX041Qh)TI-JTmV^M|N2_7%o7t{<7j14v!v_s-ZN!VT=T zUc|nX$Ce?pm=T{my#pDMf6KMFJyY`RCF`R^Jxc7x8`Iaz-*GC2(Nk(Ir;A5zq9h>> z#9_7r_b*h^)*q85?Ye$0Y5d|IPY0L=H)>YCj>no&n3Tbm6a!D(lFv6M^ zL0PN}!zi{2Rls!Tkp5xiRWy8R=KOWUBFNkBU22TeQ75xt#6Ygc6zU4Tfg7?dizwb-NjTT`~?+GS*I$v0FG9 z%m^}eQZhDCGL957mOki`Q95B{ux-^Eg2nxiGCLktUu$E1h;|694|5rjFrwm|so)Mp z-6GTq6I>xxnTz^aF`qDR(R_j>k?6|x=6sk2Fs6sLr1}8QP|bewZYm_}{Uy$fuSz1O z5&MQ*;`Gb}l{dGC^^mS}!cUrlF{_39o9rQxavwehB32Nq_pNk4hI66F;U6@8( zD8A3ZSQlTtkM9KEw3J=Dz|fX}&#wf>H+33+be=KMmZih62R{;aL*1{E z;1^umW3BObZtbE?Wy#-QI(c0Kg|Yip%yKp6i;p#f46p|Cyv=~GZOW=ifZc)VMNxJM z%9Odj25ZPT{e#tJGRNJJO91`XnvD|U-sUNYd zX9-wgG!xp7s7Ko+dW@NRCQq_QOfaV4{<1R{IOs3cB&p79E$batdvFTho~Cm1p`$_k zWW{`Et`##yF^ zohev#SAL*tW~^_}N5Yo!!hn=naSFH*CZBwHl%qT)>h)W*W2DU1j8((c6JOo6-OQ49*eiRf_AWl3uWJItuC`q)5Ysa_b3$ zrq~qm{sVeqO()JEinX)Y+$qK`8(4TSG5{-bqZ9V&oMOpIP1^!o;qje^{sEEu8fEm# zj;37lDNpmi{tNCIq-a5iQ|pKct>%RVXtuB}<@5&Ho5SqGdCfDw2*-EAO5p?1AWj3re4}2~)&a3;!Xluw~X0oK;`1K=Z*g4p7 z46-aJ&$0@lSAamy=a+5IPLeXSDae8_T!shXp=`(?MAvtW1Sh<^ghmgTFW;aC9aScf zm|0eA)k??G8aD$m@gh6>LLuX^=k&brj-_YI40;AZnFVHOylKmC+*}J2Lyzc@_0>#_ zeEzo1T*nn6zg|C2n_`LGHH@08{izqaca*~yTYNIHvc2<3tssB$wEu3DB5EGTH>yi> zb%GH2SKUn~@b`@-|5G>*!H8MxsAZVUILA}l+W2p(WTfwRMy)=Hm{oAU^MC%&M^eoAo)0c8Mv{E-3lvp!SdrjKTb z9mm%FF;WkG1;Qa^Zox90bAj_d^OrOTc&)H?)X zvSh_lE4fwB9E6s_mT-k6&xuv`i?M$(EeG=M@G00|1+jb}L1G~}Z&IA*0PlS-vzPMg z{^v90*JDuBRpR_P!U2^fzee+9RnO(u=>jdc{2IrjA^_V%`PGDh*cSKX*PA%=pb}(x zmx{xn{Ho%S7Ob(nVeNjjXgkHN6kED-nNRGGO9O{s~=EX$@1w@8It9_zeBQo35Da^Bw56!{ReDn_dtFOgYhj~ zeth-*s+J!wVq4ggAMc_8tSOJ`(6*liAP0bi2VfxPynDKidKWcEoD=j~6IKq=3GkGuvR2D2h)*q<& zJ3wD=;rhqLVBe~hAHz5ySov`?8o-esf0bZ*{lfE^d69P~uXO#g zXAsL+9}C6Vrc|w0kNo)b(Msyr=&3_z^K78y_F*S z1G{fu*%F&E8TOOWG#g|2R!jR#U+5_r>Bqb2PXSm)`aVdvtE3IE)(qNT{t7Aem)dWa zlnSUFfq<-^K8p58e*J3gT=MH-cDsB_m>_QKSIT+eD0fYY(Q};hIn`?Lm^>gYzg8>^ z$ghLYQm*}Ft5qYveig*>fdqa1hvIbg$giDd<(6N2@YHv<{pB}2Q-pCg9jsGDfj<5y z6zFH6Ec@{%f7fEo%n)Kfp7?~O_fY@Y498W{^6R)Ep8RUE=-Mngx_KIzK#avH*efgDGX13{RoO;M*59z z`dTk#$*<8!xAJQkt~&j)yaQ*8mcDq$7zh0y*!s=fq zqG=rc>rM%#^{>8V9JecN|M|ZK0W1gjSg3#9KykWyu4On z_%>OY0%}hnAo|zA*kVL%q5EHa!Z2KZ4Q9jT6Cpv|1?XQJ&=z9l*CS{eM}8H(AJo4F zt{VAuY!J(DB|Jygnl;rc4&WPQ&J?^RJQ@HnEpu!RF!yf=;fn!()p zhfFzkDlXmVKG^+#1JrDE_NoH3$3+m0RoDhKK_V(0bO992AA0Ba-*=y z$9^oZTRm?41{rejv$r4zhe4$lIk*I6Gmp;&#`3o@AhPjVTt2atD^xzdv|BFuxCI!# zYUShN5=TCw$z1vPc2GV>YT5oPt=}CR#PS;ndh&6`Muo`7dD0VC%;KdyM?NlKG~^>Y zsxKe?UG3z(nQ}3GKHz$u7tWT8#}5WI7y%qCIzH&*kK=>>(Dmsd0xh>(9AS6GW&(hM zrH?;?rJrE4&NoeY*VXT4;3S30o%z&OKxG>XV&v1!waLabGYIw%7U)1g@zcj2@psTg zYN*g#fJ8I=aZl)+WKp-Xj4$%??C(u4Qq(CFP}KDCN7VEab*8)%iL(HSX5nML#2JCc z39KA%c>@yX?ft%8nwQ9sWoUWGkV56hqcFXO>sRl9eR+p)Knz=ZIo{8N0zrL*y~i1E zwT$L?!>r2j#-YYIGYd~zUSE-F0wI^+uspc6VslqNmfOdPne zkzsuojQf7v+D83JO!5ND1x5QWKS$MnP2l-6nfZnkZeaZ zeEbm#V^s`*eGPVO`!wUSoV>}DGS5K8(kCoW6f~J*56_(1$BPcYp-SSL>Eol%!$-e2 z)QEo)=|Jvgx|Riej4+<`-ug_LD9(y#6&GNeow?hY+aG)bhX{t*-xC=2^_)9!;*424 zd@|_ck7(#;Du*2b(Tz0XI<*(oQO)F(Uzk4rn1gEn-Z>1V2lLxjaecskPom~Ld`hU|ayZ86@Nu^I3^l=vyJe#9jO zl0*9x6B@HJleh>^v)H67x9CIW8kaJcVre%kjtu4^Zi^%L0_Fy8y6)4U44Z+tm@1io zLc7)iOBWH+F9aZ~5I`3o=g|d7y0$vT7SrlT2B$g__Nv3IgeESar3ejSw>lb^GJn8( zN%8`&x%(}xPK2d_o37tRe#c>~`4KOy0`L+9v{Ll(M>O;^b-4|T%iIhDFkM@z<+hks zN-{W=lCW1PW+ilS0nJ$GZlyFXW!}clrOtw{+Adzk(!foZZPdS*(DY4R^Z8$F%^^Ls zIuZEzBSQLFonlLXxaitd@g#56+;E#nHHML?f|)Qb)n)poFJNTG0m~e0X{oWa(2X=6 z6Hku!pI1*vad|vvawP-ieY*%N1{Fi(j?s{rO8k^c#<3CvWOl~PPYTKqsg!+eG71=3q?0%7^{!LGEUY zo31-<7&b@q%sxQ^g;s|?{)mu%rZ!oG;v(E&LDIF=sj|hiI+B48Fjz4lVN|D#(3q9b z#YMQ@LU*g9aVay3hBRr`^SHZ>-0c=OUAH<6o71frs0IqH4t@MdYY;I&OtlEbMYzp^ zq-(2FV~c5ZB!g2O347IHRzepS&?Z^vZgn&+Wu`%Gk~Le6DY?U)ro98)6JLTFbsbJL z+gFJJJIBhcu>JItInC?kplWk6x0YMdPY?(6jqv+_;}&;F^;XQ94&FHG$2>+;{eY|L zN73h7`Y+Q@M=TQC;qb>HTy3`M67_MibRTmEP7H$;Q?xT-co}3i+h7k+9~&ECCwzSS zfeD{;+fX6$jRf_@lNQ*HqMZwtL$Rh(LoADp#Pv-H3G}tao{k9!Nu9%qKo;|Y;F`P$ z^sbvAScJuP8bSX6f;+LH!oEO={-X`o&PAI(PPu{AI4Vl!@KyKkb3HlkX)-uR8wVO_ zO<)ZNRwD=Geq3RX2FJ{?*z?z=43-eP_@{(&$rh3wyg!L?7joYfw-n;$OS#03>*qM0 zA}{utdtf}^hJMUca>G}toF2Q=#n;T`1OInSD9!&ij{8$D%o^3)#|KbBiXY-?mW_004i74hiKfa+F ziG%<@-j^f(g!h3YyZo3ddZ)1B-^!04(TbPuA8S3V{Al8^LNvNG=|4qgs%(Bt0_m73Lq2l+C*BQ*@$J26ziD({@WS1Xz*z&81A6fFQhwpj+pg#pegbK=3s%$Fm zvflH);cI1^SOwdV(Hv;EwZKSgcbUSS4f~$=gRq!TK;(GOd(YPt9GK$2=lwp9iKFAi zSq^{r+DJj~dA}=1k7TdRnqHRTNQRtp^xyNoTjW?8u0DrT=hJ@qm!voBJ@0dv0(0X^fG|0zPO-lV_hXZ}PK#@=s>X{hs%U0F~!G z?{B8CxNWDsC@J&?J2(tZ{3pNXy|VrL%$r&BZu|Fsb{0tY@8V}r5bcug---3o{o8Cy z9_H-dG?(FQIwkCbNHUPwgSJf0tOj zBHh3Dx{1*FRvG?ezE^+t>)3ovzgNG$mp80`mxvH$jl1pNms<&%>%ICXvCo^QfA7iz zdtUz@b)#)^ks#ml{w*KF>b`%UwW0Q*bpQVNs?7d9o_2aGzb9{(w|{>m8{fhHJ@t1A z5ZxwAkkv9y)a`(nL)%~>@j7)9^pJYLe_ymNC2R*L2Sj3aHpSia@BW`i}OI1fI+im}DBo%q&_tIH;`}cLC##;G3L(CZvY2StZ zz3g^vSPbrb`pFWjP*nL+;DO27?rHh`8MRj1zjyR6&4hk$Wb5f#*ws(^{8{7TJ?-B= zwVG(Uf2Z!wl;4lP4dBkW$&}wG-_P_g{bVRp(Erl?`)SzBbN27rdjkD?s+Tvcf7dPZ zi0Za~KXxCp=GIS204k6C{s+&hd-A&Hyo2%^# zJ?wia7eMXl!S_-spH$FE3;I?*Lk7Dv@%VP>*|TAn-d?WA@U<9L%xes%pZ3-p&c7V( znfcL!Te*VF--O}t3u~YC>{2}4KFc2h!$i2H+h@nSg6%WL8dk#ErwB`e9<)z`NVa)# zuYDHcOhZ=t9RD!d=km?ja{sdSDU5&5aXtXI()^oYW8D7zqw9nG`vbcgN`>*S8Iq|7 z{Oc=fewu%eVNWKDe_zf7{|?#gU&_A%`}ZldpZBJJ7YP4k_L}bCXT4_*u^MKS$Fqa_ zy`e3x)@F}V{MMT9b3Y$G1Yzgu?t4R7^GB{PeL&Z@_cG-gYLW=^aM%A2KgPU z*4ProaOh^oC`ft1^u7waNr2ubIM;JtC%rG+lBRc>RRS!3&yW>O2EE3%!Rn)TB37~i zdJlx@#;5m99G~_0`vWGV`TKEu2!D5GB=Yov-k`qKoj$he)6@ESo=-Vc>EQ-$G#%Hf zd`e=7nk^@40F9h5Fa0kTHEi#Cvj@kAHh#h^gpEvDeKJ!M=9v}Bt!mBueU5lA5A!I? zHqg=tU-dA4aWG@+>G*$W-WXG`|3t$Jd@-odoe{1W6X@Z!y;tCZ{T(7V>{2!DoXL`P ze_#)lkaD}}hj;6qC`QH27BJb69I0YW>5Ly&pLRtY0mkH?k%Hr|(DSypj}5-(M|E46 zXwJHhEGiUlu>Rn3*j6#8y*^(7EZ>t?JhkTNk1`_mq0!gozya90$jEhm*sWJC^Fjsl^F=!*(B)Xwb*z^7pZ2|o zg6s29P>Z;{ueRiWT7AOTPq`!^nkHcm<^2Ki?Y9rda0+PHHli`cHX9-5o zGAGIM!l^f}B+L?zLz*g!3*>WlV&(f6-;*^H>3Ez4kOR-!Lga|OIQ#n->ysp8%KQC` zJ=Rx9l%gvqKD}=5yS?D=!lyhA-SU6%Is9G9-RU%cFJ&_77U1us%e~SGYw;94BVlTp z8--=)C(P?&LeA#z!%bfKtu6Sx{5_c@b;sXoTcg#$-yHftjs=pPky7R>8g#?vAqy{O zc^aI~pye0R`EeTY!+`j$?|+{!FT566_NUBwJ%NX23|pm9*&N*ly1Z@@Ge6^JK(IDr zPg&{jb@=?rgI`|2OymC%tF_AUW1a|8P1ruW{hsa8Q5M!VA?wdtLdrT+ggd=4Dt+$v zMt(EY|K7-GYs6m#-y6A}iUZi?es5$Cv7d`dh}*WzAY)8c*#7rM>OhWuZ)B4@N+RYI zeE(skrPoUFXY7GKe=f7r-zwnGNO|EQ$e(gHTdfCyi2FU38jz#>dE<8Q z=fHJV34bVW(ONKCyDNu0-LY#)sC~MacCl`xN3Xue^3_|R_y$2kUM={x4zFJo&zP)^ z`fU+jzr!wF8GNx&O+P8qWuf1j>4&rIsBvB$I+s4MD)3i*(LMfL-@EC*CBAoa;@Z9c z-p#dggD_>DrwulDv)lP&<-X@~G3tr=_x3KhoM+7ApQ{hIg#7QhjNqyo0-+_Z!Kc7c zTw~VzC&A659IiIEDyO5_tEGbBO@~pyhu6mA453Ub7~ZC`g0%E~{LMwlH8+ex z>GD(@mp;g2-SqSl;TEDVd>?zzj=s|HAUOlcO??IH*z^&^{7orXEk0~u^s^guxQF8( z^u~E9M&nM(bbLn4yD!T)a|N`NHf|nBj%3MGcUtR)jnVtEV{St%y52DpNTVh>_hni3 z*=GN~tOj{swr@JKe_vKpo%^!a{g!+fuQ#D^O^mmn>^C{+HLskd=`%sQUTdO{KSHOU zr4z`?u($}<*|5}$W}4&_8<#T8jkqpX2LNVMi@TY*ft#-PJrH=!@<$bShmV^+{)mfy z;+C6X2#bqwLkMn-OPPMeT?PQ=CNUn`3t7O;3t1L7y=E?l3ZSKY-1PBB-1IY5Z)aH- zVebN#t+!m@^)6ryrv?uLUX?lcOfO&1&Ln7r#f2EH)7!%(mZ)OhPXbYN{hO)Q zGBsIZP5cTa#rSyWDqgCOKdT{XD1n)TaXg=Zb33Dp@|D< zOKdG{Gh+srV&hUKMhhF7x!w$~_nUbq?&qLj)Ygx#ZDxASGMaQrCJ-s}=;M!Q>1S$% zt(3S3moW^~>JsI#)6mQ@6f+OQ_|Gyi=0U~j+GdV33Q6@+T#mO*mVh~m+X6_5K%}Ib znISeaL6{-fv|*NFL@K59@kdJOXKD>WBP=e$)eM6Qx|aQAwwSVCGC1s)u*ZI8B{XpX zt;#}o*{^Xa^8^hvNqh9+z0>>__??)EaK+wILf4Zu@S3%dm6TTim)46u{)m}=rZ!p3 z;v(F@Fj_!ei}jVeyhhm5B5h|jRG)67@uwVX(-;K^DGNbu$CD*&Ua*2O3bg5VV2JHN zDCV^BN^cb+m0tSzBfaz!`cy(kSX_kL7zQD9Z97!kV)nYJ6i8p9mjYfpFe{;n3uu!p zbhjNeE@k%SB_One0U~qEFZ_1cMmBaJ5G*BhZ9C9w?x)!Xuxo%z>qQ@b#7sX^=UdF; zB0P^_w1c`9>yII{bTIt>Mg%t9z; z^jrlUN2JnAAAh8me$u<#(km{)OBetrva#5i|YLN-WKGp^Mzr zbiqY+E!HO>RkR(pvq%%n2BdUtJJeeUlPm<%OC~dH9=75$0kr9MV2D`=#ccN%rMDiD zN-ur4M%`x*&wEZHES1Oxr;+IPD-|uN|0`(8L9_xP|VvgT|%I4$zL3 z3E$`0E99PLanp5glQV3_SWYzog;s|?{)mu%f@t>;(nWYGT~vpztxmHorqz)QPIV;g zRfky#U0gtG^Pn@nMc>HKxRg2mYxE?)Up>O{?T_}~dm+j+)2<=TPS<k# zoTJXSF&gT8JzRVL{DKe4aj*Jmwm}18k(hwPUpy&mH!M`aAZTQaLZ6+AWbdl*Gvg1i&o7~A3_UEXE~~nFteZL&tb6@`QOj1j=}j_t(|fN8h{EL> z1jAVAteVz%*KlAB2f{eu+8grhQr4Scr&6^0_kkaJlEbmsJT6NXN+p;V66WQn89mJ1 zWqgI}`}N+?_=Fk5f`B83GZN-pfs=74%jTBcZL(sJR*&mwcFF@=bmH& zTDVG+c6?0f37k*-<5JBNg+%D#`NaI^=L+4V8uPbY=cfjpOL{q!bLniZoDT92JP+Tb ztugnECRkxtwfXRL1VX|4_FP$~0NQ*EPe%c4pkfRik854ep368h3ya$}SrITtvgGz_ ztqKaYkTGh{J-iLEkoObLBQ=`j*mIfFvFB>gfB#T}zCBliwC7H=?;o}TDAdrIh~iR! zu3gvBYX)7S>20807Z&vKM^fl#X}zprU4+#-;nza!xf+);(@)0AMr^8wSlsgn4Y=uA z-1M3sT&lRI`nc)ikGSb4?vxFSi*Sbxv#Q{r*i7F#Q~M_EE$=Em09FVHkkv+6CWCTg=)Kq(Iu9BL%z#AF~p= zxPWFPv){^M*3`I^IpZ^MI*trxgf+lMZKdeC>sN-2T)PIy4xmsT)5jkX($DHt5Cp>F zB3x!c(zVq|*6MCCG1s)SqV*CKr6P;ZO4)7Xk5zN_;*yN7Ff)+leFW+EN;4f z8_nKID2DA5v1X?`H0wMd(n`_CAJNj!O4V4j;v!sa0n@dWns19~r6hw>DG7U(Vpc*I z7tpFKbhlC(hv!LoH6;l>(JcH41d+av_<(3CFnL%q=-NR^uQ~a7J8*zVE49EOS~Z?2rAr)2=_lw0f(GT{B3#cfsGw`vzuXp6_Dcqb{Sx-r&#Z(dE}$hm z=qik)PiY+9KV0l_V1GN9J1lOx?hs+v{NyBMd<3AhI`r{Jg!HpIGc7`K5uR>A(zVqo zw#BqMlEJBtguUu8E1`=EXwxiow>N1V-aqU_bt-_xoJSi1a?i84>9RV_a45hSHdl|+ zOl3f!)uE3+BBY-nQWl}O5R~=ouT5t6BW2=b7@6iX6FQf=On-0`Xc6i2@pwhEoO#f! zbnO$H5!(Zzbg?Hdnk)n6Vk?I$K!x|jX0uR+cRWcMDnUTzh4&SD6p>m9`uJld=qG(k zh#O&X5jK_6k!guOOlRzedO&=y$eZkuRa%6z=Y7^=E-s+OEp)d!8kaH$8BYN0cbQV!Y;n_dtHZGQwXJh4P-u1NeSg{S{=#YbT$closC%uU0gt`x6s|{Xk5x%^a%&0jL&yue8O8} z=IKziT7qYO+ zL)dw^p1c?O{#E#<6)f9qiMJ97-MPADF*qZl3-9_gb{~8XgA`TR4FIk9dEHH}Hv@GZ| zp`)>M_B6^Xn0~6wS0{4FQjX@5nJ%fmeIv%<4f{qL06F%JT1G=APJ<@m**6$x-hv(_ z_6^CAELm&3Z{Ls@wQp>Bnc6q*gkeBtG89$&hMY)aPPK11UvQv(W1Vzn+BYsw2c7e3 zAJc>*iX*PK)!Xko)SDmU;0tHV=^$C>Qu_EK6#7{xK^`UOgXPoH40t-tUVZ!P;h4b7 zP{>>&XmWqbW%xOYZ>EorKK=-peqw0oZ)rt4ORVYA3?+0O$Ctqy(s5h4Ao&P*E?7vbp)10-Er zo%yzyR!1^8)se7Q9cCqTaRE(-klz)gIvNN42lJrX2+nQN>MXFh>85Q2-WN9*Yu24& zvjUM;in=?0L`y#_HQ$ECMR*>=s1#jWDPxOir6hw>DG7U(Vpc*I7tm4`y4yw?momS7 z5A;FDsWKfyFqn0LcNLabBx|`PgRZp^&};UYt?5gENGnAje?&_^OE2-lbP+amv5Zrf zC}&`es5XKD7Gnj=qT+O|jUZ~l#pq(Bz=Un>FArMV<#ME?Z3GN43qhEzp&Ai)1VTnB zrH?;SNK(5-hmF+gH2*()ZyujnQRV-K%?Sb$Sv2lJTMeQZSu}3=Agw-V zJ4OMGpiU5kD1uP|BO(SHG1#<51&k{Z5rQBD7YxWqM8u0AL>+9pePuGCY-@A zXefRlRDuysXEgJ0OrQwI_#6(RXg8F${?J~A<8@U!>8JVpJpO18XDn=kWjOF@CSvZA z2@eN~fZPGAH9FJ7 zpI<(?^Q!HK$7#Ah_5+1#tG1eSH&<=V8N<@nZ-0GPv3@&>_hB2Fi)?7W&6LHql>hgz z>E#<=zwN5suZld@Z(r#*ZoT!}?r+(^`fbzCZ*2Yc96hOH{dVB_)~T_6d*6k@C54e5 z@>P0u@%7thl}Fa0G082mK)g}U&M@$ITZZNZ;)(?ZzWSA>fyVmn*YDJT-e5Ze7W}`5 zryVTe<@H>z&hAZfL!;RSzfsJznp0S@vt)rPt}sTda31bEx%Bzb?qU z-k~nt^lrPPBe%GAn=k9~vJd~G#@9PXzQfl$U)4(&E_s?3?{l4Pe4pcN<9)8PjrY0E z7VmTa6bp@Uo+_H6fH5_LOq1Ma^c)zF@BR#eqTmWNN5_IU6h9g~=4@|}rfFVRrP-Pu zf^8B=?+DvdNXs@DwjtAjeQtZOVH=8qZD?#y25%^SBKWYa)zE2CSEXkwZ|V!8f4tds z&mt|`VEF)sPuIm{d#K?66a@#MabPBRL-96umP#-lz{AnZAHXJ1Jb;bQ4`4*mZYXV4 zXpeAg1>tp7+Cz_4e{J#P2&W|;{$Lpne46==$2=kvK9*1v3_=smeDH?i=in6%7~zaY zGY`iEig1k2;UJ23LupH)y$r|es`Q5ME1Vt)q}Lwdo_0hy;9VC))Ta5E!t%89pr9z2 zg(j$W6p1$!-xi9&2x>fH`tb=F@}Qt7n1v>&t}tsTz7t+&yCVytb2QEL1<_Vvu@@PQCKwB% zKC0Aw$ePE32qt|_Qy7j+%3yOr1jm9173o2m%pfwQO7|3sf~U|N?LoD8L-BQZc>zZE zSJBM7-vo;8H$HbiqG&UewpwT}yWi`o^xzwE4{Z5H_jD|5gXJXxpB|~36An+ygogt~ z!5}n8N5i0@_>oWvMmRIk%)>E(A{^s$IEbR%P}+t=dl`<`Rq6THE1Y&&Nzc-x6JI96 zHb^)vt!UGaql!-lGEJ7ytW0<~P!tS8b96im8d~y7=WBnu^J(^UBAF$jNrZHAIdc3x z2g;YabfpUqcQZ4{Xjs8`X*x@lnzvv}t8LrR2$NnIcmE_Nzch8{wWLQ{L7*s|@lDr0 zr%De3ib4?37?{QoV-yA}P`-dMCiBtE$HWARF)==m38H8-l=i96UXF>^Rq4X(azC7N zn0wkmYuN_NQw%;`9t-mpJsUk7C<+Fl38y_AFcjYwD!~Y+HJZf@%NjIanpy*eV{2|i z(QYVht)aaP$Lp%}%WHEuKYoLUQw!T*84i59;oC0MCKDbG6a|COgwq`c4aIkbN-)A{ zk7gc@2^4E?<8wHOqTNv1IzxLIj@MPGjc{tRl3F92zOW6J;lQUu^AO5}htm;$VGx>d zdc&Zh_?}P+MmU|(%)>E(;$$;EpKOSt-B8-p>#DT(cVqR|pU&AW$j&)%`I_ookeOR@gGb$^Ze{kQ&p?*$uQe_y!PLXY+L z9Xmnx+x_MPdbC=o;rL+%=+(7 zciO0dgPI23xxm2LpD7LOSr}-nzi)rDM)YOe4>h9PYHev3l* zKFb$;D|Qu*>p{m92Q2diN0JHDGi-qS;?}(7g`#k`gy!g2@P^_?gO4X(D-%tx)Bf)+ zJ;2)}kX{tFr;wIyu*?@ciL8yZ4K{2;QLqio(aGQq#ZLquwio0JwtAav<4C%eH{g<< zMOwDOa`FJ5j@a3Sh8hk)QE&hn6*Ivbil2s;N-!o5!_mwq4<=Ad9*obE2Sm|sC~Z|} zk8l>`3pUrD9G|hTJIFn4iCHpOh6A6*`QS+^M`Xgs5{iOBXpYVYZzz5aUg3Zd&S*6A za7>^G$M_r$qG&giwiMdSaJ;Tcd+I^x`GTiJI2{oVxPg2@71QrA8SI zHx%C%iopnKJeqk>CQt-rd=3gxv>8fUYiKWn^13SZO{vqh{_0HcS)r@l7ke+&QVX}b z!ws;^7ySKGetbfPJSZp%W}#`_6=n^^cfv2o7aXhgqED7@)SQYoyHRYnw zqzrB#U+{}asZBLJg`(goGzxmcQ$z9f@B)nPucDcEzX=rGZ+z~4MA2?2ZMD!|cE8tE z=~v&#J@AuW4`wWEgXJXxpKf`o3r)*}cRUmYgV2OC8U_u;kAzAv!kLL?9*zkV;TWI8 zK@{zV(l#90%W%A|O4|`myR4)KMmQ5;8zh|CgU}ZFf+sPpm&#e0@Nl3g7=-5Nco;Nn z<_m7v$(~Ld%on`u#qy;tUFn2ZxtW>p1-#pQ!9(KipX5c(7r685!vRC_ZJ`p3a9I3P;)Z1n?t^^6MPJY1oO^(WQw!T* z84i3pGhQhCznU+Yy-eZM7=vj1DxT(~Am?mZA8bPzlE9 z+)w#}2P+&~&i1Ec9~)$6I>JafRKvlXFWA3NtII!rNrQM_>>;FX~`WWtq3-bjhvNTxE7yQp% zvMzi6-`E37%@=(51slp2oX@oJp63fjbn_rZd$yh$#r}dZssSSe&i){nVjmA5f?U6me&?KTOdiB+z99BJ7G z%aq7R!}ff`HWUTh(AXXe-cbB#=H0fXCA_XmM=QzVpQY~+wkMI6ZSbxOUux5P&u}+e zq%h`@qA0jQEpAM}OA#2KrF)fsmfqTE3`Li*0)z`#l>C~pa zued1FRCfxBf?jBxnhxGjd<8GXU`(Hw_flf6E~;M6)#3A89Z|F!O52nPH%>3hn0Q^4 zelVe)u1g?&SF0C%nMYc-!E!bTpN>7pg*s%y!-1k;5E>P8!5fNC@KOop*^G z$M_shCt9W5P}*kECVq_i)&8?;URR~f2&YE^=^vT{;Y&NGpKODTF>3st0k!FjH@Ik* z6naol6wE-Qs0~Hp4aK*HVlaa0j%FT|2^2vYpMydaZHCg;657k4ysk>SUL^mNG3ib( z-Cp-QU+z94;_C`Gz_=(O(|0tL!tI(2c~DRk%tCXtGt3%_?|@gv#1WG#_fwD7)GVD> zca1&Bs7JxbnDkPm=7ZKeK1+v5d;haHs>@(AV* z4aL{sp= zh4wNWuhae)!l}th+A_kK3EN;94t#n;4B?PWcsNiL3_=smbQm-gUxi9A!WoWc9*zkV zC!6v4WJ46~hSD|_+RJdfPWxZZXGUWe`?*}~v@^N9hMnC{D<1nH4O_#GNcUadc`t3h z`2!9p)~|Q$sdM4}d*A($wHsf*e&Z+$JKlG%e3o(RtzW;TtxNX4`^i)y!Cjkne3 z=3_^%_bu_U%7#Z5uC6xWT%uWCC{O4?9&6j{kGI~Awe8>E6I_yb`oPKR9BG*mv;Nw4 z$Bi0zS<}Fg3k-}dFtBrBps}|7_g847_c;sG3*Lo)UV9;y*S7zS%cEt}_j3;{b^ZA- zT4gT&zIqp>>hHz+bI!7b>n>fV+kCP9Y~crdwf-c*oY$Y!r7e|Gvs<)D=>JdXl8yJ( zR^#i>ZF+qD`6DGIxs7nBSbsX(SbsX(SbsX(SbsWO>~G&b7GDeI*hfE<*%ei3ulTTc z*Y5&jVx!9`bx~H|U4VK}+ zr}>b>WkXc9`EhQ)O%1+6wE>sRBxCy6yFny!3e4z%{(X*D1tIR2Zbow z4W+Ff+RLE4PTMm+t57r{>r6Lnp{w0jU!Q)q$2S;mfN|zSrhQNF<2^FuK|xV43r$c1 zVb)N5KfIZ=#?x<8;I z?W*|;B7LfKPoXGy3eC|GREswhKMXG~!07(|Xy)B-0!8;5pSvGXv>8gmFSB7AEH4rG^qdE~(11*MI8YP}LZf0P3>u1`4wYbpGZ@W091|$QF+PWb zDB2CBtqSdBI9^w!*Pp3y+GQmj_)Pb7E^LE@)6t5yQ!Qtgj$>Lbl|wS&;XqL^2+h$H z1`V6X1ObhKHVlY26yFLjU%(iX(P-vlVgkjO z7@x-kQM4IKTT5s!$HeQZbp5C0pOysUGL-(X2^YCN-X@>ne)onaU|i&osr&hUd`z}{ zaG)qyh9<6_uxu#44zF==46DD`TSL*OmT8|bI*6FU2jgEn3{fQwW1#_m>16mc6L;Kk znQdO`aEPEK?Ru*FJE2PV7m9+v&}bh(yLdzK{qS-GjB%KZWh4|c^nW$o1wJz zh4ykByiULW_o;k7?)7x{bSi9v<)sdv_K)@cluURyP!tS86V7B9G!#D(D!~Y+ie?^; z2^5(L;}wo2S`bCMp|p*M_A(r=)9?R%GKce)xQb`PHduxOpAP5!rc_SLgogt~!5}n8 zXTqQ%(xDQJaAu-e+_|hla~p&;$l)N0c0*~aLVFpG*Hvl!6AGs$D`{*G_q2u9Iy1mB z9Qd>@$1KLfnMF(mgV2OC9|jG@&%sM27~!O7=HZw?ak3eoPc}r+ZYXVOk#M}ONp>bxoGlj^*kgf#Zy((>(8#g8ex=6p zmm@xwa%F-uM&BFk&H8b9|G@pc&Rytlt+e^@xx5^FxN;Z%K1`Fr;7jnx%T zBzFpmf>Y2qH6Og8_&Inv3FgUqG>iF@HMkFc&;H|jX!_#u!%y<=>xiJhaykf~p355! zIXKk_2Z};C&>U??g?K~pZJ`p(ll2ARm_RWdG(JxUedZdoT4`$y?Q!BP$i#j3Lkg!y zR??O6jY}|1s3<_MF+=6cp=@9}%~ zZ$HFE<{F+tQScNR1p}xSZz#SWUS5FF{qxbxFA)$vYm3ftz)o%sY0XF63khbhtBDIhN3c}x&RyP>qrhW2tyysk>yugU$e z)#KgM8YieuZ?HVY;L}dADDRR99}_4F2B8V3JI--K@m--3jBvW6nTKNnMasl@g<~lb zMA2?2ZJnXL49DxLwDJQvoae9}mULg(2Fq~Z(;nJaj!;b|JRB$r2BA6H8wL%<_k>C? z!l_3y561+GaE#C4Ac}TFX{(3!G90g~(lMtfoSLkpBOm9U4ux&73r8hxRfYudC8I!?DmFOk4et>(d@B zEk;U(HOWbmo1U(P^~onHYD<#z$xJgzvb6lj6S|B1$m_Hj=6=kN-2SGG=SLpB%0iF* zDQ7>_xb^ZQk9+h6@*}tFrKS33OkKN3e&orTZ$$dy#Ro#_20AOzbd2R>#3i@~C;BIDzdks(&T!E(bMDT{<$Agc@;DY={%WXNo z@v%p^?P;WC8!Yo1$34i8k2Y*WQLqh-?J9Uf@l(Nv?K;aUuhagQF3l+VC6FEwwr7!+ zZSbzkRBF>N^|-Y2qH6Og8_&Inv3C3h+GMf2h#{`PWj`4Z2gDBb!r7eZ_=xJNLd0mw*)kDu$7#Bax zgX)N&z;f;epI*!B3#puv2@eN~f5?2}U?oH1lvwpa{qK91fyrGnBU0 z&|Ze)byfO~%3b%$9)@m--9jG$(s znFnP8MNr1)pb$m7p|o{|_A)51tJ01N$|s?F{JN3f*fiqn4L86tzj2`^S-3qbLmm_q z1+&l`?FqAn;_L7W@*BHoee09^k+{AF!yf!fOB6#_Otd#__oaKKKy#bSi9v zS>OIO-Ge3=hlz`M_O-7<}40 zR?uBC;bQ_t!5}o@bjLYvD84IHf)P%4G>aRSHE8akum%d}9_Kd>eP<5mHLPc4yDw~m zWjOF@|F=iXjc{s3IMAr*HSYq&_k>C?!Xa5f@o-GwzQ}K!KB#bN(wo+5PcXg=g>A45 z2R_{tG50jWfub-v(5M(hg?K~p1ECU(a7b2AJRB1!PB!E7$!2*CX)~0z{?I;vwYZ;o zU6rnWM=X>F(=M}({6>e7QejPUe&f7OEsW0@P}KK2zwx`Bi~Pn3+G=t?<~O!GaO3%n zy`F8MM}Fg~2N<_req*0)Hjv-gZl8_iH&*F+9O;KQY0lS7Kb&qkm7L#rf^rxP`-}!? z{rtwo&)=AVn>`!D29qrp7~tDsGsiPFeVeCg7--}-u6!c-?;9uzdZDq}jUw@e;=4jI7?YjBXckjZYtY=kVGZ(R2T`;cN?T`W zkDj*thSzETs~&p3!uY<{8u-!|w!w1l2A|%|>jw!9$%KakMZq96M|;Ddq4=Iq2}U@> z(JZE-)}R@VHOS#0igrV3tB3Y79Iva=0|}=`R??;s&QRC}8)J0Y4(9Qx_Q^^5bi9=t zks%KXih@~af*K67hT;c8F&IIOMzffZT7za#)*uIkDB2CBtv|GvL3y2i|C4iQEt@I! z|9&IC@z{Uzkr)j(z_=(O)Af;987GJS@D$pPq8c8Q z^f)Ll!07(TXy)B-0>yg3_}u-7qRmj+#zK49{a#n4OSBWld*H$?+|w3T53&uGmk50N z=Fj|YI3*Jv4ip80(6~Pz1`Wl}ML1xDQ$;fm#{`OSjL+d9igrV3ON)f#byfQPn{qh6 z+}y+Ih;YC%9Qd@^VJUy77u4uCOjM{3I?GGr!x#1Hq$jf`d*o? z=|)J`iX+=q4*07cnU=0OX)`y|8@_;%uIZynHioSE{`_-W-G{`aN5*3%$%~w>ap(2R zpLixg6s0%ojV&tXROvxLQ3wK>qdgc9Zz#SFud^16F`18MJ|-qmjEV7iOb|tzp|sUP zdpRavr~m)hFaPuv!K4hOvFo^JwLu=m>Q-$>!xJ#yvqYv_<7UyK>4?V#MZq#Otw+ML zq4;5V?pcOm^)#vSFRA{%i5s2dFt;sXd`UG$l{Cy+Oa0FmvlQ>$KNvUIR+(+yx!~;1 zr6%b&uXNRIs&s#$DEJGF_6f9$Hxxe(&z(yc;?89anhy?ZkjDX0v>8guVkAIHSzJ*cb&c(p%+TdqD&|Ze)bya#wBb>)aI2{oVScU_i9@Xcg(D3i=Zi-v%liFv97MW^w1T2F-A+K@JB|v>8fUs|jmTMSbL%ysk>G)Aus|TzMsF z21(b#HduxOpS~0^*QCnBfudj#8Wr7P&`^9=s01UNdNlKJOrW^vjn5|=qG&giw$9LA zhU0Zr`jDoEO7O(>_eZY!`daRazsqEIy3t4}GzB?{c4)h@F9&l^vm{!Nj5aq36${Iy z?H4-dVMRV|SG}aYAM~wzJcawH;Tj?ith@=V9e46qgl+-tU+^0U=8vt4NkIZ7;qg_|>1?(>{)9l)-Y+37^&~^^U_sGU2Bg6a|CO9PKsbf#Q2Y zB^cohM>7w{1d2(g@i`ns(QYVh_0V31<8@VfIN?~nZ@UO*C~Sj`F55u!|HpJvXO6L2jWa@Ue zILR@cAmH8R`+DcS(YOpYSIuxtcu|qQ^%VDXLY3|*6a`PA@pJ;K@Syl{P+ox1{gctm zyWa$g?l(SnKcZ+el(wHYt!^1AFB`lbQfEi6i98!Rso`1JkCg{EY}!-1k; z5E>QpVbD^G$M_r$qG&giwzNn%URR~RDM{f2dYitc!k3N+2Q0&Z zPus_CvuT;|aG)p{ghoX>D#RO#Zwr-RgfkP(JRB1!!ZALFgDBbzrL8rzm!so#Rq7-h zyCOOwoUX795)Pxn$p)Wlw|LC6GU4GsQ7{NiIGxrcu$k}s?WHW(^51lD>??pyu3V65qz9+|HCCQ6MzRx^aFW+~3u2>3YB1lL-LN|;g~>iBQ`#t zY>1-WP}({}dmr_YzVx~(ovEpz<+diJJ8fdON=;e@(_gs(`26K&Bc;$3~de_v%gs$4w+jQ`+oz8_4(lK)X!TRb0%AZWp?B@qFJ~H)`N~`_@_`*p;r?sWkBC6{Ugq6$Tpl zzK=XWBYNhGd_)!KgdF4hz)fZ}9LxE>|1AlgR$EcW}yui+mrFR}VGz_c`0x-{)*&f1k6({=WVGLrV3;wcU4` zj({;$hD?u*o%KAfeKufEcpWlVcuuSJZ19HSXYz4>e%t;&ud7n+lAQ1Rv6eBkZs9Q{ z+hEv+Oqc!0k2A+`+fWp2=b6WR@P^WsbB~0oxr6QR^SUa1QrS)a{qBRpc1PF-%c&52 zI_qoh0P~`l3Kb66EJ_C3Q6Yy6#kYk@Fi(Y|SAx2h0`M|>0kBH1HSZyZLpbC+s-^b)sCiKeS~bH zGUP$^g?E^R=4fx2H5A_yiopn~Kbm<^CQwXQjn6?LigrV3tB3Y7D6gy1+zZs{n%#7! zZNJb+s{LHwU*XnZxB_N`KHv{J-)m}? zjtGmR$mm)FBdInP&8Mt+`TO0Q{Wjc`!RFF*5c8UBp&}jiaQAdbmF_7N1y7;zYy{Qf z4aE<`%L_2Ne>j?X_nSb`{l@3+M-**_(l!*@%kKBOD!p}OUi`dK`-<^pHf)3CB?6z0 z|Edd($b^RjMKSj=EEO|h&`|tzs01UN(P-x3m_QMZ@i`ns(QYVhRcJ56@wzIVrEgt) zKtJ(w_q2s6FE>wN84i5gwh4>rW%+L{hC6p>~9HtvGVL?FL;db?Hja3tzgCQP+ZzRI5>?=6%+DfBtWx?n7eI zkK+zJDKBzT&7If&E7OSM%xD2I(KHo^H?aUHaZ3n{>FyFI8rt{)vF)dpj z7Ze4{(6k;1%ZB3n;kjoShSirzl_%A{@>4fD%3*~MMpA8zDruOqmihM|Pc=U68xN2f znQh*=;1~zAq%*Y(h4!u1`gO^G$!fB0Wap$rI&2X$i4hK=R8%kRW?PWM#r+-gMI5k;G4~}p; zA{?*`2Rsdt+j)gdzvNHSOTq|1Y6qvxnt+I zRwuOj((G2&I`>~b?Y)oLcs}hy?RjkG)Aq34gX`zhzWjp?){l$){be z=eG52SNf@bpT#n0b^&jpl~yyKc7{G%W$?IA*Z&@Mr;QposA=Gx3k;mCZMIDVdlm*7 z`LyT%RfG95es)8HsT<`4SAgm)K85N>*t)aBdhW6-6OJ;dpmF9QP^W8apy@fCBJWLf1ScU_iwvF8b z(=y@b5flZ3(5Prbg?K~pt)UW(aAu;JhhqXoIL7C25Jj7zw6%oxG90g~(#{Hp8DVFt zf2^@2d`Lvr6>flWl0c@}$fnH7kOu`t!7MaEb%t3(@g4A*Z8>7{c|X>vQB$*Ywx(jV z=|M()2}T;Lmnt0^wC0hh5ldk`aV78jd7Ne*do;4NH_fBz&1b zM*RRrqGXaP*_g5Bktl&l7seg6RbH&0D4{OTJJTI{|BH$?ReBIm6oP=}=r{(%8;T!; zmoH#mGet8W6B8)L#P~cW?P!%YLunfg?d6zwU6md}C+9@TZl^V_iWY5X#`K6;}Z2d}Hr2Y2;xNHUbZ@R7zi48{h@p6~>Waez#l#xBd6Yl-m7zg9?I3S8PLuu;`?d3Rl zU6mf7{k7f+cf{RvGHiq86AwN;F1Atj$%KakMZq96;Y@@fp}h>p>#FpOC;MsDsfT>pZ-mpTLpIY+5!`fm0>)_tnNHCB4bKN;!{dUY zU>TaDRaiC@KLxMT%JEctPnKS!Tc!8t1>bh1bBJj)!8onvsgj0v9w*X(znnAhY45m0 z56W!ww1PtfE$Q}nNDryf{e`07FErW{R>T{MpM{qrV2s0XH1lyVfnpqt&*Ok7+6<*_ zCbXC1;B{5H=t({f{fxu4A8cISA15cFwq3+6Pry9+AoQn1%56lpJT52-mZ53gNo((I~Q!ZTOH<2v%|2f;pZ#vt^Z#rA#H~0IxlJvooY*x}$#;K@Ls4)An$`m`e=`){A3WxAe$(r;|4&mm&u{+tGPgZ~wB|5i*oI6` z{;(gPZrFyRU>h3S!(q!%{7~?vZLh1+RcmG2@|y>R?Qx`K8w}f!Y3*%pd!}I$O4L-C`*hi%JmdR>(sqm{O8^-sUN)OAlHE!$u@e}YfvM1pm;;Q$l`2cU6aA{zvi z!s)25K7K_<%$!m*xcM=h%N_N`v`L>M)bpGPAv79F<5bq@LuWZnudCAWoPnAEbf&*3@d~ifFLqkOaMo&Vfp}cgFAwPrW!Y|B16UcO!H56aLYl7j3$!BTS>1n4kC%yj? zGO`G^9KAoejybB-yp5UP+W0{@nDmTqc%yk4^t96|@08P4P{rH?J!vzgRM60}Wp)>e zg1gWhoy890VD?sOACUUJKl;5j8hF2Ji%{MTqDf;t_d7ypFqFpjn5)LAWBu-RRoeVB z-tU9y+7lc7{_)tH+C@Y40vP=cnGPBAK-y%;`yGmcS!e?346}yfJK!7ZA3m$O@|)`S znwq62hQ%IaWD(5CSE|%}(3;1Oi@~HTE_XNDWw5#OfuqY&k-o^B4%@19PoXGy3eC|v zs>K_Mw}p(n0HfnOquCNxK8T{tP};gfd)fV7r{90#f4pdIFeyW6-yuf8Qn3%!PG&qC zp{+at^ZiR?IzZ1Cj(5qH#|1^fGBihr!?K}xTcBtJ9K-5!r}7}270dOBFbc*BbdoA* zm;t2$f9YiS^o+RCcgt*Z9N-W^OWOMV?r%+%?k^Mtf1%Mnj&|{e;>X|>Js9Iqk7hm& zCeXMBv;?3*z6=mWo1wIghW2tCysk>0*IrZa`A>hvJxyU7~Q+i~= z!-1k;5Snmitx2Hx#BmMwyfD4ygm^$(t&Ywit*&(psejjdIKMM(5q`C4rAMEDEk|nu zVl$)M%^_((KRpkhJ`wlOUOAO>;vUOsE2u*dUFi?o=v0&+eX8`BpeV!y&CynDh&L49 z0xx&K7^41Y=0jux#Sj^vhX_%$8A{uH^jJAWURR|}>2vj7Hw(K*zq@g>x`p+s+V+Ge zU|cGYY31>Ld_cB5E+`6?p=n*GwRl7EHF))djcml>aK&GF3(c>DCEsqO| zf@Nsp7!S*a;>X}M4vt~<1G?e(INTQZ_i4lwJ{aRLLzOhlhX(wmli|}zaep0^+2%OF zA%d3lRK2jK{g^7h4|c^nW$o1wH#hW2tC zysk>O^Y2r5bTAGNI<7GeKfB2NZhL@x0>(H%raf}@Otw6(iEt3h(8SeBYw?ESTi`Vg zj$w6E&2)Vn4iBSUh$(z9#-W=kY3L0N_)90lr*&~xo0Qq+IKUx-mh`xDJ)S95y1!5q z{DVe&C)&juitm7zBVdd}70rAcOrRJCfzX!q-FvbBgwd&Hr^J&@gxS%LlhURF0ST+>j2d{B(46DcKuHxhH%Y2a`rtn9E zF%F|tNyB7lz+XBUJ{`>l7ag3D+2%OFA%d24^Lt%nR+a8A6a{~wQ80{l@rL4u;N=Jy z?I5irJ~HJbT2m_RWO z#^-TB6m5pmJ`>u@aqzk-9mr3v@_b+%jyp#`tdf|^0=TV zScWF9PFjmM6yE`_ac~T)Z_-58$Ki$;+#bYa6pV4`rAitGLj(TO$?)mWc&@a|Y;zpo z5J5}&vT4pq9pP!#-wMtdFY;tj>u;N=Jyl-m7zg9?I3Q}#hxYE!UXFv; zRp|%(BoxmF#^KhtGY%cHnJz!i{T>NVz!(R}^stz!cgcpw1x3L!G;s}wWkc~p@EQll zu=;D=ReT&?6h|YPRaDh%4e@+D2YN z;e#;_?NmuaHz*CXq?6&({_$MtmD%Pvz#)Q`H1v1(w@;PsFBAoTq0!!ocJYSdTj1pg z7~{|%&3qh8pcn_^^Ee=iHbZHfkKQQ9!RxAYCBMYY^MO>%F9sUpaDkRs*3aQd51#n* z0W#HMbvqzi9v2h^%h0s0(^|Zt_!_)=(J`$4Kz9|t9-a|K2M|;EV2r~cRnjmT8t|7+ zhELbUO>|IZo8th72wKuJ;%l)XRl2`W6#Romdq3LgIZ%8bC`Z5;hv8`E<6r{CI2fPD z0a3IWN?UJeFUP^_s`M;=7_lZRX*YfKf$hn#4K7GliccSmo*Iz}4+n~ZL1yw4x(r`l(w;~o%+@OuOhv!N=N9wx!CJnJFmXS_1(DIugIL; zgD=k9AlKyQGS>}vdgg2v`Too?S5EKD+#uW$nd^poZRRYe@UqNJD(bYibE}kSdwM3j z(=J9TI2)V%I{7!>(>u|NH`Nug<~w=^I;KDueFwU<_sO5Rp?IHs!f6`i)%WoCYj_FE z>yADJQoQb1w7jL>%C8Y=8rb`KKaZWX`rjg-Y0)oFDaVu zlMni>V&TLv_vY(suG2qB>Zb3G;V1dkcU*-W)cfQg^N!)f<@d?=(W|#*HOoD)+yl!! zu-pUppa;rdgiw zt=~|+YDMR&HQxkP{e8ZVdN(8`5k1#!}R&=jgvq^nTn^&H+HcPJ?hSH2} z<%$kJ_6KUj)_AY1Kg_r6!`)i_lua~^=vj1Hvg96FanQ#3jcZQnJZUx9kWHc z{2!Jq~Vyo8c{vTvIi?y z3^Z!a)hV<}?wOAR`8)_k2VHsFoi`ubkbPH{UBx7e4(6N***AYEJGFjbD?M!cw^P<( zXP=CyX1=S|T(e4kt~o8Vg{qyTYUJh?+^X@eUT5q6I2eb&MOHd9zo);@VLhxq)Ra!1 z{r@`;mwdwBL&3Y8->YxY8Mp4zt>tlX(bp_q`|YxHVB?mwL^sSWcBPO3SryJ#?_y=(v?0*I#!3e zHn_$qomkjk>f^yG6wgO$>)ZCaDxH0}Y`02I7S}oZY zD82<=X*@?vKIqdqhxhid*oBNNg0W}Ga&~IoYt7?>QJA#VsJq!NgUtjU91k2+q`$9m zkq%Y5r%)6;g~roPREswh-vKW#!07(YXy)B-0!8;5pSvGX(-zv>Lwni%URR}e{>{6; zKaCzl_qWSnIxIF+4ul(EbU$P|JI<*t8StQ>D42yNsQxf(D83I~-S5ae^+TV`-T&ti z@1_xC6gU{&KT4IFPg?W%LKG&QdWJXZmceHC!`bs5k%M3FA~jXIr%)6;g+}!-s>K_M zAA*+`V03>yntAt|K+*li=k7-oZHCe|7~0G3_qrzV*5|h~A(C_zw!w0%5_~%E z&o0y>6CMr}1%uG2mJ>5u#`_l(w1BUJjAhRq0jqxq2_jPyB~NL#lLtp(ywVjrKa)#T$yR!OIaa#$h;``8b$B zF%HJ(aX=JphSJs@+RJh9x+>jpyZqBQ*q2u~zp^n7m!9f=kAx>+j00ral~t>BkI0tC z1x3L!G)ITSvZ44Pc#VT&SpB7LI6e+5!{`KJ3Lng`K&g_3nb3g0bTWMUN!(dSWwtpE zaEPEKo%C+^cTAP;FBAoTq0v5$cJYSd$Kd4%7~?P=&3qh8pcn_^^Ee=C+CuwiXfMaX z>#FpkKl(WE8CW{xfW|mHEuM69;RzVy0GUpSSD+KJ;c-DxunbLHDJ&a`pM}>rIG*a? zS-wh>O&^ELKj59!wuQtLKA2yDQY8)DpfunwoeZB|9?zRenQe{(93p5*gRw{XtejEUA&?AK6p6- z#yF&C=Hp-j#W)zB#{p5a8A@AkXfMaX>-7CMStOnh^vHg%XpF;7mi*G09iD(O4v^`N z_jz1%vgL6>QLqe6T;pNcQ2ZFY#=$YHzDSc-ABPJpW20e2OyPqu4l`6q!+dDKUpg5+ z?H$jRd6{jF0~{h~NqTaY`oprJ_&#`zgQK1gSbc`( ztUeB(BH<*l5yTWe7~?QXl@3jY23pd|@abvsTz#P>*Il4kl2HgYkJB5Jj7zv<-&#avZ!)|NlnwYVU-Pt#(gm!Zuju z3Eyw4x(r`l(wnRUWVg!RhmvZ zleoTZgm-&+aGi|zip<$P_#v6&Nt0SL*AMrf+!q?N$Xha(v> zb=P|PEw1_U2KQS$Rh!61xI}Ef#ex4CoQ=fIO1m=J3-()#UaYR$V%ED(?ecz$!v|D# z;_`lrGT*#RFZaN54=ne)ReU|Fdt2O)5Q$$Z$B=mc(7d78!QM20KXZ`#Ff1mYuEfD=jSTE#F zx8@O(vcn_`j438$8jhUghz$B12a19*Xj)GMZz!JWK*O2U+Q6Xcrq}5o1-(?Z?M2XT zVS5^B*#^TlWZKc*%=#-Ww>?_ehQ@Y9Yx!a*ekyqDh}Hfg$m^=~SFN2r?n~b3anB+x z+hFtG;N*WwPHo!!Di~(XV4zS0#y=(Zs;Mpxk2e}aQD_Wp@18FmQ%%|_ zoN8g6DP3U0srs7zS9CB>pfGh4$!adq?GURoed->gl=!(yBr4zK#eAET_`&Y5s>UG$j+>$50duLK99q zD#RO#Zwr-Rgi}Q`561+GaE#C4Ac{6aX=@GbWjJ0}rT6_@;q=H#dUt$&R14c+V~j4# zCl0l#UAZ3Io|YjG3W|bRXpVM=Swrz%p%{#yW}=w~WdcP|#^<0AMZ2N2b%ypbD6gy1 z#Lwj4T5V2BH`H|Zi0{9Tb*Fp74KOZB$h7aJetcGjJSZp%W}ykHC(Ig(ufyvm;E2hq zwSULgTDyeBL1c7tg7G42h$=N7v*xiS2qt|iUS}p5Y_2xpxI|EqcD>j=ol~WI3Pr(F zXjBiNTD+n7et3BSM)%K0Gw*&AD7xSH-2I56%~0CNE-xA{ z;>>ydS0g-A5GYEQe9yIasM3Rgq7Vc$w&$=d-cWoBU%(iX&S>UiVgkjO7@x-kQM4IK z+iYkr$HeQZbp1^3hpXS_p4JFf{Q#Dy7<~F!pji? zOj%q@`G3)8O*ZmB6KbTn_!vE_Lg-!T`j1;Lcv>dy{|4jM`+w0tJR)xfJeV7g?L?iC zmUPxS%+R?0|F_wD zqXyp9H1P2S2CmX)#AeP698ef&{Ho-3XK6&=!u?PqDp%+nz5@FGYgM)U|84H=0(80E zat{HcOzxKV&qwKH!rzXq(+V?lvVt?%q z-zcSeW{pdNDGwMc8OXHV^?tmE`{dR{0YyO_G_A*iHxxe_d_-ZX4X>-x)N}MeZ<9cJ zRoI?FTDHNk4Vj)rR!G`<8@8b+*oNllWblUKCxQ>#btb)DSEWasAlo>SZtQp6vq;M} zSWYJ3)0g&hp}vL#P!t@1#(|mO4aHBxOC=bS37-BGpG=rQF_|zvPbLsWyP>pIY6c(S z*y70Rss9ab7dPW!+}qeyeN^%0h#czgrZ;onxpf<8;YNUmr5|g8H{Eg zjtLau7@xyI6zzu6mO^_Oj@MP`1$r=g{@}TXyQduy4tUr60kvr+rsG30a`DV?rXw!>~MiY$u zK_68*G-SKY(NMf{JwOn2U_5(mjQu;3+f;dQdIiP<$O;UVzd4 zu731MRQ7{NiIPIW#L-B3!QVB*l2~s6)Sk|B!jy1^PAc{6aX=@F> z49DxV|L;2rrzXAWYjH8ukd|$*30W4U=W&cxAyqsa z6DUqLQI*jXJb;zKms@{jM< zTW{~CU4ZJTF?I4H>+Lt|Q61~;4~#r zyuiTz3k>{Li}q}wvEF|E=^D^GwOeGp_4dL4tg7YpcClt!Cja;Jz*5)8-+%vx*2mXs z4R(6_W-9jQQx^|myoz_?%TN_^=ANdhqA0MM6Dt7=5 zmEWHl+x-62Sk}k(2yx-&_osH0_3_F63jE6lN~s<(lgR6V1;$JrGVMiA==g|kdH(o= zqTmWNM<;?e6h9t(L}BY=udCA7Q}q08lR$b#*q%mOw!yFsnI29;K-xwdwxKB4hURD$ zyrKB1;KR19kG-x+|2Rsv`z4UR{%Y4fi?nQmcU^%|o3=dLMR`DY7eG;P0~$9Na}F(4-!zm~VPC?_;eDH?i=isFnjA_YaG>b{2HORlG zuP@Eu^Rxs}v>QrWGT}ITSNku5d0mxWtvR}{1zz6ko_0h~U^&ZzPyh907n+g@?_($m z2B8V39TnmY#kYk@Fv6*#Sxg$OK{Fg{ki$U~ZHCg;8rtK;u}p;5Rp|qI#`@Czy;|hp zOD$}JjWN3H(dO}~b~HU|NfZ0-Fl#8qU7;9^pk@{XWdh~Ykp?*^L8qD36wMsF)4z4-M&!%LvtH@(^@bZ@T$GUMpY>{k_-AFvM+%C9S!j;-gjqxJb$HFl z95H!qpL(>WW~nPI4kDwI6TI73|J6b6Mv}qi(jATo8YlJb94Z! z;tj?3hZo?YGj|gxy5IQR{qyEPbLQTcwd=mC?N@eAd0myB{`K4gyK2IUFH>O~EH4rG zwD*%;h*`Ub14Y4oXjDvwK|}Eqp%RR6TBDg?A|_CTV|)$=QM4OM+jwX%&nB;{(&3jW zoOW4B|FXY(Ivut_!pWHk`1GD07iyCU4+n~ZL1@CM!k}UE)&Gh|+k8Wp{$5N{~HCscwFPJKZ*CQyW9d=3Xuv>8fUJ+zmj<8@Wq^K1DA@RSH=C~Sje zIPmF|7{VTz@X>*yU=W&c2E(AC_<>LfMmW63r}*fYKyk7epHDVKt#d+qe`qhm@wzG< zb_o}yo+tV@I(B{9qh-o3)tDvZOvI~)wQzmmMH(N=MD$60GZV42{KFZi6#0io?=4mL zU;g1sqZ`jZ{NkM!dc2}P^aaMPmw)&Vy>nYM|L~;~HhbBY94kv4Q9lw|Gxj_8#S<|Y2Z99h?)le&5|lIX9nI-7--}l-u8YC<9oOXY8WLs z!Rev*{l9vys+RK)|9h6)%aQ(H?181`H~!<98_I9oybG7?$|e6^*S-86;Tp}ObU%rE z|JrRx;bmIwB~roV&rNM}5wPrewmyfudj#nsC}tA>L4YTc`vhoGO}m zI3`epV|)$=QM4IKTWe@9!|}Q*ec=Ly(<3YCEG?bzr53iq#uzR9wBfn2T$q+24+@Hc zS!fh>hgn1MU7;9^pk|_3EElXnGihTDa!`n(-B8*(LwgyN*H!69=PMMOg#LM3-H3c~ zdZi|3xYZkOfMtH;C{40BJ}W~W6ch!s&>Zavvxeg9@C))AH@{3hT2r&s6BY-QrW zU)Ik0V7>gtE5DF?;Gb8zr&D1YEH4rGbnqiws70#0^G$M_r$qG&giw(-zjo=sj?rT3qwaN1=hy=NcybUJKG^JEK70Z1HovhZ?!)9Va(=^|U+>d~ z8$adRI~qYiQ3wLsPQVCa4pdMnd;w!jI-{A7i3t>AVtgJGMA2?2ZL^`h922jr(x1-F z{ctl2KuOm)LG=Ux%To+KZ4xW!E}8H#fudj#8Wr7fjvI>a3YB1lb3f%bRy4wSWQ5Zf zw!tzS__V`kBj!dpwIUp7!s$hY!ZQ@#6Dq+7ryk9GbWGsB$Zs5QPQC%WwC0`;g>A45 z2R@w_G50jWfui6(G~o=QLcF2)flvuXIQLV2xSCQY?OMC0?$Na_*-oNqu#vT0@dgM1w+QYc@@*A5ydjt86A83=F z25d|Nw8;L7tu^0>{Kk{s0jV44tVGiR#|6hDF#V2)owUq|SwFw=){PoC-?K4%mT}Fo zrGYj&3nLD&OoNC$i&8D z(x*K3pbT~P@YK=S;0?vI$j`27T5tIcudCARR(h(pNg%x=Y`4UG4-DIo>AWM|Hjiqz z4Miy*;I?*Gw;0N{FVP!4X!#AVtJ1SyD%+z{kpA%u*WD4e!E#0cpMIlGjyfk59`#%_2I} zew*k_@?PC3BI^z}!01)Tbn|08s1X_Rpr9z2g(j%3Fl#8j6J85cM@+t0(=A`1UKBa7 zUSxC*fp@!i{zXOds<}WNwdiB-{GLo&WP7aPDHH`yp*h+Uo*Ig;hZkUU|9CX>?l*y= z`;E`tk0{y=rL7j)%kK9&?SJ^BcYlBSw>xjm-G7#rR=719Zh+DKkm*0~xYdqN$dGqG z6a}-;v>pkwhT@0e)%}iamcLf(!`S~27AKKW_k+>>Q&g$>tTit;%U92GHz#GV+5K=# zpiq$xd6bJxsnR`#qTnesswYs5=V59blow!he-+KV`%R$ee&ciZBZ@XdX&(#iW%qlX z_CI`r?vEeNeucUTa$b79#~e1g{qIEK|1 z?v)4O{M}t?JIxh77(aN}5gKctG>n@i?eP(xYRa)=ZbnRV9N-uSw4`?&<|4CV++QdP z{z9Xm4HR!Ez7<}MfH4jUQpLx?1d4GmK92*UXfu?ymf*{A@VY8pIGQ`*oZZ~hKBQ$E zEN`mtY10^Dd)8+p|Iq??zXWN>D9IqIQNk|L-c2kp(PW>BfpM-4j$m1HTHv8Y;dXjXd zR~#JS+mA=T;2=0PYv+e1RiHaEy;k?f_`TdgQ2bEvlb|}N)&2{p$kY6PMC+uc>dqe9 zywPRJss}g6>1olHQ<)HV11VY>}+d{~bEjqcgx zTf?YdDBS{`lGU*^`S)AnC3>GfE&rqs9Z+t+{H*f}jGF~ydi)#wcwNT*Y=xo_9WXjwb2BuM09alj@aY7dfoSb%*o2~B6Ply;i_zi@#WO-2 zcU1S}&exCHN4Ic@o|j?BxQ=>5xnD=#yqP^WK3_+OV#822XCrPKl9-%$U6pRzL8s2m zCT{j6?i;uQ#m`4CfGtO_K(ke?X}L^2rl#5^r9*exxzaD&J_1k_&c#vU2zo5&tM&MX zWYi}`q&?^LaNz80ZB?xd*Ff?4_gshI8yzMx{^#(*vvnY%Hoeo*D0BMrG7{8j3>SK%0xS7C#J18@=v%?Q>&?;W$U6 z9}NAF>7j3N`(q9LP!#k*n?72@gVH|=s<#|tM8C(BQzmT4w>|0ky4U&Zr^kg4leCfm z7|-FUP&gY3IW_2h_%!)6_ibEWG@rw8h@d5%`XLvYP^EVd6a{yoad!gk@F4D+m5j~n z%IfX9l71K3x3zxAzMFIMIltiJEMc{6>1);uMXIK{7dH@BE?3ZRlGwhYCm2(Y~7y-xe%+w?EU4no>gN_sw|4aLvF z%NH;%d8;Zed3e9%r)AoE8j9lg6YBvfYY*29#kavrIT*^Vs!$H^%4bEnawrNt@6Rj0 zCezW|-*%@uvqQ%l_mZxB@pY>=)AcVYpO)w80*YMZv3hsU0MIti5B7MY<_90v`$10z zCe&)P)1TXQUY&T=oY+OD3)ihWMgK|eF8`G7#9O9p7PFM!o7wGcjVJwt8tJ|{Ca{>- z^3Z>scDdS|XF#{I^c&l9r%Miw)1O&jI^^*=KYJ*bS(<%GpZQwC)(q@(g!(~R(71kz_WA=iW}vlc;0X&1ynKOyU%#noppl|| zPrn9b-N_tTum$aP54BODj~5@6VnVk}F89E44=ne<{nP{H`fl|t9gF|J%az)Uw|1Mq zuh~koj#hHl-IjP=quYCZ^*2>Boet6qD~@#4RolJo*Y@o??3B6~YF2OHx9%4UX^H;a z)qz*p4fq~Au+)713MF<3eDz)azv#0!%aJc7&Xw9o(Ow3rN3A{W)?L~qEEd(%RI>^Z zvZ&sDiU*k0uAXY${RjN3;IBS79&%KtH^~!A`J2$%ZKe;8Rem%pG8itg<6li;|4lT6 z>&dK6`j@-fE`k$lnv+NPQ&v7u6G@l-%*-pad>US2PqA_~=ujuljV^+2|U*Y@JIi-=-f1U1A#a++fl^d8J z)@=H=&K5?+N!vp;X&hl>g0|~#%n!Tl=*krx>JN#nT+wNSde7SFv}T&zYpSdC@z@d5 zX?(mU(B;#K-<|fW)J)l>PX7scrIhrWpt3TCn%8Ri!qA{x!^L5{CwYy|)lF#6czxqw zjn{tf_MtZ~HFuumY&-EPB5e-dB2(odf>BbeLs)dh2-S+QKlEtpcNKt|!^{99>FIp1~xhPH4v#3yNPbc0=kaoWR zf31DaJ?GwY?%bJ4+OOZ2n_uRf{a$=jQQL!ulq%}w+h?wsMOUTV27~neeroQ?b*I|o;5)GneBT?=R3P=9HGn8FIv~6 zIKwN^o;$!)L$BO<~1 zj7K6({)@MGqD^k7=GWg>V3E(bdJ1wxqa>O%ZL$d0%0E8Ir7Up6tVBb@6)|bpO0;Zh zt4S(v^GLKtm1wAQMSL7p5dn5ZJkGAz_uB4m_dNkdr}2-)YamGIFt_yYIsoY7@>DK+ zDNa7`n(a-@+Z)h%#YvJDAfKf-$nI!YKKcCqSAfC*0t}PKtI;uzb2Iwqjx+8^U^JL@ z2cDLbUzBn=`AR9|>_YRs{h zjAhJ4(Bi1?Wi0UW1fW1C|B&n;)?25cmMMp!+4}^v*>YCJd`+R7qbFAYOgm~Zx3ma= z^E(wli7QnAZMlE#Mi|imNEx~Y1ha#s+Omb?p+MoQfr7fas(S8%I5@+O6r!!xK`eT; zj>z{R?Ots{+raorb_b&F;2{W4U(WH&rA5x~JpBVOmAAzcPTsuqP^K)(A_f~gukG+! zd3GoBm|h?2i-*;h<`c=UQy+vi&S<(as<5tgx*|c{@yyo0Yei zL-<1W_luCXN70^~FK@Slg_?M$Ft0t%9qC4|grdA{l(YbO3%*8G!6TupyrtM|eJx0A z_Cyb=`z<`yg(l{OhVt?aNehsd0u8bU%FB)rCx%@9wHSQW%UJW$XYV+qQ2OW&5Ai!h z`CokYgm2D;!?0oN%s(Njf9_Yr{EK%E!Olx=*NUBg&FkLv&A+UEJ>q>Anj-9idGo7B zd)Yh;uqd`_Izx!M?P@-o#!@h^#2aSB9gx1N-rA^EHG~|09A}&s)wzskL z3KPkVWU~+~4I#Jo!BV@JAEZ53#kHoTbj5JVA#`p_IeA(QsJwvfP4uj*_h5stk|mh; zMZ&OXTe1Pi5@wyjB=gN!H6-wsFd6W&Tm#!xT!A1pW$r*KH{e=Oom=f17IqD4*06@~ zV#zc|pVG_+*g5wZ*p3mG7@vWy61$qLTCidbY(IyKqsPEjg;Ii9>D6{GlU^JYtyP1~ zE=NOkx>?o}g$-;y%@5^AM`q<9P@i3mkRP2SX#xBQIWfCJ_)!a#T4&CIab?V{b%@B9 zd8dUb^fbv(p{G*pQRtJ5_8Zvlo#ZO?F-e6|jzVI5s+JdEPs-&O*lOVB$$_nwrg}86 z&6Yje+OkE#mNxOnp)u{HdW_8`Vve7!zP?av&m@iI8q>gB)<^%p+t>cXMqPaW%N7POApgrzw_uA%n0 zow(oxq4@1_9LfVkee>DlehEhfbY`PHE>}Em@UZ1)Rv$kPE$qwzyo{aC>c};ne}=6n7a_&!4}Zek^y=?%GBomA^W@u<2Leq2{lUV~ znSr+Ng~8W8nD@FRo1$iy!NPha`x4eN7DZYFri6qwi^ZWgJR$n2s_AhUCj=walc+R+ z@v2!YN&uN?_vuPS1EXo|GWv2$V!E^@s|ClsQU|S6)OxkxY^taR1k$4g#~m9O8eAUp zjIE3Z_HXdL*3h+*%D>+n zd@ynV-1#hlA71amBZmLrwKVd4m?+!5!;D9xAC_$nt&>q@Sf&(vu@r7Sw?kqcUYwi>g@tlxcN`EuyuB4kisUreqz(My>M6CbjyR02uv^9_!0v@ z@=rg==BL5z^-07Sd;?K|h%u2PqU|9z1yIbQGQnHf3m%K!EAs_!w%i}-p<4_2$L_*L zHsq%2&2mt7`H1(rnS+2bM@wFgA0kI*2a>ZW9W>>%GZpq2`uH)@&=o$Gnets|=&fzb zu(C0El|@mR&Fjs$XSQa-@+9;Ap1m>%UR6`5Sj!(SH&xEq{p*M5vPRvy(V zSDW@HLAdHjdxF*G-v`dbSrSj{NXsZQ+}?)~Lj~%>$T$9|9q^qhld)lW((*u_R?n2R zOaYqo$;R)e!6gmPY+E+UCl)R+zt5J9Vsp(Vzy!+HAZ7ew{1HlFh=^-6LtxAS4y`Tr zM%34iF;;bq-m59e=@@lcVi>fUY>B^XhzSoo&9#LfjBB&kj+y!W{kV`RzmXv*}+VwdCk$n_;S&>rP;bPe1z?of0b4Nf#qeNzh5=kDp&bbbxfHh0*3`dgF? zumtSFqrd5@+#CUSX*B8Df8)Yb*t@n@U1*BXA9sUd=Y_%7exLNmV`L9It3SqR9WWEY zuK;g|{`gcEVW$4LcpFZ3DwpZfxsHuVc3-nr3#3&%o3$=^Q>|AJ+RR!}*Mt7JSr(E! z{qayQB-zv+{F8p4(0*b=N@?)a;5`G+dI-)mx!N!G!)HSE%Qf;Qrmsm-WPo}md8tRW z8=6-r=d5~p#5Y_{E;1MUlTj4%n^!~vS@TMRRGl#|?TIc}sYcE%@(i*PaxcJti7HOB zlyrRK0XQ6(T&u!G6jJxp6D_m#=rDAKk)6Wm*_*7+;HB5~(Eo$o{!>5Z@~FuE!^NV< z{sY%?V*n9K`sem)2r9~fOO60g$p=C#*~KtlTqmM?j{u@BIf{r9p(s!TSB4A6>C64N z>OX$=8Q(|zEZJlI;-|7m{B)9#PCGIWKN%>D(1^F=u|wd~<`~=a~at{Pd3h9!(QG`Xqd} zNB#?@+5)Z;#(ZKfAHI*|u^SFGdHL|{zXkMN^{q+RIaec0Z|u9TjB|S(xPBN~B?}y! zzom;LfERzutII>z596^8&09a5&7nM&ezyMg!|$lEZCpQi1?k53K4HM4pFv~2jHabt z_?w)d`8}#lG3%jY4=!GDpOE&{gw{)3Zp%5bU^iW9)uz$nw&m5kfdd^q8Kr>n}$>oyR z1`YSre`5VxVp{Udm*;q-CK!0{e0k;1ep+Qmik&aJJ{LA$x}GX#zBot|{}5lJ7?I*O zb&{SN z>6;SNlW=kGBtl}vr;=z%E1TMC@E*F!gA_mt;u8RJH+*^;Z>9IIW`QL6f87IQ9{nHT z1u~mzfkZ@hrd#?~N)pWcXh%hryNo{)esf;Z3Rs%A$fOTFPg74`wmx@t4a>4aOT$;~!A`;dYhl%Lv zN}{(x{C{b8o+q)mQbC>>w$Z=~0O)du_eQ=Y*-GNf4zvMdcw!K8EhE=Tl5qa;DcEgS zq-#iLBRbW2CeN55KRDf5wM^gr9Vlo^#TG(8mliaX@^@r z&f08^8&mdi)yx(q*-o{^YsRXB&$&E}H1*q{X|b7qf@5RtYP?4{Wu`z4MTUh-x&Oh4 z=P$FnXVvC$xO~VK&|=g~bS;n;vX@lNL)fe;A%)oP9>nfGDdJm}?ky~VrTd;QVxXrl zXQ%w#5AFXvmINcH#?#Y(0m0kGoRp?6W0_iNFuW2 ziSSGb;|?`G1rf)R(9;#yFL5yQP}*W9X6{j8Wqq1RfZPXTb3{{zt&3=*W>1*S&qYax zzd9p(at~XY3PY1p6`IBr0 zLNZ<43HGly4ujUSalPTlwEyOFW_Gz6>N7x{;Sm}h!K#GIR}JKd3fnKB;!3x?^obIA zUgvr8pmj~0^SB&@?#^SJgJg3_^4BQeu=8m3!xY~Dlq8Vh;(QnwE+T8{5DBp<3M0F) z%g=^jen}klIOWW(%j3TJ)YDi5+7CT71oQ{c1t=(Kfq3ocjwP@{L_WF$h6q}&0U!D* zUY<1nU)KS&x8@3c50GB`wyr_ZfCU2tQG@v@l|IE9`Sw{$IG!cu2v;#ju9UfC4Wog_ zIv^2Gz`lxt>k;A6%rTk;iC!kBOqJAwD*)=+1|-_bHS$k5rmk;8BpIrf9iNo>Xt9>Z zC{v+n!=^Nk0aN{%H2_`p=<=R!7X6xs|LJR5fM4Pzil<9bma{@Mq*OF&gn2Da(2*Zb z7%Zpcv~2Al+Xb8L1a8nMHf_wU5ydYsW@B!my$RZa2GG?_S8PIF?Y?_IMqK%TdZ~Rkf%J ziWb3&yLU^WTm1z)%bSY~TG8 z$W%$p0qw)s>phkwK;0e=<|&La&E3)Y7*@G>nfy9;oF)M`iy^Epwb*%&B+JjI#@Uo$iRNm^OS zJffNH3%??kYOVtd$K4W~$LZNs7qk4<`|^T`*;O+Tz(!PtWuLh{Jxq-@Tpa6;V zvVUC6tGwo@?BrN4VVMb`0#E%ge0);t8f)@2Q5_0@{>L=GhrWuz&p`3sAWB+0AagQi z3iah+BxLPtiOwIv(Tz~x5Mr$J6b<-HT_E`|d-UB=zyC{8MuMZ&w$vG|UsFOVv?v*V3z$+NfCx!T;NZ( zy7R9!LsILUXEP*4@hsQ6pS@E{HJT^JYqg)-c~!5aejuelayW)9_FSGv`E?u&^E^HB zmhudpzoSKlyz(e?X+pL%1`B2nm->~}-eNQ&f@qiESa>Ay=?4TgX0=M1p3WP}Vf-G$5WI3onZ024CDdv@j5o-;>{{TE-83>~wt#oF%Qs<4Vs3OTriC|Mt*v-g9x(4^%+rOxMraa zGj>4Ja0oTJZ%4XH_=Xqwzw6X4q}eDCZu=qh!2YBKnH`lu2rZ`k^K^u1?R)uBZJ$#u zn#+%iY5z!Vzt82<;!23k!#=kEJRM!Q`Pj$urNOR@GJwVO|0(QCkrn>zmY(S`fd2%u zc95FvA}_^>5HVp_byvK0<~EUbWsyVdG9MQ&POAdPKa0`^0lc25uS&rUiLr_DbGOV! z#mgzB8YhpmQ6=WNVE`ZGU&9NcWwljerie_jfd`mDc(!QtU2{bGcUQ~>IJyS9WGqDb zEqV$qnM*>R+1T@InEWd+ea;0NsB6n`@dItf+GlFa8AXf+?{A?zMDKlz@Ph1TU~qe% zg|ReWr^DKdlRZ&C_o#D8*pn!JvqnhrotUmzVKZcpQ|@v#X?{Ra-h;jo4?KI8E`4^w zu!z|{HU#EA9~1EFSD~X&V~*h7A149MoafZxMSwe>3h?7Ezk{l>{CKpOog&JQVHC-l z{8~d66`lr*A6m?}#In_c#FRh<_$${Gn$3=X$h2qdn!xpwFYkQkui1Tg+uz05N#yTK zxs#(9e9RDITE?7%-5tS;xqLf)!<|lCOG06kW-*StOW)(`PQLl&L zLe@f0fdN~b7t^1ut)dBPqWJwTTn}7%TkQDi8VpR(GuC|dt;dp_R6+hZHC&_eE;R8^ zaZZJP`k=?zX7o4QrD)3QCy>GlW}|{)|7Wi)o4g!v~ZcGfLPp&6G#Y{kHT95q_}KeM@ue~t<*J}4tz4At@i zU;aZKT&9Bq|cQw zA6Wd{SMK6Rz7d(OSUH-6P**j^{1r=!_OhcoW`TLPd;H=p@k;KER_nVfZaj6H2&Y2?elJ^c z3}&(x5-Xk~ClBlzVs3)W5;8-~W3_|p0kBxuXUj*>%w_iM2tVcEd<9%81VtO77WDc) zn?FOg*>E70Eg+JK<~x)n$SFOxIlC*Cq^Qk01=qr7OMJTRz7wG2_ZSG1JP}^ZFrens z`ynNU%~}dcWLk@Wo|EMpe>lFa(?_tLL97nO_Mg7nEoqGUsO&-^9~!7)Ujywt2Tz)h z%FdBUd?JJc0rDC1TOl7(Lm>Ht@;9jf{H+53dFV&T3iQJ+TKYM6Gnane7g#GQ_fh(( zGB-f(w`0aNv0p@ulBLiNX@#^SBnjH#2ir*%%%Zd-T}KXi0#zIihj#dGny|3;(N3bf z;^dQaXs4M#VHEgO+Bua*Kh(<@&`v^V2RD)88YGVX5%$~&=SVK?FatBLX7hXgTZiyP zw&0ZBlCCJA#U>|PcSZ9FmT;uh!|%C-BlLxi@w+DkNS+AKXBZ&!=_MS7&BG69s|Eoj z9KP`fhSG%6ixDKnRGEK#3@1q&;kZb3?FV9+PY*X`#WH4~l;QWITDa^3`@xiwqquAg zZo~jE5U^f>hLvx*a>XtdyvalxH^ge^f#RU>94`xjm5hv=PRuC^M*lr1J+GUb!SJsa z$_WY%xMW!vZDcBVA(**kJ+@@>rYglDl}oyYYbxLQR+5-CxGK?x|EnQ)`=*Q&-WyLM*F-MC%hLyEN9F-XrSNs)BAu($ttn8k&J+%RvwSgzAF~{MIzYe*Q z7$6xje88i;R((Md=7zOa!;kl{tn(wSKqvrp04KooK$NLO!tP0T#T=)rN#O1K5Revc zNvPXRcAZ#nCR_??<5t53;Q1JHPy`eZGf_@fa;YJ~e_~yLm+IQK#~BfmEhWKe(xjlD zwG(ZqxOY1z4!vX@=1@yH8=!vzt1S2Khr(J2i=o(7N-*#r-61)8WYzxp5GCqZ+!g6u zGGR)}Zb!`g{%4$$y2jdPmk|!qumbcMSv=!a%zCY@h2F^yy~RLpXLG4BYt8_Pm-ak) zT)G2fv$Q0?Jjd1AjNxaoCMmIJi_*W@3@$+$)oPk$LUbPqLtiM!9_aI5-Tt8Qd@e@U zXG>)|BZrK!lttck(I12s@Y-Fm=~0|&tvxa>55KTBh4RFp@veJ{=Pm6Lm2F!;S=i6$uK_l;)F^&R%9hhsc@6w zPrTk4FfG-aktzlrT7W)-D@hiNvZc+^HdCIw&S|}vc8h6`{YSSR#I{Vf$*mlctXUej z{XRU~GQN&eOzW@@+3UB;b0itqM0CYqdgseJQa&p*Wf%liYi97Q!Bv1G+PZq+#T_~O*_IB*$r*t2+oSz}w6Y!{3nL9U6ZKXW8!s0o7%{A9ld9DZ?<8F$W@DL+zX{TUg{IEVey%ySi=I*pgnh z<*z>$C=@wL=DI6%@+ArrYGL{^cUbR?IQFr1F0`q&Y-e*hk}xTULj)_XxV!Bzz$%g( zh%;Ka^&ES9iruLM-aYD2BMGNbXdFDCX}H-M?RNfvEALXgp&j^f@=GN&RhhTpWujhw zWsGPxtKhcNIgTrEV5PCUV$HYhT(IF$He5~K7mYMcU~|>n;*3t-U#s{fcBZgrcAPD- z1xnDD|G1eY%p0Z0H|w@ct-14Q+9ZIBn6eCM_F~(NY`3DB3KkV5&vT*yY8?#w(a9rN zIvyqc?VkXPj)6sgeR3I##1gAkb1KKXqE5<%Hb41z*Ko5Iepj8}A_&NiSw-zy_B1o* z?khLzz7+Y8(iN-MY4k5D&m~w*E7G^$$S(QPxsp zet502D)fF?lkMY5bE$Z>S#Wf*)JVP~WU>TSPmJ;L7L2c=YL4;oGfU8cW)N}8KIXP&Ve`pCPz8;Vi6jy@L$PHqs+u@tuyWvQOlC<^d4$z&_>tMOF_+25|F)g=r$3v zlQxaTignzMnJ-{A)TX1_^v6(j(exM#`7l7vK^%jLDxf{eD>GXAvMLN8L6?7m_JWpj z)Nt?n4D{F10bV7ZoEOC!hr!y`5M?MX%59}JqQ9;k1hEa(DW5P1~zTkIS;AAsPK$* z-pvpyf?pmuL+1?$f{7(yz2qhfmm96C2eqyp)O3~`eP&7bceTflVgJjk*~%m@8)q-Avn0RHp* zg>G;Q4GSp*3vUa$NBc0Jk)}gjP}xK2894q{ZY(>nv+aPtvAx~Ku17_*K)1+~Lz893 zZbhtqS4E&5b4Q6zl1~a6K`!GDffDVE0UO^#8wU_dPu0laW#CT1DB=^?32=aDHtlrk zB?|v%Ibzs+1I7Zj`iUR&6di#;)ls4=)m?G#1f4jdAtU??8&>gcr(a4Zlso-w*iJu` znrur!2@o$Fy0m7eU!1XV<-1-QX)vX7rUa+II$t7fU><UFXb-3RdxA)d8J+YM$f2PhC&{~W=>S$4q`kNpRSd-8>Tk?DmQ_&MyfP?QYcl;P%J z*xoz;BI6(|{y^psB@}8On4uZ*1TrkiW~j1Nh(ZacJ<$$TO{S(b+`NzVS|>R;N0EA9 z14Sp$jst|U-zE@X1Uc?#DKT}Zc?e~?j?w~XH363nM_N4e4FwtVL;!pMVfRp=I`yx# zNvjU#kV>vgSc)cs$4P5z)!DD}OW5&RI8=AMHne8t(|^F&f^CSoMt#nc2X@G6lN%dS9kL+rPFc40nW03 zA+h2jNwk1vQ$6lHE?~SrL;wS8RJ`r>8nHp8Xiqpx1t>*%`&ZM~(07Cbmjp4p3&Yv^ z1r%(3mmt}0eNTN4elVk#a~nU#Lg|X%?TC&+`KvOwtP^AK3@z8%Q8IqXW~h)m-YIEd zj{BkFKV#{PD#{U!R6a0QYs5jMM(!6GwaE}1?Q}-kHa%G3!_{mYStZNzVSzq&v&L887E+^0$yp)m#yz~=h^#-*k z%+^vj=pK_(PE?wCbQ_kLF!pS1DuAEnb}{h2h{B)eKod0y9$0d`V_&CqEYvAaqj~%> ztdnU7C$H;w@ck3VbV}2)d_~8$Srk5n4@i5^BdFL^bJWm0SD@l<4J4~IIBMD_48eqA z#ynx=>8JDR(YFM~qWceSX?F&#gG1cxfc=PeDw_!%=5J$9O^t>7YQ%TicoKl1=}i}L zGwvtAk9LSG@KgFpXmn%^^8J;`^9+R5Pg zI*qIpeso1B!DY{@#yeMlLHmG5z^6}Pgu`qemw-tElQp_1DO;KlX+~&XzR-oHz&v)^ z4H)kNtu{ibuvWr2hqT7rg&_@_Th89<524IC?TLSbuajUt#VL)rf9^n{8QNRv-7-+B zL3zSZznR|Jks?R?12~#jiM0DA<^}pd+KSd~>rx2oDb;!b6YKGO*$#;nm68~6{an3} zx7V$lDkJvrQ3W}A2V!-{20wuCf zEO8WD&;5(bW(1F89(_z-vrrC2T%Y1&2)U88Wy95)+(cHzAAkLVrFh+*T0&|{Xfa2?LkwlAeCmcqB>A@ah=F8JaOZ(?77$5LoMHuXAB z>ax`(ZF--@h)mluKpeHbP!kie(9VLWWhS3cjQRBXO)_jQ<;+B;#RzDp_{JYlfjaSR zD7;g<>Yjz1)0cBxJ)F;(vHx#Bi{bB&-3j~vXO`EQ)AC-&ql z%m*6qu|AAK7=It7et|B3Z{S#gSYej`u?tNB{+@-Sq_h59pRWtRDd|j~qj5fXz#M{E zu}FG%!`XD=JW)F_LRKp$^fPAkWCe>{bn4bVraDuCA$NLSDTx70HCceEu81dq4erb{2&$_1Fg7bFI(2U|H;&uUQr=dko4N@L`Ybv2)CuDDNJr%qwcnlJz;5SCkAYX}-blTBR%2 zoTbbwY3jyV<`p$xhYhsdVKi;=N{&P$ImL4q1KNVuJLSoXuuIjTKguaDjv;umsb(W7 zVDCku0ILS+kX*P0&W~~CsS;5gksnzhRNt4fkHtS8&=pw#@65Go{~C`zn}r_}(JMd` zeluqg`ZhINm%0F1iB)McW*zKz03~abDpt$>-{YZK{!!mKz#iihKKAj#tTKmg`S?dP zoS&UI&Fd^ywlpQvm;7vxDejc$nV)se{-KYTbw2t7A2>MQfuq7cpfK-(nOd$<(yL$Y z$$8`6Z=5c*;ToYtM+}^dQ6h!Kqw`_<<$dMKqGRT9&<)f_SHGP11&ZN(=jo1q`RlK_`sMXF&EBpH znrd_0efi2IY=#hvRE-bvq^>XJa(COKo|Vg+xg7ofRJo+?=Qy+$;Ek7xqo+r|yqJd| z111aWbI-A-IzKz!@oj-6VLGTT@o?&1_(PdkbubSkL#3-_C}z5z24R-PGZ?NApOlhu_91x6>6b zo#^n}v3tAxcGNGC*R!7Q#QHvbJ^!R9HHYQSsCodXTe^wMo^SN!Eyuc?8D#CRi}$5N z-Mo{1c`K2Z47h)Gg74FM3E|X%n$%9fH~y&V(oP^_4ekF0t~~$$W#xIij}gW2_v^s7 zEJs!Q!L4-M59Y33{(gGK!{3k5K(YM&e(1>Jt2`Z^i~NPGrJ=4jR~{KB>)_3N0YnF4=md@%`6Z?e`02!Q z$Fr=s)ePl%mi~Hf?`bT$`qy6WdpXP3-Jq+cjofTouBJ~Wp{ng({AnMe00aFJ35o(sR$1;8iGuEYt z%t1!v|J?u(RJwHGYbBBHih7h7&CXpVf2Zpl0^*Yv($1`yEPTK`XoXM5~1XGI;a0uHQ3I zUK(-7E6VXI0feqfFF4@*e~;#m5CV707Z~qBuZE5HS39#v{px96q#mkB{mFAKQtzk? zL@F}^slP%-AoW#6>L&l-csHO#7O7KYyn)dCu{{deow2?BR4*9cQZPPw)&*ndU@({w zVC7Uh2$$cj>JFy`J%NZ7@j1D5iYk*KT?Bg8wEo`;ZBcwXeiGe{-A1 zzH*ZWic$YK$ChGU2pqZgm4u+2DaY2k&=g@m_YZA>NqP25s8*RUkAZ%lL75r{WUvk- z$J^=6?5z0tN#0qpg21IKRqaQ{Q`d zuKkXMXa13Xcs{0$i(}-2=a##B2aoRebY8hiY1K!cq3Fup+Vu}y?G>lvA)T5H9264)-@j1ki2=cZp7_Ssdf3z;E)!R=8EO0s5^uAF^K~* zWv!bcJLqnVI{7C}{gtvIb8$!6#cNOjle#=o7%>Kyc{cE4$SXlFs*KQz z#UjWcPlV;RPE^6C*9OS2Iq5{yhD^MiRBeEK<8Mh6e@v=T)8*DoRKllo1dHXDUW#-a z!Qv?o`P3zjU@`tXbQD9qF}Gg6@kh}3&QxCH$*??u-~C00HhOEbXV^5vE$Yni& z_S8i;*x9~-&4Yl&q&lH3)TH`BTKnQNss843^kqc0FV1F1cUb`0Yf(k-=SC>bn~qx5Yhi2+KVSXq%BCY!uN))0*V6*&Zi z9E({`>p_k>&dX$BWbhmbhUkCiN@9Tirzrg zuNqH}{gWMD@2eFOEuZU$sNc~ z?QSui=B$IP;N(6c4<}FZ-o0MC92fk{8RU5sI#N+vWc*?|#G*C>tsb7(u4$m|Q*iK! zJnyE`h;ULG-HF8+IQTpSJ+s%pztS6dv~Gcmia>d^+gvM;Qle8>d9)DrS#%|6i|<5g zE=cpqqs`cx3%JXxy>aBxt616v%cDH|%=9(vbLjYDW0ixe+SS0*Q7!Zy%rvMb5nLRT z2JM?ue@Xxp*KHH=W$+GF7~^KG`0C)+kgj1={hQGen!*cfkr^ZR14Z@2ueY40)z`Cn z+%QzduQhZ?5hVyxZoO%r#cWD=sspwl4}Zi@3!kVx$#!7&!URLhq+O-MYN5kwhho~| zH8?L{J^3KyuKqAlwtGiebw+2%p!+@4$7I#bqvqN1Ruv*yimG-y8;h~A2EK(J+FTkHv6>TRs8iGWd<*eqkVh{#yk7>x9HT{7pCmNT*(y8`ctYIZjiK)2Z<3 z$x5q`+4Aw7D5pY=IR*spo^6hqwPdoOij>lSiZyVgQ;ZZElvY62)euo#Cu-f-*}8Ee zdRi4sA-l2er1>{o(lN{Cp$>P7CCpW}i3V+=!D&KhFitXenuwzb^e4(3a%V(Tra}~1 z<{?UMm)TFq5WqD8rYNVeel#67jGI@%jTt5$XsvAoGakH3=>I;q9k@^+*~dcrHC{ax z_Umi!e(1{j!une1r(K0{2m`_JaEyS9D90g+E4$p~P}ICyZ^vKJ9z&H%0)rO4qVl@31;+82Y>B;Trh;`Q-`I7<8=?ImA_Y_ANa8XGbP_-#8tlJ zB5ft+erj~sb1Xrw&Rc;c8W?QaS1>e~q?A!8jkh5~UKybw3PrJC2`9)}j=&_ut|4dJ zhMDhKeKC=Md8igOfa*RhI~pQR>WrbKIK`rEaIs28G=VJ0SPq`}VOf2qta_Qk&~=5> zfm^C_&bj4drso)E4YJ+WvUI(k)*t)6AF%$|8Q#p^^#}a#zy>h`xeWO*#gV6OlrFve zJ(mqJIA4O!;s2Z^$DNYc%OwZUm+Sax(dAN7G7UI% z(gMZlpF7*?d(c12c|vG?>z@-qI;wwuSa#fy$KDwcarMv(aJm(E z-be~8LJvKSM%j&eDCSI0^M$m0*CnJcBDS?dAhbbH^N;` z13Oq|#@vIF7TzEk)f2rafBn7iOzCIL?TK(p`0-eNnv?3eFE8l6lYz4QR~iJiGiKkp zfizf)3y&+ko5IuAsQ>f2C3V1oXMIEIFZ*|RTKml*^IW3^J+hs}0+$~(=GGI5m^9T8 z;IN)J#GeT6k(#0I?XcP;SSR{f-<>Q0dnrc{s|!9*1g`Wb6GeQ4*`(6u%RuHf!r3qw z`wysQw~3A`8wTPW4iinu1oU|Na&{-Hu<7@k@;l8oN$vD4@pL-MXc(>DN3`wq5&T%D z9?C7Ta8;Ydkmk}^A(MoXj{T-0GD)Wi2u)Q2A3B|Yoe6s;>{zwAQMM2G^}qAkofqKF zO%Ww6pfBUFC4{~Z%4}aabNxe?k|x$IsrUDyk@X&ER@`9X3)1289nR<`8ND2+Pc-t*gs`Yz(D12+o{gUG8a@ zxofr_4N$zSRacy6JJI`>U`cUyf7lcda6qjffF1N9z~6uRsB;tvif0td8IArMnELD} z&i%wQ=5ie00T8Zyj$?YL z=ovAZ#4en=fP8k=E|QiHAb1r|oN3nbD$5ne1|YmSy? zUiq(Yxc#H&GwCV>8Z2?Mwiw%^-+52W$KwAHS0`4U6;6270Ag1h(mCOJ^lw zTIgQ~SX@g#Ki+{=I7qYH^=Wd~3*a$E?mB&W2Y~Z&)1LKP)mJvl+RgIxmHj2HH|PI2 zKiYpqpgj7@#g`+ZHE%`)>^CJTBEa;ycjO^;iVBiC#fxS7*IeT={e+}a>fuL~wpw0* zFexWqMRV*iw~X153Oq)$Mw+ruNJn&@fACh_1sFtC6si)53mK1ZMVGK31rkR?o~qk0 zd(_=$n!%BI9R>p{_XIx3y>F20rY~n7b4E(JKpiYW(S9N2qN{_E0-TU}2-rb589qH2 zC)J7vUnj*8OSOhMavqPY58pB`x2Un0Ax1^%170n~K194cE?#J&+&OsJgOe}-FCKp1 z77ws_8Rvr+a7*8(62{s=Bt;pT&if(RaljpG6dp4}!FNCL+mE^F3^pv7$IP(oLZ&s$F)Jxv*bhtW)l~M|sNxT$X81A8 zH01FD13G^6Sm`+X;puo^_1n9ya61{O-}0^lNX9v`*diF>-*g&wR59*BD(>cI5ZoLU z_Y#id9?}t+osNo|u93cMRB^qk+Q#=HFyP_e(AQ4@ef36P|ElKq&7YqAsV=#aq)o17 zwcEF#HU{V(1V6h5hLp@LB=K8?jH{a(!itV5pu9yd8VmKFCr_#Tf)4G?aW-Q{*JvhHDw+~ zYMxdSDn@5nf=Mk*74X2}lNpj;vOH4(iL%>i47;35XTFs@30yy(rb{rJAuQ z)$aBxwgn3~NVEFFxn1D7i*9C0fDT`ry>VCg*xGpoQSOWw|0;F>Y z>O#gm+KPzQJPHo}e$wm{+EtHc(EZKx3ai-7!J!fEH&p z8xlwo0>Q3r8;@a{Q>9%J%VEjP8CA_lqBWIIep$m+DPN;lo->alB4W9PbwS1Wgfu>V zIdSb_ky)mKxBidMK0jM;<8#lO&iGt*Ti*Db#6>~6V#L;-@oD(GJ3hxA(W~(p*R+1e zr@YYkT+Z?N7&|sO<8$O*8)|$=B6j{KJw#o_d;$mN*k5vBa48IG;H>G`v%skIf4&U7)Ey6Ys$b*r zhBIGIxFv7C>_as@UGegkp7~PqH+R15A;zsQ@*U)S-8o8RAL$0yGDVmLRh0E@%;9I%CskHpP=-HuP(v>j&WOM^3C z8lCwfKv;RBt!KA`s!}v)ul_EJ&J&Dv{DgYF#?qDgPgU`s6-5om#3hnoV6l(AkT8%X&3$Y2eP}z)KIL9!ZS%(#T z#1^L?d*ui|#jW1xkNGOz4UI^La}Y>SUSNC>y{fmBRZ3;ePG$On%BWWM8nP0pti`EJ zUr^avsL z;f&e3la;`IyHvir^8&aMeW{8@yE#r(`hu#GeW|JhRn2v((ic=!kE#S)1W&NV$^~0Y zG6vgug6Mft6ePfxuEXKoe;8)as=soUDc3jOgOr6}f&m^S8Jj>>vn$vma{g&Eoof;| z>aQ}_Y`N`me63wfRx zu$%qiKcBv;{3m7(f{e?`YvDCpa7mG_c(ByNe=1*f<@Jb(mjC3->ki@}hySekK`{SG z`Q&xa{Ab#u!b*0)L-|j=x$2dk_|GCOWR_&~VUHDss1U#CKu+~c=$uaMWEqdctb5IP$jm-01LM(` z{xF`|PF4D18IK?;pIZo`{vsuiQQ053g}%6qW|VRq&S>q~FdiZ&H-eP(pbJt8akbc1 z;96`Y-m^uNjj1XrOsMK*4-;DXiy$U+6BhvKibIEcn9%Jnd702P@cL+1_Ok}6oms}? zAOLe7+Xmy=b!UX9FJFM5!+82?FP=8d z8x{lp{l>*Kmjm-C4=oP08ZM*$?~+ zw!5;i)}Ehth^BzkOOgtLV+MroPbp@-`x~(%JMuMRNWJ^%4TJ59jM;xGL@oC&)Vn{C zNYe)b+H>6c%J9I`BVR>75Lb`;GkH+E1@$r+23uYM{)bBKCL7r=I}ET_Ww)o0Rxw%9 z?DkYPwbh_4)RXlE#DP=iBc+XyycFni>jK=C%?qErBREA5avW}o+dsRS3u&d3m>0kp z0DMN$0`|`YKxEIJOYnT3bjN=JqWtZ$Kj!)W0L|q%g#O>s8hXMH_7KhS-0M<`wdY@8 zTMp_R2sJxr5}jMO`e~PRT=Z}0l@@i~&J98*+>h#gI zb~WJfyVhRo&LnHOY}KPO?@Z=o>e;pS@e1m~pzM{X*<7HGwzewRZJjCPm_?mgXQz}MRAi+9oFiC6ra`q;eWA@cvQg^1? z>p*+SRG2^7UAr?N692kQ;5-9t1lddO#RSf?mu$j5JxMoHzrAEnj_$_$!yG2vi)W6$ zN5f2S^gYd=r|;EtwjJ9$eQ(^metj>_8N>N(zKC$R$rtixYqq0~zBdMLDB0M+`;;4L z3ECd@JC-0&V+)(ZOifvBuO4A;EwuC5G@69if;X_HV?lzd@YyJ<^G*06#T3*z)%ohF z^NA;XlGagbTkKBKJXwYAK<#UA_<~+Q$io#-{u(%0*^(J^CcEu6dzLdYHpbNgE$r!v znd|9IA+eo&9eV-t%Z0{OMueC8<13h0Hp85jVQ0+7hP;c+Y z_R{8m;=QNw;tV^LhbgUWl=aI$YlD#ufW7+ZnX~+Jjr}QBKYi-lF#UAIzjQ59+;k&`v`7JS?`K>uB&iBr5 zU!J1$(@U@rh5+{Jr?+#THc&skVl$+qsh=+1Bws(hm@5dRrp&cS&C^d`Vd0|m)7POh z`$3T-_)m{jzlTo(z?EmFai4Ml;<#GuV`jf>q9?%8Vn$e zzda*q0sJjiNIyNBPE~deihg?4(TK=rczOJ8`Wn$CA<}w2?{z!Bbg8N-HwOb$QwXIP z$P=;(K0nN2byU?fGiH}MK!vfb5zW&+AiV$rwXcgeHp*obV$obw?+jryUuUJ$-9AcHWtgK6;f8-9S?&+ zG4gKgV9S-sxy|peX!FXuQFN81hUgd)^6W7uNe-*e_Fmpyy|+wQue@7?@e7uBH(QC8 zFq!Um@(x8@#TAIiyE~AYC-2s2)PqUZJ|Q0U--EF z=sx1(t6UKD5g(OB;^PtGtf53!>#k7#DKLWdDB$qNQK-ap_V0#m5jhne-JONjft-z{|gbnjOPa?bkcJa*>E2DdZL`e{$? zOn|?nqbF~CZp6UWC467SYcVx`RAKRs#ETR`dhItp!L#6gYi|BnN zNAMyVW=3mP^=t~U9o-ai7Up`Z7AyfVu7Rt~fnUyBSf9Y{SM(v@(P83R3?7Ol%sKDp zFRaI5u$Y=Mha)v_VSObFquK>B7KI!g=E8dFTUZZ3eK`y3hh;7uG$^FRpmu-@t>ZA?xXjBrRY)jq!rLD8#?vmTf5% zJ?rW3ab=P}XT$s(7Koj8-IB9_YtO!D2cvN+X(pc5Q~soHxsraqq+*SOLVo`SDQ9iR z8L2vBI^jmd;cS<%eR6F~xb-?&RraIScDzzDitRWy6Eg%sdOh%o;2gBcpgv*zNAv-i zpH70y*{7?3-n1TCFejg`&CX+OX~zp^ww$UndvYO>u6X{1Eu=s_@|e-L+cPI5XS4H` zBzHhasKo1n4atcYc?x*tq!aCPb1c%dZP~&(0*@QrmWY|xLGA7AA&<{}OigA$3aw)j z3LatKK8>>g=T}g%!?OFeepxip9jXL@b+(-OqU&3LonlIkng1ZzwK-HZ(#5Qq-#1i` zDeloBMNY1{A7d0pd5#gEcF1`1sTOpXxN+j*pC=F(z9r02n2xziy8hGe&HOZ_Zi4iV ze!ntWk+R|G_mGty`n}~8ZFU~VBA0%DNX0%~vDI@P`knkMFa4gZ&Rd1)H+vP=NRGuB z$8#*QboulFCw}<)28wJ?Op66qPcsUggJUR1mMOQv*`ZxaH>?1yI z*sK5ephzhW9|`Q}n(x8UAO|0d{?Ri&77TDWxl&MH*Vk*l;i4*VeZBP_c75HBbFiGd zvcA3zj+|ieLH>1zi^7nzzP^nke!&)UryJMT4jb6`{C@-k{`KLmDeuze${7bOG; zf<`n-((EcKn`*xjfryFjS0duhu^2R%_gSFg)^k@o-dh}W4dLK`-8s=4qloaCi z%Xw)U0=5|`Dc%dR?ha>NN%6~f_uv<(bz>E zIR4@dk!VDdPe9B4(E&~s!~^lk@4>q>eztyz11RIk2#e2y$GP}4h;`RofVzZ@w+W*7 zY7td!4}eKe+AJn&%m_NZ0a2?_Ndn#HkeO-Nn6Blg*XKx>9j`HK4rKRij$@F6+m4zv zCm}f06`D0+98Q#6B5nq<+#-}jiJ>FG^yTbn7A1YvSH>OSVj)mpIbE$tbE=GYKj0I% z4ull~?z zD;XU(N9X{P65G~}?pOlqjeK;67C8(@h}vOGkwlw+vq{2Dgze{X;c(FX^84?9E>eDD zLX^V}w@~wE$-SuWS#5s+2~OoZjB>c!6KZwcGc&w*)h zSXYMGyU&-j0DCu> zPq@AN;@mlS>Zrgu*f0CU)G@9Q6Q#nH<#>sa;E6X;U~=rI|K1V6U`TWAr|1&dMq#(0 znKS%$3D{~m#(wXyk743A%b+3U*d%r)t%aMf`e&~@eRLo3@$L?N$47aQ{$u-)Wbc8# zlY^1XIp;z#;+1#3`9A$|`?#nG)Nd}uAzkRPbE-(*v(EHuq+4EYfp7-e=r=V0j z^N9X&?0slHSO56!pTPLuI9M59|Md^6=j)`&vCljrYk=PBA3M?g);kB^+Bt9z_Dlcx zbPrd^8~rp5pEJ92o_E>lD_K)-vR}JjRe>y4tUswrU?Duo4EJMi_Q(F zA1oE!D_=kO33pO47v_S&7IMuy`YEq|aJm}5T>W5sM-$AkJwWQMam?4Z#y+<*QNyy=nsl{fWYKR6q#F3di0uB7!=KlsS* zQ@Q8c9^Ec*4u<(NQR2`Vm;|wS_8XFn#(qN-PrKjn%+9VP;BH2+6OEL!Mhfo9&}w-! zv^kDzwS?_6%pb4k`-bl0knA;O^vajrUI)uR+!843?`rRP?W^JM z86pD5e+Ec%Mc}UN)3Gp_=7_-Gah_}xfnG*k3RZ0q7? zBfN6PvxpgmaI(hbNm*#CwcfTHsSG44~sPlbA zJT|g~KxiW?;$tG8%f4%Dz!u)vL6KsCFTi2B892-jy(>XdQ-B&AM~Qm0IxR&@%2%rAHf3#M3b zm3*Asy!tHY!x6U_sRe|fY5S!LpWdWyz7C5%Gtt1@wJ9Y6-}ob7Vs=LAd>fW0fN$0o zF0d_hFc~fI8EM+h=@M`B$2K%pH~N7YbB1+%C5p5$K^9A+F}@R&#WpNYgj*0^QiDHc zgl$h0AGF73q-n1@OEp35GK=BI(phuDZI^HSu?XLpnz3PdB0Ljex#-c!wcpek=H6VvV!#Dm|JKvdF$tS|{M7Z3BZR@yM*ZE>E z*p%asB8kq@yzMcF@VWG##VU6C@VCr z3mWXUi9Irjwq;DNsY4{(114!o%skhG@APOKsbY|1Y+WArl4Fm3{SU&s%ld#faDC(H zaX^27%>b{$v|u>vNrD9lj@}T*7#p#Y)9d83ePmL_JT3T9>b19pT@{FNY%s40w-gRb z%lQeiY%MX5lu{;ET4GT^=qY91Vhn;iZR5U*3iV%14 zaX!oxZt`X*88F%vr3rX1v^R4@g38{L@M*ng@+tx{K`GcRmK_u=?m*LiNWYA=3p#3iHh6;{ecsO3ozP zz#qB!#ySMUz{K?BEr6_l^D<<*_B*=2^gWQo!OrH;_aNdt>LTa~EEyS7?Zzy}RS%5G z()XeCc(C++hU@MeNZ&u*LJP+|^gUdBN@R>Z1Dz>hBVqKNA$>34X*OhPAZ+t6QsyD- zX!z;-u6sD9*?I?OSRzZ`55W2wOyAcs1$ndd{U`J@l)m@HzPg9LZ*lSl(f9sDVK9Ab zx3ly;Qs4`x@AqJyEI{8|y~6HU`Yz)*W$8Qfe>Hu3>`O8M^TU&1Ny3f4_--0dnP+wK z%EO@aTG+QMb23$O>X#?lh7n79EK7jfhfeC~=a z%zQGA?Q9IrHt@qOX?o-Ti`Z#f$vg{~XIm?qo9m#$HZx;QB0an6Vy3mWaeriX)eHpi zac=neML=KBYVp-oL{ai!PTOz7)R+#rpnD~YOVz)BmPd0{zvf_a-59gFCq^Z!`i~!LzS+zfYmr`e2T39RBV0rSbxsY zhcF>hZDI+|qDIUCSL*;mJKzQQmxzN9sHiO>3z+b=8p$<})C#s&!uFoL%Gcg&;-5y{ z4BWZL7QOr>v?;DMla(aBj*B~*wqd^#<~K6sFz=cAuelKG_-p_Zu3`da40ItTjog%^ zg~={UMqzMqbGBVwMZ@@N*wif=-V#{HeDJP#jKpu@z4P5HyuV>W7T(86bh+^U*lIa_ zfVVJz&gIuO974c^D`qy8qd`E_#dI-}(7({QEoe zP?JLQts96hLKD`$+ZbN_^t_==uJ76}AYatlpmeOM-l9bHWLshg3s$2Oy)sZ0-Jc)BSHRPs19@HH|AqYt zmUjg#M=3KHGmXQLGWR_}Dy)e#ovq<*s7X6xm@-!~85tq(v$miJM4IM4&RTwiZ=}qr z%uNhw>XB3{+-WJ6r_H&#x$0JpPnj{c`UdOSfb|YP2$$Bix`>pNxrDAkh_CTxf|jD0 zK#%OlkKo+GH<+ACKoI>jIeE!HM4u>#-vjS*dN_r92p;_IXjgVJM^ffUCIf6Ae)kkt zH}>jNtnrCZi{EP5kZ|!^Vl4z7OP1hwbK0K-E1%jmRvvz3t!VMvCMsJ1ekGH|@8z=E z+(7uvlh?pb*eSCu;U{Sq!U9^288?S04p%vP;?IK5jJan^lgpMdD*zmU#xi>dEAu@+=Z z_k+Et4{R*J%1#h9)vv3(sKEldh88kL7`~}L7kjc{b^5eCAvifN5(y^HK z+x{Z(_qqHs(i69q``G>nZNJau$6I6y5UT+$mTJ zzY@8ypsKs##=|Nj?J7)4=qLx8uSvkc1RBFx)V>hF>xufR6xfg$n?xt*gY5gb+i9)N&^VBA?cp`%Yg7n(pw?d62Z)52`8O7<0qt!{^>RbBH|@5- z{vEks1GTqfaQ{YeM)tXX@xYZFEP#+Z*-dQ9t(aQ;u;_ABAE0-`oZHN9E`DuP38ns%woID64{uxt2$L z{B3&qb0!Qsbx>d>C*6MIHMQ_<`6_{{1vAIl0N!pVjH46}>%Worik>>d@E;#mbv zhs#zEvL>Dy(>X;(Gf$!`b{v~XYiCL4ey^#|sdHxY$2eZ<;Lytd#gJtDeLX}!aMHgN zl3oyBLoQX+S6^xIX7-}S3Jl_sAiC2)TveM@)Y2fp3M0+cS1|9w^vxfBtnJ;r$Z79k zI)mr5cVdz4W%ri?CI%TQXSg-!p4@?U!ig0~FPdIQEo3KFD$5=cwmd0H|6M@u_AI^D z;@p_4|Mr$%1N@ca(A_y0Nw12eS4Yv2HG*U+N_bt19Q?ueF-3)6{guTrGhKQ;P^;h=gas8Dw*12D7j@0D%D>DuL%GEGbJB`3!xx3pNtkElx6oeJ=agj@}#4L7# z#Ga?D0yD`J&(uXxu2^v>tO}_C*!1zvjX{LtR%(sL($Zlcl<{lL5<}=a+5VSM!Gfvk= z;@l}Ch_!9wW4dp~d?vk0+bnn6X`8#2T41O)Z!e7u!~U;&c>0iV`6n6KtbIEq3D zqi*GV~LhiaHtJPg5syzt7wNluy^mm;tlmY0XiC78MS@ z@kc!Ho#l-U%M;<%Hf&oLCu5Dvm`#kAV>nL6&)5Q8ogqU=aloOBb@dhc&sMl(vDtjW_SrmvCV0e=p;IF9xOC!#PbX3v2S=V53?Yv69Q$OGhhgg_k+#Ex91#v9 z^a9YO^>jb|*9r+|k$zsAHF8vVwjt3rN9Pwh&}bT$q674{kK-}?fm{??8-<@qz15?neUp+;F-s0D1n?rRv&bP7?{ff#9Dn&GNwzf_+?fflqgppyc63( z)CXBy^+CQ_eQ-Wr$v9ZVoQ0K7J7=}6^StX_eNbXtR&2pbSFDp9Rv+}`arHrs&FX^; zJNh8sp%1oLrl&zyAJm|$4{C7S`!ANsSuG95QG+l{4T?Uf+SeRzL{qHOq}Tw#XpfN5 zyS>|LW`zW!7$f)xb;PvF@wUolR@sa*Tn?_lR#&Zd(C8>~a6dGAa`6BrO)!<|3&0j; zzO#Bq^1}e9I>?K^)M7K45yQ===pZ^Y(j2unb~?A&*^=8_komRIt(B_NH+ellZIC`c&Kc`^=5j`SdP( z7&bHMm5eGIT>$vT9|7PyQ;iMF6XDf1>;*vMGG@iA4gjBAt96&K768B}0T4e9P&UJ6 zs0E-I0mT5{_#*&(Cjb#X5tb*yYi+t00FBF-2`&IrEC5lK1^|2#0NI}a01TT;c)kTy zwjiJY@Qpt<$akhz@`b*ha+(6kqB~vXPPVvrF^aT`yCuyoMzg8z;a5aCiVqGZWiQ%CBZY6^0VgWLm%Kb_-(nDl~(w2I+g5VNT+h=|I9m~=oyY>Pk#tcb|0 z7LiH4CmLyjSq;d7QPfqbqTM)E0Or&+j61zCjsP*4G^N~3ZVh#!bNiQK|0+?;Re|ZO zg}M^5*hYJe4oIjM@3Rzn!&n2L%@Cwycd~?{7_aplPK9TOXym>R<*#(ejw^JZl z<2q4=3+Jo2-h<)7*L7vcnBG#rnr5$Kt+ir7-EoywG_ZS7p4By$s`U8n1({tC=G56y z2du5>rGAb;atlJffdyfrjKCEMHwg9$lYT*{mHmQHlfsJZyMBX!hGqT+L6zP|B4mae z1ii41u|YsJW)A8^|Iq|Qf_5Uq&{AgF++~f)dXTSnB4d0=3FFiQ1seo^`G&%l{s3%- zc7uR4=>`GL#wyR;y3&4^_QG5Ga)Zao7$4$foMbE0vzKJlYpc$+n7ddVm>HIWnf1(_ zM=9n;kC`z(#LPG`&$Vd@sg-qU`7f-1SlrEGU}k7ne~g+-&e8HF51cVR1kO0$o@dh% z0(he~tIGoKVKIO+w7?lP+olzGvj@%?9|C8bz!%uGgaB?g2KKSQdsz(N42QZgAZL?w z=@P%7$yodn0zYOu{(!Q@wuI6lN5tS6);!$*(dyP#*V|SuWo;13&@U~SFn4md6!2O- z9~k39J}}NwW785M-DlGld(Otdn?HBhx3JjDgvRX3jtD5q%r`q)0@{&KMli;Q1Tanl z5)6@+5b0&MJS0H#GUilIzzufas+w=3`3%FQCDZ11o(KcTP9&57#`q8+<1DRWh_r-A zSK4$p!@QNe4 zW7>t4tm9QZoGhy6xej=TUgA=wL_Zg=j(qSrFqk~C=kKM4SNp6}gd}6y?k*w>S^JFD z`~UvTFzmA%zm#jA&2`dgZup9$rkF5V8u~YfA<15FG`00N^ryd-B`C*!Yn8#ed|@My z`DG1eZ)V4O_C*V*{U#OD zrPyz*32ofOT~ImTQF(RNeoN0n|3Y)Nq7yh9Fyw5YXmGtAlIG9W$g2Y+RmP0*p+03i z(tg|7!WJ2GZu3~En%enMsdiu-)@6i)RP1++g2_m91zMd*M58JcBP}q)4>=Y(!n_CFg7hA z(tS2&p-P{j~w36ZX}>5u@;%b4v!fS6BG=**{q zHkeNh>~=ZQ&UjG{bF=mj)3kr+_#U&RDjep)4oc!! zD)o;hy&p@Hb?c&~*-~!@X=xG=g3>9h3=C7eA1kLe9_rKav^Wo6w3_zTC~~K*lfz8H>z6_t*N(9vNeNh>UR} zn`hG!isev)9J9Yg*27{TV;GtxKRaH5bJ~fYj27^1Ad`@0fwFDM1^RL?ivgUW10gRJ?N`^>Fh;*4vhXiO|#@w^W5%Amdv~jhp4FVXF0FHUO&X_iD->j9o zkWc~`<3ogulYknANK1%xwN3Xhw4N)?%b1-#0gaY`l+;=zYk|=8V!k=k5-<-5C4ezU z0OKSe$q)och;*GzhXiOIuB5}NT1+n~bf#D0LYQ8!{R*uW)2kZ*Leop8ox$c)wZAq2 zq&WZ8^-?x;`)eY<2`FVs45!D{@eeo$29qaRM2nIX$sGIaF&+$z6NWtdY!O!9o(qA! z6#KapaZbYCL$rPN%HfWhIQ$+NA_eCuhPlhgfttI^xb6j6D~&@nyZO5PV``;Q6R4HO zm_2{GfK}}Vmsx_(kVOv&fOPp==XrBYasqQrYmA?MK5JNWEvJq@f2z4zbB$@|u3|iJ zS839pKh@;uZ#N!$an?-x4Y!M-E?dE0P5}(VIf!YK{F+v(2l=Xj8RJ8Z%Xp-_>JkgP zlNAA*VPg6&e1}c-hgg}&b5@;bFSKt!kz!^>nap)9-YymcFGDdx z0=zuUO1w@MviMosyggl8+=wcQpD{kf&p7eVwP^`~-)=cxahAT^&0^qZ7`m(~;2h@b zO&&O7d+j2?5+1qB~mPJuC)rhM{eEU$X*l_P`nAL*R@P_yU`j5Wwx0V=uq5 zKyfdN0i59wT~_~xT_J*K@%S0zL;Q@hG-J~e0zYg({-9*BEs@S?(?2}Wyo^}}yH|ZS z+gd`GvNi~1nCr5dbiLBi>giyN59wf>*o;j}h;*M#TkJV5tMl)5*nebsTt+Cs&M+J_ zOq&PbrYDMaBvgbL<3j=%XK8{V(h?%Q%$A1)XkNzr;~qyqjU}L(Z-W4aq2b1~+1(P* ziG&is7#|{JoCH)cL|Q_mD{Z=)p*7qzFJoFf0Y5xL8&@Z_VzwL?;L|apn2SnE0Ar2- z##vg+5Clkwbd61i1ZZByyo-ICtipDN+po@s;WmMCCx%-W064>Ku=!Q(wZ8*EoV|9* zbg%JQ*-Z)lJR7o{uFu(TtiZNW>=YeNk*nkXK^z!No@hJWzL1hgVHr1923y8#d~Fe7 z$l7bH-hVe%g`Oj&+G}OKx%OI@ASN~2ALOVRroGlH<8k@I=>Qpc)%utXuUZR2>s4z; zln?bWqv}fVG=8N|KuHNMSGt_K1=|N91 z4CgMU%@?fs(+Uz)b2G+=nwoKfm}k=xViLFichzAr^spEh7+O~uDGU8_EHdZWFNZiK z#!r+BP?g9f1oBp-)#tRi#n;Okz{k-3-xcxkrF^`sVkW+%oapp;8RNrO7-u6hHZ392 z?MUm%vhOwN`+ckdybP@+#;B>O*Ye`i-(plHJ_!N86KQqS?PK9DWevb*XyG$zp2ita zQrP9`XN(WwG0swB(-I;*7is0&?@!kE6RZjN3|Hd+t_B`gaPt60yOA+IB!_X5v&^O? zB=I&aA<|{6hx&aCt@)>Uuz$Yj?H@~ewbXL|*|DUdCMTBZvJ~%lJCh2IClpLx^efpgr-p00||4F+N1dI0>j_h_r-A*VuGO zfaYb)Kd~vJ*6((ffO^&j0SrU)k7=`qC7=fhC4ezLM94S^NHIiOLZp*6-N(?Hf0~yu z=XnC=ov7Sxl3I&o%|Zg!6zH=hZ5G0ZKol8NQUVy`Lxha8w2>jw5+dDT(;)$x2m2qF zJY@C1GyfKx0`qTcN}rg2y#V0MzY_OL-vER-`|qq%hiU&k0)k4Ja{XMtI`W^#fl}>GF?!)f<44 z6BvM6WBd(LV_5sEPEEo9tS(a}MWFTqA=!Pke|W0d{tr(z>HqLllS#ZPicXV74ZyOP z{ndG=I0LW>1m*wXDTyq6Q4GK{_@XrcmwXul07ctPdeA`(!`X{z^ZBo8r6y3Vx|=aR z1KSPVTZ1_p*Pd!;NgEjU3yaLpbWV|<8=ah5KyX$g^TMOqD|%`CoN z)&M?+G5ASYsWAyz#)&M?+q2agFzFOYu;WNgE z@EIrk#WpP=(w#_adk(Phm$C-nGYk#C=Z{kO?H)d3dSX4N9+3u z)&zWpD`EJ({eXh&1Q?YS#`usN#!1dHo0bsiE}NDR=`z+s{T_yShF=1fv|2tpS<jPW6K#z{>TL!>1{y3(dC_8i0SlJ7X|cU#8Su{IdTFdRBen@8<| z#V#b20LJ(bA>$;VmLbv-B3)zCApx3~F=IRdwU&T-)&>C#L%WMySWST(yA*rr!Y ztthkW*$b7LZq!g}7~@0ejFZ+XhDb|@bfryO>^WxFde=GZdsysstPRF742KZY=0Hop z0wk0G#`q8+<0PP#A<_~eU1QTB0h*UFS6u4|Sa^swuAa3)07DY6hCtU#P0iEx=wlBG zl>o;05Fz6vAjJ@A36W0PbRWYuy}L*AGG-l5K%FI^NovLT+xE8vWKc;7V9XJ~I01{*P;0;3a~&$2ZdD_k7Wh z(WF2101KDb5bY_@?HJ9L`ZE#8a{H;_HAHZvC7^BKIjbH6)rm{+syU*Q<`YdGaa-=i zM1%D=dpTXcR+iSn5D~qcSO8=pDxgcCEt*1k#GDJ zYgWDwz;>A(Si_R<-LkY6$oHdCHgx&k@BShp6L#5%#!Hd!6V7oG<&TKG$m4!-@|7pw z?H?b8d~b=PYSH?8U^_=m9R83&1@etu6ER$tFWdoPaDJwT**HJL^^M&%X+@L|EX-bp zcGm5;uw&aprYZkdKM=7!6i zx&JiQJw%iuq7;sm`fKM>=Ks!6Tr?FF7h`;gi*df0)L9g9VH{Rx$A^KZ1?MV zaq#*U*E~Q~T#WG{P{xU&nYeIF7YBy(aUmmPjsUK#fX#fIvhVleIZg%}|2m(4`%tf& zYxC#xPfTOk(DmKL-$mmKhH%dQCXEw*R-FXZ!APxSHbyFk5=W|f3w|&~nVG%rS#NmY zbV|<9Qk0DB1 z86qtq8fLF|KF{Kn;Q_o1t!IT%^Y2e6aD#*bXN(VlG46&p)18vW@YIgj!UCViYyf9y zfir5px3>acii84Zj1Pe^PT*ZOEg>kkpA!7!v-!In9+8Ogl*mAgJiGrIm%)%*Yb^HUw zfx+}2r?We5L#IMD1m}legymYOyllJj?4MU~?8>(|&~HV*_j-4;So^2iQB$BiJ(g@F z2Oo5I#D9RnJkGy47jrDGwzuoflc?Wm=P*64(@Of`xaBRpIaiC@ddg@7WXzj zU0C8eSht+$=aFPMk8ln93BglnY-mR@4R+(J#oxrHi0^3vt~Zd26Vxt`r@(Hi4VmgZUGO!Axo=kE^C zT(=mXBe2CdOHajLyIg&`ovx*tHBeG)&AA_ylHQcmJ7#mH5KWoMHy}E&C9O-`e$=St zYr{P$<&9!y)VF7+Ad6)`FIa-=IZH!`+a9FX{Nb>fpZip2a?jt zY)DE9p-RfQ{Vv-mk=pffwylw+>G7XA5CV_(OfY9(ZAq8+Fi!Y4JnaHHV}53hy?RM! zzu*J$v{*6yBnJrYBoFRX9K0fT1X@Ref8f(8FFT;t6X*7*ty^|HlX+&!a zN~+1?I&I3eaJnhmT{|)qnZw}8U_06#uMdeXpcmiMk~<)|24NsClyUY&Cql~0-V4xv zVJAyEKpi+)YyLDDO<;HSNa-Bi_md*-e~|6%ERme=f0#ts97pc4B=;76>LuF&U8tR< zID+2N<@@AI^5uJ+XZ__zNgCG9^bACr}oz!uENd zEdF&{WW~rLXVEFRi@WguiDxd+!4~_cJuT>4s}y#b>6xa(-EK`<6)=y30;>2KiXB?o zDrpq3Q&WZkzoq8NYoyd++`RHQ{gcO)n0l~Q7MeE~e7%=s73YKy@z{VS2IEo09^)~IV%t?;zu0$`NNRfgW&1kSa_?*_-}0XAJa#iX zZv%TeGbL%anJCVNKz|4F-6|Df)U2ql0{1wYCz#DoW=q-dTPUr+$7UZJE~KF0sja2q zY)-b}(f@xub4fkC7HssK+(tJt8;!0)Xd8X?*Lzs@_9Ksn=FJ5wZk$WlD0WG+gd%n|R_q$gKk;P_h$pe%I)Ri^0%vpR9V^{1 zdqR@0K?0wECl|_+vgITYo}US@7K;4|G~MrLJP4qzL7~yV=}npYut-2=wQhb@vjSXv zSz{fedKmCA-S?(CXdCY{wgmV>Ixts4sk&Bqb>jSET0VJ@@+pIqNBq0BWu3yG81;UZ zzcZI4#*vM1h(U+~RaVJtjB0~T4m+wBo$p8WQsknr4}o+8db-y9@mT5fITN~&N4c*8 z40F!s!7#0=j%&U|(Wo^aJD8#Y%^@T#Qz^NVQZfnhV`o*OqM+QwH7eX7s9V^iEOS@K zR&!uA2R=|7XwRyfqW-CkycY`QPq|%5Vk2ml?Ih9_%dJy}qG$NAbmq}_KI_5w` z%RiUcL@^>l{BcJ)WbQamU}LJB+R;-nA6rspKkTJ&UP+oKMB~Y9mNQvJ^yHA*bNP&* zJqyHx#>S0Edv+AqVSAoWxc2-5hh^;STvB^NCgycwf&E=j9<`n-Dr%>G?9CNZJ2G6f z!*qb}kDX9w&ZEs%j5X35(e`msd>g>{i@1o)3z(ibUZsPh!|0kY~1M>h*g7B@DscCWDO`{`Y_Jqq=_8`_y z74v7y>aHDYwTk%({)H6xmlmL$EN!uuJreZ5@d_HR3+Thjn09+1cFuqKAk6tX7WjV> zY*_vvju;1}W<~c`Y5cqE3gra6W|n_9*_@Dnr*EZ=L>+15Ifv_8QT%&z<00{Hv&$5; z&;Y86i+FVZln8$u*AvCz2llW? zRf*|XRgMOV_T~(+^}jenP=S|CC;LlL;GwFEX=T8`JJ(RSn2<1@uwj9vQL0j>sN(H* z<6~&}_FQRv1^PO+kra^k-gR@Vv`^Y*6>_b)>}=QgB2D#6#cHl&%Ah>FHUt6{!)ra3 zCzF+^f%Qr3G&nSV8LV%L07EAX4PNcqgTX76zxhM)p0^yQi!f8@wM*|J{M-S%A91ZN zr9a9!^GO#xnPiXI{>bT^CzDm#k|HD*j_1(etfx>!x%y>;lG4#+{wSkZyerja5|0Du za=+314v9{!^lx$K^fJ+CDzPcA-kf7JW3yfG7N$&*w|RN|BdcSc0$gUZw})F`NMg;bLhmo9KN-Pm59FP#|LC3dha~I-vCRs z6a63I=W#@Mc-8UxF9TO|+%#Fr`-f40W5%F=zm)b=!lMg*lC?+F585X}g1?)5 zPWT(xhq>|{!vt@T>~t(z0$3n+mCUCv(OE0_V%V2AKSVPT1{D@6CE#YexDrq;L>q-0h1CgY$B1n4*6+zm~`v_^b32AA(ktMC- zvSZ~aiI9@4L^mgcA>mZRh=jhsVultNVa}%&6eHmN{UZJSBJByCF7o>O-(m+xJv!Z(V&9dVy` zk@FJrPudt+Q_!{qS1pY+8fwhx%~s7fnj{r2d<`{hLzDU3QL=$DMK@@sX!WPhK^+XM zCjXb&U!RO6?L=`R6&#QlM5?{K6_M93Vp`R)T`07ryf4?^h*tNf*EZf8APb=>vDx!` zT%7mcfQI>2qJ zG0?;UoM1Mqd2@vxk4N85Fpo_o?=t4$e*-JVEG8ko@NcD=j>*}|r(*j3z0+`SIcu?dByE&t!t z!^>HnsG;ShSY@t5%p z=ZrJowJonVzgZu-7&~Y&{y&?R7MfqJC?4IKWw67g?L^wm98{3;RBx)p!G1bDbkVO31#uQ+XLrt(VP+;^&tRL%HSW zc^e`wt?xRMG0V^0C_h<#UQ5?p4nNzNljY}*qyZIj`1xgd%kwi6@N*lIi25G@eqPA| z;d;8kT+F0UHYqbhEtI`yW@oXxSF9!0icY5N1`Mpk8GaVq@t(+8j1@79ZHtPiUk^16 z<7u5sIExM3ojZ%2#93_Rrz)?nlJP_H4p}r?ef3pw$8sE;2xFBjs5k4J#F$k&i)md- zHcy}U?7Ky7So;-bJISQNX_yFw^8=O-y*-|O4Cy%k)W;?X=;|mN&c9!z{TJd`g0|>B zUZl`gm#Db(yI$>l@pH(_j)ALK1kTUW^jrOes8Np9gul6*=uJ#>1ua`bGSM^D#2QS|)&Q^TeQCQHHoXh?5V z`QY{mR##wDt(oy9$^fUDbonilWSy=_cV?ZnFq&?aGXH&7p3&mvJ!ZTp{C$hSKOhUA zWc~0gkd=od=(@1|Lpcv~`w_*@!~6;}Z6_^Xh@?FX^Ofym55s)uljL3AVVK|U4z=@1 z`Vu?jxU)M9(@BTr`*j$`_76n`{rqi^D0WALWV!L+&qJa9=~~|^x>Q?#W&fG5e}euP zT;5dLu12?l2yYM5lGT#UOZ0Rr(!ufV+T%V$J*YY>;rH#~TaF%fUv8*`_ehzSa97%9 zs)WMuyA%8W^^oe&`~5`nLud>|y+CkF8y}k#q3+{DrjEnt<2wBn%u$w}nM+!w1C}qW zM(CFm_!n?yV~yBk&yh`^X2*@3rPtHz74wrHg4bnFD2F>fO_PG2=jF19!~m*hy579V z^9Jeh7yfobsZeiT?UwV6tow7g**ZCXh^+$-5vZDGo*O%nXE&Cv5mm8qw^ZU!B;Oe`kbw2= z&ewktZ8rPLA@jo3?r`tZp`ZG91Kn3P73im> z+}?S=^i!ZpMm6fz^lkms{jXy&=a3DqPgF~lkIB_vH4srPIkKON;>f}8kRY`9`+u~N zs!x|b1lC?qE$aW-dIVMMmug)orl8}9C!Gv@@C8;M!|78w$a)cjE?+}*x!zY`vsPeb z4mpRKv$f=KZpNICl^QQFAUqW<#`M}}zG`;+-4Y$Z0;sL0NrA5EnFM!^&ahaaJ z?c+Mh{p>`gXt+n76u0#CIWtOUXue}k7#H-6XU zh5`;v54z(L>hG9CC2nuRBlQ$LyMZW)V&~Zl<}ZAz0lL`aX&^6{iTRxe4|Uffw3G24 zr}{}kzBKWaAX1CB0p?Qu$__)4!rvsIGv@S9>!7HUG(H$$sLMol7Gl){co~8H7O+_= zVy<3MUj`}Xd2@hf!1Wg@)(ot{H>@PyvMVHU*W*+YA+tgq=JRVgl<>g--iw*fL*2JJ zJ~#&k8_yhSAFgCa1fy{4Pavak>=9dbUQG2*|66umbd;1jKi>W4B{}wey+|XenS{B* zQd8t`u$vF>gl{FFtAD>Yb7>0b8L|IAXoVitFWm9fB?aGa6P$^iGERgI$kmCEF`Wom z(|oko&Uo@(x_kx(f+$i8$*mvk}UfF2V)EW#$XE7`@D7ig}fjr|Njq2WZ{eY z{|9{0{r`b%P1q?FrVFQ7UgoLSx7bsfpI=8c7&V%HGtL+vwpa9=pY+`a%9w=pMv^Nm zh8|W228J>JN5CS}a%BqWr(zdNY~hONPyC#Nx+%{eYT{{-j;xQC{zL%<3ogu zlYkUMq$NZ;Y11JAnuq^Cz`k22D@&oXLi%=q6>xrTCuhxc`JFpj zHO{2d&tmPS$M5n;07ExOU1!O zMy)wU_7`oAW8-#Y<4Ll^KsJ(`0yaAHV0HLk#(}}c2c_ndINP8Woi~&o`zW%aEzGQq zIkTTrO8;rk2PR!$&lNp+zFAqW|Amu>E-YX9RVntR>!tu7?f?=MvwUGQfCVeBUS?zE z)r8P`RvHoI0~NQJQN0OLDyGXTMO#?U3g7i?*%|A6+K+r)?MKF}BLy+@`cIw5gzu%x z$6@SQ`%!><-J>6l!=c(HHJrzUZ@D_&e$+R!_9N5Ieq=nbA2m5KS-z&|UQO0jZcDIm z+DK(@H)=A8%%F4%lURT9Fq~R|6Ib+LkvI`Y047?ykuPEjZQ}mQMB0tb`1DNvICWa3 zvm2+$ThnGn^ z05i?UHdku8kccT#th~M~&vaE)+!7_&7AYs~cVJDjn zo`*!dfmTfrAV5OYuCnQn0L{yo*LQUUY+wmUvNi}{NCJ51m;J%C`KTqJ8wn+VF+N1d zILWJHh_r-A*V=S1L%OcvwAH+fImQ!^UaA~ukXnmmEgzbw%s1cuuySAl5=sDLjsV6< zKs`ecAR*Ezn+^%kyo`Bm7i*$Qp|h<%HvzWQx?cb?F;RN}AlJ4UZ2ndI^fz0_+o#8E zGd%nB1RR_woWdjQ(^_fu@`Y2uo?zCL4#uomiDL0r!osXEyDh{7r;C-bSTvD~GOi&B z46Sxx)O?>d1j?%bK>L6(KIA#$EbX;v36T~pgpSvcD0k!m%d}k$qeg;nV&;Krm@Nsj zpVjNtDA{`8h!IAuu+4QMv?mo&Lr}jBtSNohXotjzG?Dc@P&n>8NPVrjX z(b?Y6ELvlHo7AxOx#YPzJ9Y_HThniw;Z`PKa`rjnPqdPIqLY|}xt_4@UQJG1u~%4H z2d8gPd2(_^$M&@V|)ml zah8giinN3Po>U|HA`5&Ts{=U0#PrXzE0b(Arb#EVg zOPAWTgh(5k4hhh_jM)$bbn;~>ocVYoV8qxhgUwHz2h!yae>C2H{cLr#{n{l2Vn&HL zalm=z`#7#yIK|{#C4^UFP8L+m$GMR9_PK%s1EFHR=-`D^yu1OlVtxjKTK%G-`bl2C zHz1*w*J{XfDvhH^2Z?zF2NVXW*9nB?Ue;@i{%SbF{%&Otq9KiVH?Y4unGO4!9h|kl z=ilM&?@NELW2cH0Av_GN%3{<^pp5`YXh1?o4r6@S^^CK$k|EL(B3;Hb>~9Te`QCvo z+f>?VQ9I_G{mlVrp0vu7a-{b6-V1b!o1@1U#Jqk9cD#79y98zSvdCsLmN!HIIY&H+ zkq~JeF;IDU!*=0iJr!48BLH%;#p=I&w)ptix$5nEu`e~3a2FFUc-e=L591sRd4`#_!daQhHmy}tLg<{_cZ323GDoR|aN7FHxN?RZO7NX7Jb?0kM_BBgruO*_{ z6Y%)zPN{NPIzD3N2M=%$+m8EnyJ3q_IJd6d-LH~9KwBj(HTMv2Q7JTfukl4zek2h$nUl#=&ZO)TOPO_V4>rx ziKX5=^dn8y()op4xs)aK?q7t4l;~}KyIpWb3W85-8_m^E zYi6UFdz-SPMqj>!wefPTCJ*CYCtl9~wD#%w?)`%;c+6;JY&)hmOjvG?lp)k;mX7DZ z=4=*JYH^j&f28|HQS4Y`vQpd1TrU=iio^$7uX8+nQ8Zx2eDoDGZ4e=h7{Ae7g(Cw= zS~7Z6EIoC?gcakzamJ>JPHplt_=k)PVev1sGpuwzh{xByj>ONFQ+8A2To~rR1bQj(%xzcsX?Np)`_K zmiuw?jA0n{c?Q`(fJrIhKH6tW=nZ}^NBIULp>(sFI8HO9MZA~o+9S*3zuwBvR%-Re zSg@MvztNf;)EVpaiaaEXO-D{Qw)I!_zmBam3SBm@x&L77lZQfC3YD0EV1CinuodhX zQiUNZh7hUx>~}c;c@IGKdg!&Ac9vc%N@PGlz@$O{`H5Z=iZIsem5B0zTcw>*-GAWP z6yB}{73)E+bpJuJ#&Hto{=?e-rS4>lY$={FoS={FoS={FoSnFIth zP6>Q68EiPLiGyDp({6Vl`!}vlW^3ybs>a*ud}53bK{3uZA$|No%x*YzQv{LB@%^`= zws*}bW1M%6|J6B>s~ET(YCI~&94f{Mv6-mg^M}^aZHCVYs(g<>jx%XXV-VWE1eu2e z8N^xZaWdv`GS1RgWC%Qlz-<4m^BG$0D3+xFB#fbT+%al?v84j9^S~M7Ltu>aZIwA2 z0(eTd15UTV#nJ(Ah88%Z=B_S9p7g*O<3r$#6L^z!?tl-#XXl z_yvZP$Iloa;%A(tYA)Fj_#4=JSlDDe{S*qfuh1iJXUy)Hq1ChB^fPVcVwQkVhJIgx z33H)!Io5kR7~?}a7$>$~o0bsij7?kYvag_d8S@}M(^2eydQPz~Wo=+*815@DZQhf0 zraEHd-Lr-uK#+tWpwFg50yHmU_V5IJ#S%~^Oj;z)+;Crk`R05}KqC@L0AqZJka2P# z!4PQ)kzQuYTbbXchjcVAV-{koB&*#b|AlKX`-Br#y8OCztXgE!={wBmC>y`ox-1*| zdF^Q%%fwNgJG&K3r8Aev=*8?^(s`I|uJiu*cb~`OA2$ z#HGXYFdumdc+$nr!+cs4v#Qy_&ch`6=`UR?BJ!9$WC&t5ZZ@aCt_>0?lAH!;^-i6t zr+*8DcufkOFZar|F+;zH{WV?Nl9RdY4rb=n(f>vc3^u-L0B_}Q+4hFhp*&R>w-j;q zr9IE`J*YX)y1>3Gx*lKS<8kL%PT@)!v&)drv*4Xd=&DD@d0kZr6;);bS~toW0;(;4 z?7Oq{-C&Fa<pVGj0yWLR+K5o! zRLmbc0o;xu(et*HNU8kqg)0nnd4EVH$RLea4*hT_{GS42AZO`=|L3IU1Rt6JGT1-u zW;RTD>N9KAC&>jon38)KRjXbqrpvFFzEG=Pvc}Ct649IU zS^bth6W&Vd!Dxn|?ZdRGw{~Pb$k(ZmF+QY(aa{yJVp+#V*P-w??q;@w4ehf&tUuaWck-I2mVYyG=`&HGHcq<}MZkGsDF6$&POpGyjK$ zgcMT1`eyN6kaXZ^M3s1hOQp`P4ru!70j296)0evei4-ujc0HqJbMbCnDjVPmya{Od zkVwXfdY(;72;hy{X}eqCJuC)rh88%ZriZRCyx#07XN(VlGtSZlHZ385H|dJx)kpQ^ zUKRs5L%V2@%^@uI(MonR9Cujpd$&Z2d}M92)E*^n@%S0zL;Q>rf5xUI1h{4b#*#04 zI!8LEO~3tIEVVOcEZod$w(n{QUCI&=%Fr(wm@xYdXj57}9gOiI9gGv3v1tjB?z3r& zT^0?Rmoc-(x<$kNmd9dH0XxHR;4p2T;Ju{)*^Y$vGGly50OKr8Fhp8Hq?g(9kO0lg zm~ozfiI#wBz6}BxhKmNK&F3ruok%DFjPW5t#z{aGL!>1{y3(e*8QMjI=4H&KYdQ|x zYrnavlUmuYU)L1qvt{LL9+xAD7#^sk1Te;j2pJ~&x(QQDxsziFT>wxx8~gb@*7l%Xf&V1{FzXPm&0o)~v4UlV>zPhz64yLl_xl@J zIB!;PS2E6IDrM?kUFQSHfl}<}6I?eXq25J-y*?z{!2pN^JC*L@Dt>wnC$_HvmhPzsBoqRuC-tsSwAhp~i%P%Wt z;#vw?ZhT!WH^$T-%bI4V+14LxL7leT4pghl0)tI!j31C1)?kx7SI7HfH8<;zW!f2R zj0XmrCMT|_P<5rrx&`ZnNpG-eslVq#lipzC2Uz(ATa_AYtO>Q-luFz0HG7`O8f>3= z(9UUipK8AqA=SRSu7hdw9emeHy;=uIs&yITLoLgAq`~%E9Jl9dqRRlAp*7e@Q(&+$ znP;#)YQN!1qDXNv#)mi=C+K#YmJpMEy;?LUTg+W724;q(U}iltjh{FGcFJRBj1Mt0 z&QcwF1%}$2_Aqxhs{=E`&`>+;y9&JC180m6fiq6v^K4o|G|L)lofdcxivgTrXsB(< z&1Jma;DIy7hrk(U=>nUU5WuaWwyOo+%VGd$I7CBjKiQET%*4%D{1QeQY7__O-CZoT zGv-KGxN4|fVOzPBB_NbxuA%nr-zp!PJRcb2Lq0H0J{X&p5a~Xfw%BtFwb!uApxD>9 z*vo{*7(?wNmVjnY0AqYe0OKSe!4PQ)kzQuYLjp7}V~+9!bo^KwSIxK4e1;sc&Q4<5 z+}Nj;T9DAu!x$eTWSj(4F+^HIq$_PYBtY{r=9Pbhy3*N6ulyZ$Qkk5Ljyk?M*nFn; z(cb|i&OSQ--Dvx$U78YaADzHUZsMjyKmVVuX>mb|5XD*YX#LK%7?m{ zQMH1kV!C`?8AECXNtX9tU4XkzX$A3hwSpM4{;Le4TxatYGZ}|qWGQ4}zV(hbha|_D zI<`LiSJVIIN2j~J$6m(l{a5;C)*ND*<`6GA9J8hBALhXSP>b?%}2^AX2MO{!e)<@F+O~S zaUz{((-Mk7QG*=wyKa5Chs8k3Ftk=qo~z}YjpFC11$-OGB&4;V?7PeY?`1JZL>4%s zW_{~zYxTex<3nJKlk$vBO9a(h`!24JX;0&!PBo0aOS&8>bd{&M0SvC99yR2;{ z%P}Q&%4p--1N@8=|6)`nJrW|_YSR)TZETvI;|wCr%a{Xhb|%Srwyg=N7lTOiGUi!q*{DJE-kl0tj0iA`Vd%MH+N^I0 zn2UrGz!)DAz&Hu0WQeqcNSE1kNPy;L%z>VO^DP0jtPKJfhMp^?O$U#N0b~~vN&sVg zh>&rX)-Xg`LZqv0x`(0lTxnj$JiXL$;2-!Zi*Ki-)*=Z*i;VeZT}!|`B$NQg9080I zM3Ny0kPzuQn+^%kyo}i&1Z35rnN_Slzkj5c zu8H$kUC`mEiNhcEKwuvZdNPE1*;;CS9M*WCj5zkKr6yw<{wf(=YN<(i1F|BKj@dHxB`m1v4cz>1VW(_o^oxh54 z`m3IC9DA^<%mZhP4}mkzw>xcGLIAht2R~_n&toxwGqk`NHD|Oa za?a37Ib(bXoN)s0vS|qc+@2qN{uX_C0gC~g;SkRcK8uAIF;sc{jPW6U##!2J(-H!I z;rT)Kku#`zq;|&q1NNwzG&Ppc#Vi4#484bm2{YMlVOM)P7~?}a7$+UQHZ3928Jo7) z#h}u>jJZG#SK(zTocTDdmVzy(!St=p--q|d&)+XgS>b+DyO0(?e}8BR`mR7_uI%}_ zH%^B_Q=Z@VeHD&eo@dX`P5Y&m7w`E zi-Vn?OTc{|bAIlV3zT3PacQ2YtHKtmJwG?`EEJ-%rO=sfpZ_CFw+DF*m25gjNVcPg+2lh$q9yD>Tz=Q*o{`}Qk zH`>i9mpE$T@Oxy4MEI|I1k|wp&t`Xy02#6A^0#GOp;nP(we{d@o{V|uEsPmdBgJYH zDed;fww^NDM;Y_2PL3@MVZLm>j6G6W8d>NQ1$vps7Z^%fWBei6b&b>8)|1s{u*^}o z*}eGuzpnW^d`B4C@?R$QPhK{)t3uA3JSrw3^gxYSV-9$ZSjyC312X@wYyO5jmNuGo zC6@QsHBzW5(`{w<1O$$Az9kz9Ck5uxnYyNUo&R^GD zinoNbi^(^q`2V?V`bYdZ+OChYb5eW>{>N%? zLL#*i0pA)~0;#1$GzsX8`L;Dd>m;4sP(|ZOG7Oj^|L4-K7DL5+4e@zb4f{CvA6+hG z2OY~3=;$DHx6p@wba{*tR^%UDR*D~MzcEaHT-gh%z{TP4qw*xYNE52!#~Pjl_SIDU zIG-brk|SSuuYe+VKShF z^Jaup#4rHeAHjfX&ww-EfB<|Ro0=g5?!CM?1H$vyL;1hb<-hZd=KqLdU#E}fw(+E( zs%y=*FaR)p%$d-FU0f1WH4eIV{(N{bw5oLna2+l$9J`Q&W5t7d{(qa^V4q&Fj3qM4 z-Cvfz)-J6|pl-BU4yX9l@&95D*!dUJN+nKC{RZ-4{k$gx#mms%ET4EFEL2>Ta#EQS3mv3&cNF9U41bg2!I7P}WlRbc-nKJ?ZstoS9 z`Tx%N`TuT`pEv(+!iHUdUBUeM9}PXSduoc@?BwRVanI$_FnaTy`k@QwyXRiTNPu9^g_&#P0?e7Dx^GGIf0&$c&!(~5zvYzQ3;5{GH3^?;SVa zT`grpo$n6DW=hT&91p>c7=tS{-);L#uha|XyQ0(FopyIKe<@$mG}mt38%6y+)7U|0 z@?))Bf6t4Qup(1j-15FrTnVvP_j9`C)_1C7+(y6fOljate#%EA2|1CuznLZ038ss5 zIB;RDQO<>x5I6}jg(umMN!jG3?}8H3fel>jyb4ViEfQj-v7)|G?z5%GPOh%i$c9)4 zAcT74j2BbN^BU$Ww_6=z81Y&|0nPsptp1Yi`~9ZL2}$;-Phc-9oi zOKJAe44C!g(QpI@pG~Xea5S^S$kIsr=*MKsL>WOj&cf?jiVF|tvtYs+ihtzQ=RIp8 z?W48f?hyY-FTQi}_R)1eh_#RQo(Edd&>a8BHf-3De`HCHf8-&q30K=kf!_X4jpq6* z{@&;3m6H4$PiXyMzz;Tm(ZA8fjqA|fy9{P~#9Tw3hW6gkx8~YfEDwfH(fz#Ti{tFQ z8&2}nlwj}u5+|66*F8D->$&amA*gJBEFFt-D)girbAm#pKG(xLxS*Uzanj}Y2oGu3 zF>QBSmSL6MiHtg0bO^X*#|3`pfS4NkW@Waw8pB;5Kpj6>%B&TTEw!s&WVqu?(GKX(2pL}?9{+IY)y)-Ai1fmMr5qoH36=&X-s9zcdzvH zwng6CIGDVsy|c~hUM?}2Inxxfgq9v6Wka=h&cUW|l*kp#S8Yowqb?1>{5Yu% z1<8NEdrUAmAT)!OJGuIxgoE`D$Mde_CB(t+72c158pT{RDjd%T;DAbgJ9EYpL@4f3 z$ZuhZDC47V%w;{(D;`LSNRpaoj`P%%FrL40lhWYUb30((3~3si9{NeN?RH~5c_s-U zDSce1NMX8sA9%dtO!hORY$zfu2&0-eSbynwnh(E695KI>vY`;erdFTrnrb!JFME(t zxQ1W({lMR4yyYWC85B}AI$sQDH40(H&p;=_dqB3dyU#vA?yE#DH} znNUF5PL(#3g}D=hRXW364?O!*-{{Eoz`N>xnPWeovHsFo--=xi?0h2$&sz`7qRb!o z3QKa<19zMvty=9b4X2I~iCcY+VG5(Fd_MSZ^>#`2Ir|Ist)zu>@2&gkJU96Krc>Fz zSH#V?M~c5Ic0$VILVyqdKQ5Xk_9R>z1;ejOlA(9iaXb?Tj<`#CeydGDO1>7AgbWsS|eI)gYt^&7k~bdo^trf6TM64P-> zH#hbEonf}RaP^G%Ts9UDM_-AnfZ3K|Fve_$xk8qBp9E3_`Wr_dPV zLug$L@e)0Y-r{#)rTeC&*?3*G~x;!+dq=gjQRJ{fLPkgTr}&Gv>Ij zhTWR$Z7t0{+A}-OFbg^bHyY3$+kGxQ*@;K`%D}(|`)|`?sA&P@u3^1Q$0I!K zC02l(n#&4>lh954Hzp~w^~s8-QI~;@z@4c03EqDj|C)vW#~SyAvUT~-SCCS1A12Y@ z=Db-hfBlncTLPqot7iX!XcLD>qxq9vnO5scxY{&)QyO?#&y2O70K&w;I0j?ry-)H; zA0?%lTnTI(yQj!4Z@(yM0#PIHmUJu z#ktLZ9^85-@9dwUI5x9mdnChd#&={y;#btypd~G`A;C-N{g@~Kk`<5wI672T)K`n? zM!7-Xs7{ow0;A$c(~AIM3G)bF6pbp6E9%RN!JzsA%A@#C5fSZF{U!(P)@Dmj99VBa zA}0*2(T%$am#OD@%3@d^&&$~ZZlH7lXhiQs_D@2LwB_;*RnR|`%*MI0r2u8^>#r~J zM$|Io?!5q25)W*IpH!M-r|cV0EPF595E*PswE&)@AJIsKX*>%F?L;=~Jj0l|9Vd`6 z7`Og65)jxe?U=IPHeH!hI{hH%m{~7j-cIYEADNpMQ=LJ-$wYwMUcx*ZCN*kqu|G(5 zdFNHFiT{sq?|lVBrjtEG8c3C4D0JS1RW3^;$FX?3UxCG^KhF{|?#O}^Jo~*=(s1^o zwUI2(o8ea{|C=~4*nG)hao@g_8LNDSG+IQ~8&ZRPs3?DK4_sgvqpX=O zZ{(=I9LiMesjSt3vhlN}%vv3d-XouC66hbM!4N z+&F*#d56a7`&SO|)Rds_%kXCqVQ0$ujgdOEMRO`KJ#}WJDjt2$Z3YG(=~*mT ztMs8!m#3hbr{YVzy=IYwba;%baRxd7=H)!pqso#{Dj#?hN)St#Ga)kh$GG-9OiLTh zp%f^;fVaoEuI0-B+bv+7Hz4ZR^7U8c9phRP@MP75t)Z=y?ngM~p)u0lHvMdGk1ypM z<9ZGv2JTw)kAI3UIHuWE$OgUie?GyIm}6XnjUS!=z772oxBqgplts*cSU7Tq40dj7 z_0|cF$*Jd%s9;PU_CsV8IvgVAtAv~oS-!9pj1K0jN@iny)DFAfu8&T>%dd}?a_v*N z^@5yQfRUm)7fDJ4ycCdaJrGzdngnacya+>%-P|dQDI1E(BCSCz?^C{Nc~L&jD&vcD z?TZqkddqRVX$?c9B?JX^3#(DXe8^J3RV0fgMD--opnzdw`V_9$Qiz&kE(CIjAGy@Ae=Ytd zxZ`=ISOzb1h5R!N*QB(SjspltFyHw1Z7F|=l8W*VxSTgnZP}78lik8 z&CRz!)6SNX)TGSW(`+sIYxIhm3@g={ZLw7%4uxJ|ur>Ja<^=G!y_AWIEpmopC9p1D zN({`Rq>3A_!Pb!wWYjYa-Y^WW#A4bk?Nq>hNNAfG<3o5gY;Y4Y$N&kEZe$wp7>4ke zHea;8ZIDoSjPcQZz@+y+ob(*V{h^Pte{|mi^|&;?{}5zhX^b9=u^)!JpR@e7>`=ou zY=z&yT_bvU&V)u84(|LrT)${NKb2F5H)E+Z6$B4UlQTKzyIy)0?YiKRY`a(;?RxEC zZP&Qic7=23>iB;S2Xf`H6S7X5YXZVR^>;BFs=Pt;K86pc^u&y#RIg2Lgm6HaxJ6|( z1+30|2WJAIv(!IZYd#}Z0amhsvzWuQk+0TJ5(Nu11_o}~z*!2r@5>6?xu5F@yWZ@> z^M-h@iTaSlnC0I^4qnEeaz4VpkVZ6Ro|>-JniXd=sU}X@JHTkp;!Fako4w?=%WApp zvKp1EiKxXRy2c`Ep)%Zu<-}&GSa%W;>Y54^RI9?)hOJ|k>_HmUHwy(gMs(jbo{X7~ zll?JzW27Z2YlkQMcRn*~1D9%lUx}kEXuS8gq=dCpEJsq^qX^7tYN+71&U*s7tfQPI9o=pv-+h5(_XSJ|bQ!KWFWd%g;*B&-M0nZ7hX` zq4DpzGaT%6`PG?`W9>Knn*MsE`#PRQ$$*zs1&@eRqrRh%-Sx=Xr z|K!N=?~@J|`Iow974Yx9MREM=piUcfJiERd8vhRBi66_qE1noR{_W{tk$+{dO-Eh+ zUi*9;{|*$bKbSro9{9080>GIr& zs8oEd`{m-J&xJ;KtvPU1@SU6I|IOliWulYGk(c+IPI9o*<-0sGa`OI0kA+2sHQZW6 z-UpMTQu}KwOp4L+al@{zjU&&$qv-+zS~!o(H*#$*DvG7q>reb7;9u2`RssL|a11V* ze@DWS*EWtk|2}epgPkt_glqE%@b5Pd2mD(c?I|8i^0d5E`Md9?IR0(EvuoqX^Y1nP zEl9e257*`q;NM#h1^k-}hv}%>o8P@Zj(@N0G;FMmhVRc86OhHLW(@NfQu0spGLzY6&G=PTm)cjS()jU&&$kI)@x z`S+&>Y@0`bf8TbnIR7rbc@^+)y&L2BxA_jPjU&&$*N%3u)8$Vu96A1d&A}r7=F&r2 z3hhxdN~!b5->}mXJ^#M)3D?F_Xc(Hm;-;e<>~#4H3r3EAvm7k3|GHKI|H{7@$G;o4 zb8Q@X{vGYV4FUgtJc9glu*kov@2mp;tq(01Eq_PWj2{0!!W~Mh|L&PTa{N2V!4mxk z(`?ko?=DBg@o)2OT^mPU{$9iJ8OOh??;kn-?dxEP{)1{Cb^bjBO&%?OuWaqwIP(0v z3BBg{cgcMt$G_biEYW{AtOEXRdQ2SuZkXWOIP&~E`fvw3U4GWRBgemO94yg)*RKNp z{q^`b{v8QVq{>KX{F^$V>`mA+Q&XJVa4Oc2YO+ zlOPgQBF#)38jw>yQ?Nyk1BehH0`5qanM|2Bq4CLN<%Wr!<&{Ppy|1z#+GI@c!L|l- zc|;*&HpSZZ2?dY3kso`3*`>+T;oVkBDL(yJD#eMS+%EHCBjtoAY>tPR}S`C>9^>D=)UEfg43O{V%b z?OOCAMPuWQ*&$`-g|jsqtYG%%H)l4^gvhZDa5Kdt6&W)rrTLBK<&E?O8BC4l87A>U z-P8_zELN#dwiTBq;oUC935pNog*n&T_mj#?TyY==62bV?B3Y+h#N60=Q{&ULogXM7f;L zoR6H{p^IjWGkf`k;EEpB0{288*_YSh@IW@0GL1jz0P{`xmW>~UV4UFx$6HeADH)u( zoDzII+z^(I1+f{k;!FkBMB2L0cryVWS{w}`aAXqrDf^;M02glpEPz>p-l=4HBDFit zcLKtUJ$=c`EJ597pYsCNpZvO5XvD{qDhC$Oo9p7>@j1TkEv_!VZXjfl8C&-s7doPp zmV#!tcsSF9K77JFwd1L&dQFBxv!Lz-DBKi6vXcCiRrn18ZSiN@h{+~40!`B8!eMY? z=HsoP?EM(cgG+gVe77yZ7%kLd?CX@C#GPb&teRb4Z#Jd788IX=E;;0iDXv`o5`&7T zPCtiLV8#3%ocR7Qp{LAUbj!Lksl2dmU{@`;js@u98YYwG@(q+8RXL(TlIEAZ&;oU; z2O+P3VOF=J%XLFCKV9m4{in<0=IenElU^|~ik!D{gyr%NJdggsqRt$=KEd{qC$(lb z9;9oF0`KRpMuMt>oO+dpFPW*&l5YNQHh%!AousuH^Z(613g>^CaNutpKgq7M7md}K zhpyJ_@M~;U6R3;M=a2Lp=6`gbXaUau3DS-f=Ko4N|2ND0kMpbv>ZIQNm#pA)+BIuT z0u`&b#y@4_KO3pYNOs#JFbd2#`bZ$6?PaX;h$(ZmrukZ8P?%S-tVG3Wu41LD2nA-r z$rtzLUai>RDpt9QM`bJG{_2FeLMtAHiCkLM_IP9T`1kye=}K}aUB27Az#jP`PyV(= zbtZ%)M;^i9!jTMmQjTmOr$;) z<0^V~;h4U~D_0ztBemiV@1Nb{#@A589Dc|2AxGe^zaBgO$E&axKX2*i^6~;nAJks| z6gEjZDS))skGmxpuPJV_%NWeL7_b~4#4~${_IlO724uX_Uau{y#0VwINE_VKAHyq^ z_xV2vebqe0QAy{sc53NbbNH9vhyL64OL6`8pqT2T(tmqk>(2Mz+cyXOSH(^FLVfufth!<7OY?5F z|2{qv`f^{TRr~7}t_|a4JG37M`LtcX4Oi=L+~jlp_e=aD@XhVd!Sl+{4HaEO)}1T zaSdL9!n$99kEv5XN2xK}eL=5a5xWmx8G;t;93r;$f>K@7hWUZnimWtu%i{cZl59sh}SM!;U$MrpOk${+th>7e8PfGngz z$A3=Ul^g$D_LnyPt5EZQZTxR`dhGbOn**a@zwLpoLqGoSxiK97+|-U3|1&jvsN?_7 z+3{aJ67&CBN~<0Jhk>XOpa0KT$?@MpqU`*C*Y$q6AZ zvi;YZ(|_Ea=l(+T&YqItjK3$Y4aVOlSTwHk{`*a=|MG$r+W1k>pa0y15RdgdrCE%_upYj9ko?PGScO<<^=t9($x2% zzt+K$FnYW_W1Z`x&|e3*{XFguynT)3f%ey$zQ4Ah|Dka1`|UZy>aQjLHv;{&ucMWI zq4`*pt@818FdVwk{k8e>Q5#>^ZyJoRd#(=jV+%%JL?5|JTZTBlrGB5)k253fllrWu zG0H?tr>{3(Hfr*7{l>o6aNo-}a`bfq{j9QdDt3J%WQn%~F?)!zH2L)r(ARHV z8OY08pDQ9SqqQFS%PDc={gl6tT7Ug%!=S$oaXirZHL=#_w!ao}eP1~CXPz;v{+j*T z2=v!2>7c(3-{*bkuTvZ1`s=}WMyc~ zQ-{@;Tf961<82d1E2ow>u+JGgpN^J({9bune;xRjQR}a#v6bh?+a*`z_Saa~UpH1n z_Sdmr9aevxx_AWo>!r(s@wFQ-cw5!>>qpQl(c|j|ySXq5>&4C13;OG`jt6!=OSt}8 z0#S+>Uw1bRtG^b#Gy?r~U3<`9vnIa}{k0)nlhOS(@aCwEudl8X^w%1W2e!Y)xc-`q zQ5ex*V@@7cf35$^5$LbOzaI40OFR>@s>jz-7-iA@HEGGH_16Py2mSTvEa8FLA9L4@ z>?664XXrM4(~H^!`sEU9MA;wBSx@Y6?2omScJ*Ixf_2;~@4vU;G>`7T3#{{g6!hai z#|8a&)@4EeE#{_mp^bmj@tQrvHQBu9v;Ef^>7VJ&dSZvufAcR5#^2%CcU|TEw=tA- zbpJhQo%f^Ae|unS(c2@}J07UM?827_Iu_T*D2?dL=Z_s$U%vYD5zv=!wFUik%cqL; zSMK@0UfJ$gzHlN!|J{fFLj?aSfQQ@M`M)pt{r?_$3Ad6JuBB}F60tDa<3d`1wMNT+K#hA zwPt^;@w0~sn#~xV^i7Zd;;;2EL9^NJHh-943%XL>VZv9p$sPd!8Xj;A4ii2clhdrlE7-c-tjo_ss26L@NjY_Sn1B@u4ik3D3wp$fOlW5scX%@l zufS*89P&5i)B+^*R3T%0Fqq)Z(j%HYRroZ|pv`=o67ZjYsxZ4MD%F2?A||+K{cLFV^Fcs|_iPj|w+v6KvFet7HR zK;P_!z0y@aKRki)8{L05{BG3xZ?k^~{r4ru17}Ys?EJ8VU#}JR<=saPt1lNl<#Fcr z)KK;}@BCWOU$b_4ANuPHIFuIMUjy)@kJ5PiDz@VMc-zeJK>KS9wnB71pUe&M!u}fb zrD65g`WcUN`2BVIML~bPgs)0g`S^MX%kJp@nuHC3QR=S;u=VEq>*Wgr{WzDK;Dvp3 zG_8uE>&K=iv314@;J|c--S0{&+v;{9wGlv0V{) z$yz$4#d72e24K_~7~0M&uw@)Q-Vd~!6{E1;dKz}U@2{uN%k8g3()QPl{MxOszmA~ZEw%24d*4IHf;@B3nFGge+o z)5_UerRwL);a!UEuiM~oA0>P26WC<({dN9~V7!-c6TWb~KgXl4$R46UbMc~JypM^p z$NI9K)!bezZM;7`Js9t^K3=5%a{8loNcPxu+%ou}+GAHuiIbmG>}Eh|^Lq||>dBu$ z?u@$|;Jpmpa&~sigH=tJr*M&y+GmxC4c++XhI658ojG+_vUTADRksm1F() zM}^WK+j)8 z??RpY+P=e*KXYGJ{&r5x#K3a)z3z@=%u@J!>_`~Se7~jAuJX8DvHi;_?a-U@fAKjz z6RDX+1yUyU!qHoBZh{h)vdS?>S}(VSxO|L4+c22W+C8LP z__ zeA->DgelgWH;6Z1o{~8n%h((>>*t3U-dg>7YG7Y*>mzpk5vtaq-0yPK&VGNlOH_@$ z-^EM&0<5^*{$a)Z{p%?7**bQ+G-IyHtu{HRrq^m_1bVTnVw&W<&$2OcRm_~PqUEx? zd&)uK?rx*mic666_zNC%pNb!t_Pe`#!e!)lcmIvE7x=*YvYr|1KB3#FxPjNk##GGL zEKE!2fg#-AVz^Akb}aYEb*GgvJ{<3WrFW%rtM$w9rT@2lz+I|7xE>3(P#+}07*)sb zS?7Cc`oNEmQq;ibp7gT@{?GL*ff{J|1AD8$r|^;Fu+%`!oq)zU3-;5&Ici`nX(qn^ z#q_-r^Vh>o!Fc})J~fLS?|-e>@TjN>EXk!=C8+VoI&cvt?)%k47B!^4K0B4Yg5Kg( zhKntIi67Dr+rq|ne{XfcUu?_G4uC0FKh<(A()P$29Z&JrSfF`SEWSEk{mg$BKMepG z0~NUVsbc>68@87X+=(V8-~W>crOJ10cieopIW`2y#M0z@c=O#=*n_j;l`h|3g+(_v z&fxBMp`cIv%&-J~uiLVMzITqGyZLTE`!z-*`g7#wyK_zslqKWt|<&NI~^wC9;l{e++Invjdai3s>`wy87ykkQVHBYH5trc5}2_u#fjA#e2} zG(RtP$#n*bBRem;I(`tHms`!wi&9PJ#dbo)q`@pXLS?TH!%3f3VxGRSlp<#K!{q{U zm&!qy|6cij_Pzu@s_OcGK+u3-Mrv$aYDbMa0?G(3qqqzfbx_o3QRCXE6jO1D5;RrN z&_oS{(Ns}!k2`9uxKt9V7!)z?xK%8*#-(^6Xeqd0#q$4t&$;i-osA4zm*1cHP6iiSd`d$HXO;#8ru0B1GRjC(XX`X4r^m4J-okftZ& z#cv2k)v8uBQbkmlXC|RE3l?}3VB)zvrHK~fl4wK3OA*HyaIk9Ix*&m1Jc7my9l8T{ zp)%vm(LZKuLaE*u;4+lJU!Y@i8^JS-wPw`Ul`zu--QES&i)!x^@c$yJ#Lj$#Rdd#0 zQ54ug8~o^P=z`&BsbNG(H9U>_Zao*R0-q(XfU7GBqXy#=0__mv7+Z$!DK5s%WSj|P z=gSdM--1v4EiVjWkie96B@rZP`@?`0GBjy<;g#ZkyoM2f?ChQaa~?#0dEtfDC#hg9 z_$04#7CB)K1?E4mbaT!={`)fWwGZFI0|obGSwH&zSx`Q2`{4UOA?mdPuz+LGBXO`@ z#N5RVtQ-(+{RvB&P?aFUE(kqxNWPrT>{{I1jWd}x#_Qba5Cbx9H6;JwWM(K(wY7gX zGGsn^jhu>`y7dDem4G5_uHdR;fvQ83@M19*l@;G8pI{;7GQA|gi21DrSginkrE38K z!MFoZz#xGOrT`ctK(v`WI~p@F0jSDUWvPZp;^)Jut&XIEl}pLX2)2x1;lYe6DRse? znnj$|LPYBUNWt=nKL;#`c_MIVnZ(AE&=j`sG*4Q zi9hz2&&-uk^7sdo3v;DJc&NZ!ikUH#BT5ycG&2-CbB1Oh%8bEnV-K_pW-A`-SKJ=? zHqX}G$*;@2!EIGTq4uhOL6b;}vmaiilM}&Fs_<4|Yo5d|4a$7=uo^>2+ww{~bBvm9 z9q_E|VvKEL7EUF37lZ+OYG`|k*A}?LDWC_0S%wFBDWBm{6NePc)QxLf;XJ1TAeInf zcOj)MaFkO(A+n4MvFA*kYS;?fIu!tsR%YgAF2wJkkGxJOM3!+O_L^DXR%ml70Ahba z?BN!8&?%r0S%wf%Ji_8V-Qv|L#d$KCWo&U8@tK>u#fPO7=iz9U@$sEFBsh~F+VPoa z8>c+lj}l;Sx4;UV4N4^d%h>i0WbrNB;xDHZC%P}DRFl8Mh>KoAO_j%{;QYvHw@pkPY~|IAffRX|tU5uwB~3{(vy zqZ>S#?-%$@4BG}@YvJrmPw1NgICsOUap0)J%qRXR%zS3ogYc>lXh4-S^<>jh`%IiHPL|=_~Hv7Jw8u^Xu4ssu9t6Lg3^PPEkl8UV_!l{hJB&txAtYrpZNBrKq^fZ zooOa<)nCj$$OYFW9yQ~|bAb=jFf80pH3zK?>4yTtV&*gy0KQC=e6SWcu%tiY;*1nt z`z0P#AgZj1swV^p1j9hp0Ftc{PiFCaw0}03Pd;5F(!e5S$K}LJ*D_TaT9M2jrJ$af?l1rojzNV49Fq`Bvr*jUC zV)IxG21A8|1c;a+GQXZIc`6(?=4e#7Pi0oA7d1OzCdA>ERB+ZQK1S^s7%_!q1*2Cj zNeqjnU=%fvF%JcqCm1anyJ{8ZfY~S^NRdI4LpqUjNz|9r!EJ@LcQe}~)e5$lLMo>C zhz&&J5M2-}0LrDJ7BgFEE`T$4@NDr09zID$DQ>tCB%%~2PfP_|b3b-lARi0wQBjh# zO)j;f6gS^sHKlP;U-Zuoy_Kg2${Lv3Ir0F>!IcPOo zU@WY_c;^6sF~b4YifCpZ@$pO#t2O~JMRlz3#PJG<84jR%xd8dcTs&{ZTel+TZmO{6 zr^0H_4a>*NpbY8Gvf9C!IDdf-GQ+`ZDWX|BINR7mGIb>@1jZCqchbiT6c#faSfbAy zF;V7jh;8K&OKs^CQEiIUE((Yl4j?L@Y)Eb85UW^}&lH`v2~r>676NpT84fHOgB-AY zVudX%mQ}nG3X2&ItVnKHKCz+}7RxHEAqtBbvi*>uhu{YE-*n8LR>pOS(nZ-WR!S$o z!a^uM5!x}^FC9-qYKmQOB>&7sX-~OfWw+SrOKCSp)so6L6ez5F6a$}4 zqp~N#!rE(R*s`$X=PzJX5s!@qnL7_Ug3K9^jYEoFta9~Z# z4a;Zt=@u5tDy$I-iy0|g69Lyu&A~Mo9ATAaf#R8Bc#b>Dr&pnrnc+EqFvoCdk&-GR zOi>ixlJgR9Sy?8XRU+mIWLs8YiTW;!E>`C+t6T;h2AP-9C{wi2(*RW%B%4@x9h@)4 z{SIPf4|g0;79=C3gY6k@F-6;2%IgC_1j91v9gLZ`kZn8261Ic%{z7oQRh=t>uw8_*F8JIuC2hSeU+k+eFh<5DT5&~Frx^);scKLQorNcEma}B@| zU1*JpX6FyK54tUd^jE% z+1~fP*gwF}{Bmh3{skEToP5~ojBF2n?Gk`r*}_#ohd+cTLU3Sv*0y)W`IJrPb}I>V zbi;p~OX-HMM$gH>*tXX>yn;1?$Nmc*ZQaNoL9AJ3js?fu+5Zrp7+z95G4Ak%^F3^V zi9-d&_3V^SkzAK#?hIo(h4hr`9G^a1W!ULZila-FCOeab1Aozv$ep3Tdm&`=$- zK(5xXpBC^KedhG{JA1Wbl;uzut9A>Sgjm#SSU`<=xiQmbb7M*UTRw3J6f~g|;)5)3 zRqG|al%D10SxiMc_Vx-y&DFNacoOIs3pAbvv^M3m;A^kt;>S$Qr2Lz8JRCh`^~vh@ z2Vs^gxwxkWr56`DNNBr#w{tu}L2Y=kgC7O=FGGo#Hohs2f~k9XJYRrB(97E|qA8nL zpuit{PV2-8JRYdpmB35Qo))-nqwsUkqXoE5$#vDPh9(R@0=uxdag$^`?>10iCP?D!H24MPSCZc9 zT3`$CrC11EkiJYu2*WE)2{jkaOEJE#^D%2_ST}kznEJZO@Wipz^67HO1fu`jFE}f2ENb zfP)!MbYIMub8Mrkux$Llkpdeju#o~ADX@_O8!7NVNdbR;9OBfX01ksQ-^L7pGsY>C z;0M5kh~TR?zdH!KgA)rhic<^x_|tihc=@#%v&hciE7TLSK<)D|p|bt+c`somXrXuN z{3u5!#P@D39^TL$hkq2lzD}Q)m8=Yq~Cd+6$kI0ZIMyj#0X5lC$}Z zxv80nPD*>FS*M3^9iw{GfFFoG@^j}X{L_cXXzEe;k=}&a&QoOJD`KvB1Nd-ipbK9y zAPP)5!$TrwCH@pVF#_%=qUD&>6_~xpX*bFndiUC|AYiB4cmt$=2mr7&QNiw(oAxVx zeA4G`>}`Jh^X0*oE6Fa$aUnO?c&5+`{JpZJ7tnEdJ|=wwYVf+HcX*3DoalB{If|jf zA#_k&X_?~2i_InW^@SL!geJzpSa@I7+;x@kRJQf8j+5@=xrz51K=FKPI^#J1U{}l#&X8qSee)3M&!iD24)Kc{*ml1H3K$6Y(xwa!bDg z%d=*4PF)g3XJ4gT`jQqo$=}l78B>@>(nO{j^{62e6^6j2h9S<5Fbq`TsD@2yNS-@n z)~X;22Z5)~dHBR1%S&e)K*cd*BaqKEe9XiSzvhvr4B zED3q#?PXj>o?^Bjfnh}!H)1mPJJONNx4nySjK^&+;&qJHPgZxzDYucnu1aYKBYn;QG15cP=}Jhtwa&$V^%2Qto%6NN zTWA-klq2SGF5TuDt4w-@vN@(48kz!8#IPMp?Ttu$l`?9raKvnLg=Gz-#%RtnTXp@% zHL=I1Ezi>)7u4#2g&cc)&c2>Ko-6le!gG=%b`{igmp_dPiK2JLJNCHgSl=Gs@W+3b zJw6I1VYT-7Lw>tpsc%^qL&2O+@Q;~aZ@ z*DZi@f9k7J4t@V+T*~M!9Z1yL9GV`@HK&|jfOehnyvqMlK!i=$Dcox%RU};HO5vH zbEdY<#JBVIV2q+_I6kQKASW=V6r-5YP=52pH>jVuia~pH^`8MY7p|%Hp%Mz3<|xPe z(lKP)`PzYB`1YY(D&ZYt3H3;pc@9@Eq)*d=d#hQ%nQ^(U6J|l)!&(8~!;GAc3W=g; zE>*oDX%mN8vk*1opftr}2ob7S?+WvC)`6K!3@@oRAsp|-)NisJVl;m zM&EZqW;5H`<8l#g3diau=6AKo#ffdM~ z7?C=8O@PRSNF>CI8Dg@-&`z8s$(cAat`p}{Jn0ONPyDHQc;ap{5vE&6B`}78s-M!L zavV9nOfqM_spZNLQ8;|!k0|k(P{Irmmk@Dd^Cd()%6zY@*W-90xQUGQD=Kr;lYH+D znqC8;`FDgzU?*WB1ek=?Hlpyx_o#hE=<1i+C6Vk4Qe06wj9Los$;8KW?HCSQQ1A}lSz}Or4zwoMRd8LDR6v=3VQTWyZgd3VObCt{Q zUZ)S8>wmTsG1D>cq0?V0Hw_fdOwPv^U;#114CHJ#&-n$XL9wLe>B6Ncv1y6k_YBHz zd9=y=?9Uk<40i4IdjNcW+n;9^uHOEvAUlD5+-XTu#IrvG;8H@mUHkJH3_iHzz>6IF z)8l8p{aN|@EcWLe*6|d26V~36_Gjdy%*tVZ&R@7T_NNZK4mCuhvq@`Gyl z7#eU4O`)H^J59pw)+FE>I?OLRRr#ap!IzW89*ly{A0cu=vO-~su1A~eRp-yTjRV)Y z&i~tmT8`R%J?Z?rA%j-ukEI$<*ZJWA(D{4(lR2{R=IQ+FxFr4msm{+^zwg9ZoTJ~r z|4MZ__4|`o>2r#H@A|c`-v>ljr{8x+K}c>Nj1KhsQQuI%f3aUK{r>o5j-RjJajxv& zqTgS@0#0`Q{{63s(9k^B_l8fzHq6>7`EEaW4JCTNM^)%;bBd|6=ONQq8S~TkS9{>7 z@8@F$Cr^D}BQ9CaODZVacE0giyRYvnrP7p=sS?_E!ViBLjf%T~b;Gc33$^Z{`aW(B zLDxm!%Q93D70p-oqC%o*_-NJllD5r3R^P`>FQ|6RH*oljt?(_$u{}9T;Y9`(;=ufmt4%znn#DU z9va{L>ssl;WZhQj19Rjx>`rgmSo9w1G0zQh57c?+U=2xL&96e6-0bt(`1NmKN@fHU z|C53Lvcfaqlb|p9-r6!=D#V%DsKNory`&HcQp)Bh!3iF(UDUD4uL2-}MHlhVC=Uyo z_qhw~Io)vW>0Ddao^{zbCYdWZOejZPt7@K4{IN5lfjwh^cm#PY9bl*g)wv7{bK1hp z7(+D4&`wPx$(foku2Yi=JZZap;*X#LcqXV)hM=Bwx9L1PLiH$RM%>R4vPHaE!>sj=sF~=_PzU@4&VQ=jC}p&aeqtIr%@Rhs-H*fnt!?`%T6e(-zF?s zDgait9Ei~0F4q^wxmDeYWK~6)X1F6E3PN}Rb_YXCjhY}1r7$v$dg|cI>y?405k9z% zp}k0lkEVc<3|4AGL>Y}w{E>V3%-kj$mk{x(jAI%sp~sLsmT~GM3uH~~>?PP-3pg6rvA6wyVL zMm)$O3Lk(51L8lAp$F_{+lVCM`0f$5AT*IzOdbO`ypQ4MOdPVZ|nD7kK6a zvR;HxL+qqCXs}rtv?1ct83*|px|^?zoBq&y#IhX`9Roh`=h4FaexwLD2lvQ-xg+n1 z_K*5Pw1Z1YzLy}%OHn!7_G*6i^k2JM^UU_n#8oyq?P+$d{_jc6SDycZ*%K7DKmQF2 z@!9%|GvyaL%_YLBL*_2O_FHb+bq791#KxP=4{@j258d z!n+G>WFAS9U7jaBrpQrRQL>RisytV)1hUqLJfFsW(bdcIU(0=Yz6>+EMvun+6*)iJ z4e}h5cemGrJn!nr^KZWfcC~rz<^T6caT1e!<@upEbIJ4O=X0PpxI7>FoI9$JXFCK5 z%JcL(U!IR?P+rL;&lL}7{(6$d-D9o7FM3I{ijkq2PY%+X%E>!@oo^Y@_gEd ztez>)LnS>`o}amWE#>*!zi1{D1Vo<_z%kxy0SWogi`7&*-9cm+oecs}9U!EWS z#vOUzK9@kAD`92Ui+$eNk>}ZXoA3X;JRfvdE_ojOE7Eig<+*lADYpXnvYGE}n(CIkU#N;(R%Ue;ZUEuxg!S1-NOq#^$ zZ+lH+o2k6T$0YTfP=5a0u8KQn_7U?C-a^aCFDd#pMj8cEX;d0d@clV-G6Z6Uk(qMa z7*{{KjX#jrfXHe>gg2aFGt#|xJ+2puMa@?avfo%xV!n6r`jfydmd$ld8i5V?l+u6T zmFvv@1(-Hrlze|N3OXox9~q^CxkmnCe*E|~K>Pgoe8}O)0-lG?k&DWeC=O3+I z5Pl50-)n~(hiIt{L>~g&fxLEkVsn7adnu{M7oT-Dk0rc4} zXZc)^=-u@v4nIa~&}gPU`@!z2uAzM`7^YpIKD)82Z(q}{G7zhhpFKTsd%;!t@8nkj zJ(qe}1N~*+$!{~Yd|?VA1B!cE?G?<8)3jQ9Nj9yP5B~PGvY$>|4c;5j#HN5wkH{0pC2d8l}wKG}5vcP(_8mA5?H4F3dHj*pkZk~Wef;ma`I<4T)_qg`F% z4M9yE{+VCFU=2VjL^Nw(0f4%Q_uxY9+IcxC^eQF2I`Ls=pCKrz54**-j*PuK4us2; zv0L8PR%+};!#%3 za!Um9@*vzy2r|;VPIf2wBH&zksm(SKp?y?d0z)+f^p-hzlc*Gm&;A%RvzKhv>Zgjp ztXQq$@u1n5RO3NDcP4fHi{)^1NvbD$CDcnx1p!_W5T)h{1z|rEh~}N|t@7^EP#hq5 zuqhpjator|3|0{K^GpK5{|ak`2V#>fASx}0O0xpzEKm~Hp)Q)vgM8S1Lizug-|z9? zx`rw8nS+Np347zkT>5PEDdZl}{%fMoFutAYfl_ z2IksBn!AyEy%|K+PqNwCb>)?8_4DPQdW=kVd)Ti`iN68-wXp#0^Upn7Is8+9i84wW z{~Z06Ca)p?lpUg7ApbNb{Wb89H~%c>hKOaW6gMuPkxukp_#=mZZkdhNa@mhH@ZWf| zPn!whRh2YPZQt$wUEGs$A70M+GWE}!N9N+6juVvl8-RcIInf`rMDMrzIQ$dmrg^3> z(i^MzOkP9&DLzQMK>i5^-1Q4JYZ#@geN5Iy|7@+ei;*`cKZn+G@sE2yTFwDUarHmK z)Obj@aK)`}H+I`}(KrmJa_E@U&7U|GfU%TJg{P z16=+&)UjWl{%NnZC6ZIL-ENQzzp^PMN73h}pLPv8`sur8&{i(~O3_ad`T*(oE%4AS z?py3KwkIby>_CVA-Ap1IOLk!-&Wi9@ZV0#i)~?gBM5o7V_LwjK{SgjCcK+*koDR(f z&|hN#+ULJzTR8kze<2#p0-!sMB%G`+w zP*!6I(&x!<+85Pl6KAf5-_rc47&$KI4nde42Zqa>FY)`V`(yk5#-lvC$5x3A6nXcxr3 zZtAb6IsREIPe5RN#p_qcXfsUx=LWD=BB?1(o1-G~lF$ivmGaeNDk{gN3wIM z^+moX#tSr-YIrO^Ojsg^0ibO5Mib7`O*^7IAK8ph7w+sA$P&G8Q3oNOfch}U{*Iyn zhbqp~4^oTA6>q*wBnC&2S!n1Vq!6!j{ctQEJ9dz7#_|&`lD|881|ZbA&oZAUAZyTY z3drB;CW{4m!VxHk_c7&bSuAU6S(8S&8eeS1N!z8qR`6n_$`XcJ2PIVV+AZW9T|iqA>z{*_fM1k#D~muGj0(3 zic)QerJX4g^rypnhu-0ry(ag-F^7p_kS5IGn5C`g*ztrC2;v&$%v*w!?-!)5+%1Ol+DFh3M+Z7f;;ad9tBsfC4^LSl5KWA zE1+41Jb#YjZBksnBVb;6LYt5J&GU&rHpgc+KTn#+$7UpCOQ%E1F(iB($z3TFim@;% zNk~By!)hkBAiDu?CQGwen#S8!C^-~&JisKQke7uM>_}f#8U(CTJOLB~k#vf%IRudK z5aNAOBmv6Fg%BtxA>x?GNOu{!$6y&Z`<|ePRsgD!nos-@p4=KC7aswhcL5SFgdq9k zW~Qp`eZFPfyoc!~k*M_H@k!u$%%Fqu$}hEGHL^(|2~kmQHUe~pfvN-J36O?>Bct`& z;TV!hALg5LuTmg27KnrZQt!9UC;r$3pNU%(Rb?a@CI{s!+BBc?GANCxk!?_zzN)kU zu%_Y(pcy0wY*1pgs8|nqBv{}T{d9c>|oho zI^ZcA@QFW*qQH%@8xl;tc=FY2h*i*t;l2F z5Y(Ej0DBG!0%Zn)!mHD|T9^QZtG0r0&5Qx#MZgA+$wj?21YDZiN#V7uV2cJo!O5%aIgc#~b zJOTD&A~Ks8B0kN=TW!3}#@iV}CrLRBeZ;)~fTC{%2`D!y!EPLJzUC~oIa-%F_u4uu zkTV>;Vcp?C$t%fp(q}$UHwR+Fil_x-M6BE|l~z#0;$;|OG#I)A&A9o{4s-z^C|&r( zpKk)M6NS>Y1Em)_Ai^@{0!+tPvDgBV5b+S= ziUFVa<4EwCrB|>Mh)c-0?W{7yi#^W|#YU33WpQ2xB1O_Z`F5XLf7zJE1gj7N%aW+Ro9};rRW(ou^ z^MU&`GmcCSJ|S@My~0cn&uV);?#L#5|#?5@5 zsY9VsfY%}56MsIZ-HlE44*B$rJ*wteg?IxrA}cr979~V{s%?>>+alxUQcmnpsLXGX zPyEFjC^@HIs`=$eWj7?Wx)%*bSa-T@P(s9~*#;T94Ki-NK2`x%_zm)jKk~WwIG$P` zdo+Br@Twlt`FeN>=67@GAi#lTj3ik~kY{it6GcxCy zGIS}!xLLwE4hq%#jq!;;!UND1>a89QikJmlUu%#zsvC(0-iJHrXe8kS=ZL2Huetow zAO{Nm=^V7-_@^Nz!#^#Ds9XQ^H~dVl`lr+#b0MU3QcDCoj|251=mT-6nBA!05TUOO zt#8Ul^DFD%Q~8$&SwXeG*0kmHEpP4;}{agu>g2aoc+)W<1~ z08!1VK!Bn3QlnB4mI+CwWSW+vjZsAS#2*{xGoi@ahGPXR3!@S( zp5qXG`g>xh%191Ss5NyRqOf38CstOy)Ox@GCmZ+C1QYT(J3aa;x z$)xQrLzlN0H;qRsqBM!xS3dElyoHXc8*W3y+bleWEe0Y4~FU?w&@YOm% zn~rQ!NJ7NhEp&#~OEm;M39p#&;}|i50_m7<=3v50Ak7wtgowBLt@DXLHo<3>p3f!_ zmr%u$cKw(~GX|v%HL?u~)73!D!xKO;NDfLjK;oc~0mEh~*WcMJ%1E;eQ8?NW&{31Q zK*;7wh|fdlM9>C1AR$l;GY%9Px+pSk_KRz;mm;Dl z@`*oav*H&S3D1vXOPKS+V0SgS2|mmYI&+WXfg{tCO&Irkq@K}E7{(8d$0KnJz9 zKuHIdKRnc`R9UR1FWrpOE_rUqI_s;VXNT5f?PoY_XFi=8F3vVq{i3vP5wksK1GTF? zg_Z?$)=mybCri2h9*ZY{k$K>fj#cRA@RA+bXepN(<7_l$-Z(h#&Vo-m+b?1_KHM*N zH&VwZmUTN52$rei+>E7k{;uRrLXj)Ckt^J`j5muR3{tp!DT??ddNfAlycEir^~YE($cK8$|xQfR4X1~(*uhZ1Xs?=rY|lyT9J@h;+?=|1K!#Qri0sUgCBWyHFyda4oJ!Hr zzu4b$J~V1cl-gb_yS||WzwsE_!>FMf<4Vc`RrrD;^<-@|E^1Z1E$pdiYZ5@4eD$=^`H^g|6-!HlJX5mX8jHwdwb8&wQG zi5TQw9z>t|ugvPdNdV)acYF$ZV->x-AN0|CV{umWSPvtWxwXhab<}*QMy2O3~@}`vd-=$vWUH2#UUsf*A0~ zKAVvrUk2P&MYo}bJK&?l;EC(NPk53C_m2lJRaAC$2KP_u+WPDqOr$FCdpD$|-R=XrWb8&}k z6=TJ9&Avr7ZA(?T<#NWKPApGCKXZzcs%L;U!2-lw=E8pAY+JC4e|Biy&I5fz+4Jrj ze;Efcb1LXmeuo0fJTOV67B>%Gh;6{3B_YOQe0^!q+h!>413>iOc|0;-dwALHsrHcT zyJD`)c3~ZceC^@zl7f?PH+^=}z~%AZkBgZKI5LeK%ozBqt2YLSz7#7kvKq^*+SVY1 zxnVhm2wd^%?tY!xEH0kU-ynQ;*Div#ZXz&myk~K{uXeSwlw8^`|MT*Pp{wYq?{6gO z`^Q~37<~&8KCKeHdwP9V`YuYN?+we8zN0bRc1+fuzIPIsN8dAW>UD$Dx2Z7~eNWwG zt>_!e>RN$+Bix74OCaC=89+nG!*p!I_G3R`)BD$&991pIp$6;9s;MXh`3@g_w0~IC zFtP3ZNOE}KrR6jR`SJG|9xytze=J@N{pBiFSE=D6J5a#v{0N}!Y(uqMSmB%HzCbYMtDZiKTsUKS@Y@6py=&7cT`5 zCG5RH2V+VHpxA9BEs+`k95eJlz)uvFZ=);Ll2&BwiZx4`?jukS(;C?_5}fvv3kEp^ z5 z#}Y%1HOd*cazHlsa~=lT2;s26-IE*S_~Z)UZlI}AZY8!3IWFsTzSQ*qPL)y;B4GH7 zr@H~Fer zrV8kZ15QjXQx#B#ilPE!9Vo=Zf89lBfZehjEX2TR#g~F=vU{w%S z%!L&LEG*VoOl#*1xv|`r~(57@eaF!APOU{Fyab>M{-Yr3j{_i zP3hE7-d8;;iuO(1E=6kLj5>LZ2B&xV?a!mWq?+TH zo&x6?y24)SKOIF)A#^FqoFmsIPL|WQX75i$!LY_|$6C$_3Nrj^uEjv6)Z8#-3iXoR z^EQBLmx(l0KO>T+eu>xeFBGq8^ZY#)FFAuOYVB1n3MPs^|B)&_NxS_Mi&wR|4tkMV zSGE_yE{a|}Xtvpu3!>(ZlB#|yILj~AZT zX}n(O@W!i;hgWjEw%bSW+OLl@UQ62j@%o5|eG8w?7_ee<0Ppol4p=(EsRLHS0ec;9 zKf41q5Oc`Y4VX7@8^iTNfqd=d&KOu|SARYd62(AwvEQ~Fz||UM2UB0)$EXa0fZ{7d zF72iI%lGiTG*R_X&Pjjy!}B${Q-ApfYG|NV3KO#6TkyNO59{tPU+V!Q0cvhVE4h4y zjQxuVOB$^u80mH%YvW9YC8$PdEx}7QzGkUMDjm-02(2a9%Std7^Y5^lB}`W{f+D8- zP#~2kI(>7MU`gxyp_SmU`3Y<|bP?{uFdtp+KVC;K1S)14Ab5wK4z~vz17~ zP;+jvtL5W~)P`v**dp=QeHs1(vo_Z+9Gtkui^&2gYdcD%fg+ zOtfP1Cx# zElN`Fro&kemY;C7`_0h*^y%oz;gAp+S2GI0r?4!N;Gd_Y1!>^=TZ5eb5h`M|zStQ_ zStm#9G+z7h8?I{UljHT9AE6Iv|)BqcumLa1>=m@Pd$`U#%q^71f?NXUSzz!neUF*LTHt=@w%l;j`1qy;$_-+ zUBK~L@LP5!WxNjB2}${mS0i}^^2HOZzVXn#McR*QD_oQKMOGcG8k7{}i4YQXFeK`$ z&q)sMg#HKzK`}gh^$78D^D55+B#L(4lmo+rK$GW1aYK#$|q&lKgkmIN+4Vf1{*#b}eM!&ClG|t1m9W;`BQ5-_8~#k^8%DvM8nS-~Dv`5=FDENC^L3@+X)7MhQwO`r=~j zeP`7dKVP{xga78jWSUd4gpsK5W{& zckL*#q-lj}<8-cq%|e7K%++FCeXCwfmerh{Wl57}w<{(}=DCC-FIpZ_RI&r&6XuZG zt`s>A<;KU26!;HPAm91ZmG!Cfryv9+-oWWYM=!E`zVoM)_F{R=q0Zm}Nah^smU2z* zbPn}NouXHYIn+;eOIM~;z`YDBg*v@j*ZqgN-d-LFGW6TUx#v^v`tgJ%L7r@bD^QoJ zh2?}kv~U~LhSkF3#`sz|Ajje8R=skZ)k9G;rGnj@tS9ExBc4a~rAMUX96g*FCZ(-? z(LI03b@yI?c@eEi=a0T{H7c2x>5(Ri{uWSGE@`*EX|*Oxnn}=+@U8rvhJ{px@PI}6 zrnufyUDtbr*PLfc8`<2Zy5M%k4~2q)r1kTfV@b1}Hs`tCR*}ETH|twMEU*hUPTBr6 zk^${A^giUoCT`qL^XDU?C-nKm9~Xf5%-T_e7zrwH{yMfq9wW7_-H^*Co4~^Dh>~Ij z2+f(713pGX5_z%Zcc>pv)Rl~2DU_~AR>mlK)q+?8#V4utic73kvXJhYteV~MGVXct z3Vx0$uvc()djSfu?B;C^{2ug@WVPDaT~q2kmQpW>dMs?~Ep_W{l2Y%|lzPRe$HJ_~ zUa~V2yKu%V-9ri~XU-0EtXlLkc$hR5P5^Sv$dNch#HTaF2r+bDq+r~{xSNMUD-f|S zQm`0)1i?m_+se?ROvU!TSX}%AWD(^g-*b6e!GEUcY7URSb3uWEvA%R`B;lP4M15nO z<)~wfZ9!-|cb#6k&==Z>RH~CN&^43>;|a>|E#rMe-yNykQYPhOMjMvLTwageG?1;k zkF3`ta=6K40h;D6_Xq)gqG%T@PyxU;e}2`K-&b%V67oAm-+KcsMa*g;h)A_75?^4~ znUPXd=aT#2*_Uif@=81wR5q4+AG0L5ff4QOcql7JJ-o|vrd}&IqBKUam_7E=UO&$# z&RZABR7|qHK^%i61yd@@T?SDIj6r;2E5Oa|ak=`pc1bLk0kR*p;L;n;=t8NL#T&4` zhqd~~j!j|g_U`E33}lgIr%@}(Q?qN?#h0*{7V{X$ZEwO7eFbY}3kS;ax+7#jXqk3^ zwEBMX`9AB2kpREM&HjMjxV$jfz3&6v1GrhLu4IZOZ`|B)7Tbo{5tbSN>H}*4G*#7! zH2`+UNEqm^pXuaU+~4OX3gMHQwGwbl+fO)NMW6jsHL|4L^0MnTPsE}-SOs6E;DE=? z->yLojH)4y5O0RM_A~=U#J+arEoiTz6e+JN;X2PSW~%%}Kp&wK=FgLRmf* zjp3H8!rCSQQ?%T+5hb+0!+Qa078l?&O-N%y#G4ogjtpHD#JG7DDFW-Nvu zIh+j;?ddFf%mAU%1K%jxk~XHzQb|xbdvBqx9Xg@{I6UoTI}*eag{Rh$y8=-CTRNnt zf5#l&E1-IxWvu>Q$>QJujJt)`no^wVo@H!tx)L*SFeX|2w<*P`2~q!N-({DG;JBEr@42_!)tdKl_Q@|d)|@JcMI>9R$C zOvlY}HO#$G60xxaSXATFgJ@;K9Lky}g-Hh+@JFP++tKN#BuUT3%lhL6~cPdFbBarrFdbjO#K=6DiTG%uu>su zTg`Q~c(;M52a4H!HbL-R@z8z8>=aC}0h*{^jESt$^E1-3%aw}0^bM38Rfu@*ZzCqD zy76fv1^#bRz_s7GJ~{-?pu&90vr#fnMYP;JB)f_QraP<~lOyyW%FWVIlrSvC%2hR( zEz14wZDuCau9m1|MO27t^h|*RSxtU6q1>EI<0$YBm29}cq667N#MX~-W{ZE&#;x60 zI2MQIu1!1cvBraz#UHMLW}+VzLg+X(jZDURcDd?K`-;tLgNQoH>)Sr@er<6~AZD-V zYP(>Iwc(5qQ*cPerd&*aT?uJZ&gT*U-zyv2-3-L!gdL8=SGBSfs3&jb*`fz^FsPy4LPjIaC_`m|HI0bjI zT;i8K-z&=-V+dK^>#}A0ea6WUyOZ8A+wE!}&f*^vKYZ7Gc*D!XIb7bSi!G@3PZ#65 zKio?LzTz8KLT?~wvoBoCmTcsMy|k}NVbE}cz7Vy>9GzOh?(d^Z`YuuizvnvXjj@ln zbR#z`_!6B5g+nA@sd)txdf_fuWjgH?!bqlLV$n#|H&74R&)dh$=eyDkY{fGCHiRBG zXGuHr7>St+&IVfy(u`ru06t;OD&#B|g;WIvHE{taQiAj9kV_?%#M0@Nvc3ljWIL12 zMY7AcNnKAY7G7n}Z7Y;ZS93_x!NWg~u^LisO>XoCBxe4+oDG1dDe?Pvsp<(O6^6s6 z_dJL3fK3jPD<4v1e;+dE$xwE13G~+RhBk@~B*yBasOfVdhM=~yWBIB4k%Peg3(42^ z?hK|+zgVuRuzUWyNVz2a{5M~o1${eRi;Z4^g6MWB)?x>9&0>9>XZiAP78vP!86+bo zA?18ymg9{z;<2x6DaYu$MvTdrnU^E9bAV;1`*VOwq5=&$tf!FJ}1%fts4pIlva^CND!CW=NIojL|l$wV>r6IVTC`k_~iXlxqN z1LJme8iQ_T3&}PkXp_aH&05=L+${dJZ4Cox1Vd9lmascZ`DhiaWey( zTa81}Ekg5}LERdlV770E2_S9S5aW+fYY>`(<2lSQ@Pd`BWmU){l#`dL%bzj}QV5)V z3nW>P_~JvI3(Y6Iy%ceK!x~zN5zqa|+liu|FIL{0w%Vbzzr@M__2kw9sWnP(Jy+UV52YiGX(nnZ{va5z1d`>rq(2sygLo|z4&&6-$ z0(xaj8BlZhO@M-?ab#P5`^~97zY!mhiA@ER-=w^{Q+!l@W4?_2=YR3|?aNE;*u%%M zhimTT)?}jS`@bpu0;pu#X88Q}$DL6FjnzwI!f&=Q5R@%&EVWJY8;ePs4Ytj=xy)-* z_^p`m2WXqu*fu3?gx6-=9Kkl@5Rhu~5qPK(Z@Q}-kq6m=*R&M*b$@gKv}y)5_|u9F z$8v;p*TPQ0O9fkDzG``_lLbr5e5_996EMPjW`Qyv*~UC|iQtrEq6j-Ov!@X6PgZaw zt>I}q5tn+G!{rp_6ZnGg$EW+<+Z*Oj*{UDp)5vxBK$-(gp88@HOw@!q<%p*7l&`NN zSzQB|vXJr(y?|Q|798mJ@})BPuD4P*LIcO3fqQ(6ZmI@m^hk;7ju^`4@KOBsL)mTn zP_F*<{(ZX-n$f>YR6)b6D=PbNaiM_<`;$MTw>d0dF8OJafyDjB7$Zl1rZX8lQHjvX z&!J_${4^pJBi)K1Fm6ApP$^$)KpS1a!+WtyZ7q6S64@oW}j$C6B0 zRZ4kdb;0F^4-}U&)6>HRXAiLsi~{C4P6iW2Keo6?+GkH%T*}P*I5r~sozT3NP?u9T zv$?VQeLiCR5vt^bG2J1-no-M&7=_cWa%rl{s}(Uqpoj@15wRcU6KlIfdE6Kw;uKve zMrtW>KWQ_;eavS{M@b7S?zUbr(WibF_#Srq%wLQ}L9C5$1t`l4Ptk{EOsOE2Ub&*a z9jlgc*^#O4(&9vjzxiggyR=Bgp^Jo4uI$|E7O5cW&>HAFfDP{7>A z2`Aov_{gyXt&jV5;7P3elV7KzY+#)5Yc3?pPz0mFW-TsEQGR80!R1toOWd5|;gYlu zg^J5L7MEgFGJAWt#LaHRMb-REn4mT;fyiv_yT zVEMNkH7)xS|xVf9q^~sNwt`UGW71Lc4Q6~G8K)9Lm zAqdYp$?xH{#9iK>i$TQAFMp*%N1h-nzVe;0VkM$ESkYt2jp0TL{GX#hymnD=(Fx~u ztV-)yzUvPcyp7Y9n6lQkcfk@$;mjaKuz}vlcCdSNk@8!A$hWQB!ZrY8iLOroMx(D7{r-|M#O4RqnGFKZqgRfBcOoe)(50%Z|$mNzC?wq}UtQlG> zyV^?96K`e|2gYtDMLW6NyOSKe`V0>CuW@jO$Va0eP8q*1JlNh)Ll5ozNpf$EqF$ z%%Pm%B#LhRlR5yBcFr_Qm54cIE2YW`A6mVIR%QOzgJ(eArn;r|_@#r!BoD6yl)E-QF&!NXj5Bl^t zlJB8_x=DIWx6p8Vk_RnGkI!`Z=RgZh=+VQ2R%TZA0W`Sx-9H^)0L7jp%JoY#iIQeR zHb&Qt0%DtY$8Z8nQlI0FoKW^P0~(EGu)3~2PTI!?tTX0skA3?UV_QM6zAxR_j7fVx zvn!WbWM?Gh{mg^*hN$JUo?XlJa9~}EHI8?v($?2{_SGIRl4iweXeGBj9f7MP@sbBF zA)2tHoJU~L@2PITu}sHgSiNF|R;%?t!k6MQ$;HAED)DCha)xTuD)$p9wr2tV`TLIX;-=eOtui71h{VIT-;vWIz zB+`uFN$NyV<-4jeByE>_MPt}{MbNRb1R(GMtqtJK=reTyEBJb6MWAXcp0DC2{gYUK z#M!CZ6~Qa^5;uU@;72^9=A@qs9yI9Z%_ZOI+V`Tx=$r@S0tEsFDd*th+K4qg(t7?E zWV<>!tF6bNcs`rImJt4#(OhN7I7>BvNX{c!UW91H&&FmyZmXB`13;eXr_hl=Jsu}i zxP0P|{opfmTTzs83DJoNx4&4ZqbGV3Ue!v0;1df+SqY?rTa2|tj<}@oI5Rwy0Cum! z$`Jjqbjzg}9S72HA8~nhH86qpucwUo5olyZh@Dd$59DYDa$U`pT(h^1tVsqIYdORqLj zbolG4;Uw+*+pLC@dL7V#Vkrf_U^x_Lha3$(_6jvWOTOl)LfsHesvCrXs@>UE0Upg+ z-!JBOQuNF+GtFIcE&$d75!F3>;*T1I&xE(a#wDa-um_c?H(NzR<6J%Qp=Ewos$2ET zh^Sva03rjZ->#y5CC#eecQ985RV5$lH}0ulU!@ik7eJ5@I0YF;9~rtTm2vap-;@wB zM6_Fc;;(Q9P#uN(AtdOKAB6XjysM7EhtKSg$zzIQkZsA5ZO`!H-V?%PjnO z8dp13!;f#{z)&hb7ScgN4RYSv@nZzo#S`nyk3Yk#eEsp`J~(v8Zso;~w_*DsgCF-K zKW=v%IUt1}$A6q3Kem(IF~6vW4EXaZeG!a8+lXwdA74Ab=f`=hSGO zoKO4_7@ye(c<0vDo6iLzdd6X9HBjjuDDzyq{|w)KI&-}8ldz4-2#cEsBREdDi+tR9 zim;zw?65t628zX4tOmu{M7iI@+5c3cHA{+}C!y1=61RKXUXw%ik&`)P%tIQXm^}c} zJBova`hEO{`$8BBpAN33X_FC<-!7nLGnFkdiE<2zB`WwrYd|Q z7cd5azoPJjIqiUz=}f2E1D458{)X?jI{CW@OY|1iQ|YX&t^6JQq9cEH?wlrnjojWy z6#Z_FBY$V!;L6`|AeJkCk5WHn%HIig)|^ZJUd4RSHv=Mn1zaM;C^vy>Yb<{Ym+0t+ zNb)T5_lOuPm9%{1uMCs(H2Hgm;sX3c?$YJ2=X<1^mA~B}W!dHL#oYk|#bQ9y1Vk8J z`TG<~iA^*M<8&f_v-irBzem9yS>^9xNQWHC>v%`_VG*$j;c>HL6%in8*RwsXZz3I!}f-n(UOZ)e)*^d16EVUd) ztH#k#`$tz3_HVW$e;;4x%HLb?=Uw^R!@kK9O0$2Q^MjRg$=^|bPnW;?9_ZTI%HJs4 zTrTNj~T={#HDk_WpTd2d4Oa5Mkqnl>`HYK37wSRW#P5HBjX#ai&OjG5r<{cDX-}3hwzpARY*Uh8v zkvjkTXg?p-1$^ycZSCI`e{|%p=df(@7sOPP_HU*me;?Po^7j^;1y}y|;9zFT-+Q0v zaO9G|qp*XSDu4BSGXMkFiEJ6eHH^MUip1J38P z`5%-)y8WZL0E6j*LHhjf71GVKe~_~5@^=`{;QI1cBf{v)-`UoS&P)D=?3O8idjMos z`Rfbm@a1olp^AmbUr=(^UH<0M16Tw3`wckR%HJV&Go@ZAYhNJg0%y(Kc?d8~mA}9| zw3AEzG8X7JCTyg@Mha}Cz(xxEPf{S?{oIi_*n(BYEa#Ii|0B!=vhq8hyhi)E%eYkx z7bI;zcMssgZHpgCe>UwFp*x#IQSw@j< z_bayF$@f=FSqaOyVRO`>)}n{a-als7aNtQG$~Hwz9_J-fb!WzIQ`oadV|o1d8gWy3 zC}xzrk(ZFY2D?CWAx@&BOv7W2gBrU+98}gABull}ov2WpuH(rocqP-|>Tz9?VW6rH zvEZXwj7dz~-Z6iyb&s2w(Q%M<02!mpRsj6X9lAX9^&{H4q&+|0y2n!Q2`t1k>SnJr za3Nki;l8TgW-p5^1PGMELJ%7wp6a@8?_XoZbW_nrUeh<9bp14rWd7*x@uGaR5Ftbv ziWfFlKTuM<74>7EgGV)dUyh7yXUWK6Mg8|Yx|Q|y$=9;nU#;Vq&wYO1{?uoZBxZxW zQ*mKaDCYs!;Ob(RNe0g3T!uqF1Vao*(q)n(=_4kJMm_2<$#&y>CfNdW5BZ=;xlge3 zyOJzE+x!yevp~@MEPWYTCi!QJ&Y@(m=VBLIW(g@wQq8$YqG;Yj4wKw*xyvL8tn!QR z8#ebpg2M9NQY%(R%%j|70&@z%FgAT&l(8YvGj}`qee#s^jO-5f8_R&Mv)@?BWb8LO z@_X72{?G^)2-Ey%nvYc#w}gSlTFLKEg+v^h2M)*>n#W|JqUcpCL9*ytbD2LhW3X%^ zvr8+#Z$^R0YUH;sCPAM3{=L~5nts}}_qLdo-w$Sun_CIgpSdzh6EtJVItp=aF@i-~G1tnMCjqCfT-& z3@P>fvDl*_lavYDiIP{HCQ4pYRlQ|V@^8=Z2T--8-S`Mn?W?CkP;tF&tedsA&XjY*oh!yO9IfaLS^ zEqxcjFrn$RaY-zY*8g^oGcHe5xuS9pG_I>pe}RJ<>%ku?;~?g*Pk(rct)}VI>)`Jh z+0{z*hwgk<7$loM{hypfZA5w_1=bS<9CvfI?9zuTe@qqQ`W2ydp(E9W3NVfCw$^3Mq+8yzI*__3Yx)C0142fOZK2N>hLxRt3NJP#TtioU)}?SP~` ze1WwCQtwtA8xhAoq{#gRd;tCZ6l!BPhXG>q5oq>PuvE|E?#tUu!V=%F6|R$R#g-#H4HktzQj=9;XbA=CvdcoO%H* za~yH-^onXtb?(PXJ8x^}8Y%$&(gcV6YMSWBB#NH7T?I$dE*k9$&Y3vxA%bJi+deDD z0EYVKZ7HEA*oN95KV~nlA;u`7#cb$PIiOQC_!ezQ(h9tWq}~d=StXtt54$#F9!@un ztD8{dA^KWTp@9t%k1&okHHPkSP{z#+a5O8GA)*UbeBw`Ti^NPIhPVdPozKu^v)^(CW|O{6?kn zLyhF3%fyxVm6;RuFccq8m35+&Z)Oq``zGf!dDQ!~a=xDuvD2MtfN$zBnxak_<6wmV z!c3wEiuv!YI#`l+>aQ$UNWG)5YYVQh_sj~G_fa!)N8BDnBV+WkZ5g&z?6t)h+v0$l zS8%uvC3m`6+mf`ugEYX(UL5t&yCM$G@qXSF#h<+G$B4Xc!UyPV2L9_Nl7{sF^3+I7 z+aXGl-!LM}>n7w7u8>Ly-YFGG&q(Mp7}L#(Pbz~|Bccq(C;t4`P0CqcXmc=DWqG_` zQald(2vTDXlmivQVKpoc4!iSl;V^PfCWo!HDcD#s3kCAEkGEi+ncbhf?QRSfvNpi} zPM=nC7&TzZ`+7%XMKCXaa@$#o8tvmBJr|I#@6{$hc#=jFfBz{&y;T5a_VpHQq4qP; z`vMOb?c-MeLMyd-?eFNzsyV-(H4hAL_2Gd9zCM)KX;aT5RmdVO1S@Ke`hk6%?0!gV zKE+7wW0)_%(v3q>miJNavqV?%K^^n$KyZFjvkBx&Ys+mO_o4@KFir;S!nKSM!@ zI)MdbXx}#Bqj{F6l#$<#i0URj@keU#S@{Z$7qI-f>Z#jrD2lRt1M92=VOSV?UP7<@ z_79LM`aY!D9}M81HmYH9uh{#1odgjknm*){gm?KZ_3_u@|LKQXh}TlqMUyLRlM;Hc z-httR(VlAIHxcA>7<{g(FwuM4MEdj0bY=wO4O}L^(VlsdoO>iE>uIA_Y1Vtw-X1~( zahs9uYJbK}*`qoFe3@G*EU$SBg(%2~;MA2w>Pztu;!1KWp`uX+K!hW_WK zPjcbV-mkMQ3|)$R1pv~7=%(Sju$Jv5?H@o1C2hTru@>*j*FhZ4G&kdKPiR9TCy(>W zPI8(jU&UwM94(-RQB5YpZjs(zy)P!yfgoE{`Fb> z&wo4xj@Usio=x#TYaRmNT>huS8XF(~3n-AUe=(^emwz$%77X{A`xoW3-^EZzj{UBr zn8#>g<)$6;1lKJx{fjT;5Gda3?&!e^aR7k@z=KL1Jm(Ms4+NdO(3NTxzvL!pY9OvqLKx1xrknQR|&tOJjDg}{gW8` z7X$#Of2G8-6u4}yxM;K?h6{J>G!lB*pPy81$9#0f`(PJL(kdw$QS>5;9zO~(nafw% zyrwMsn@y-jm(n*TC(>=-Up_t9dThXl9FUY{A&AJZ|a4jz& zrws0YfxLExLca3c6^jJmF8@4Ou~3oj^5`2$zI^8kxxQDCo&6!L&gUQAkqK(X^kEB3 zMJWcI9uK=v&S0oSt>glaw;T--E%QVaGKZU*5G%IQhI@_>!|<~r@+uLNB^-%WBNoxT zY~p0^o5a;vWR6@?z*d zDkGvQqgugKr-2Eva-3j9dBzAP7O2{RDHy^em>9v}g=f@PXMs=rIXH>(Dq~eppVS4g zQVR^kO#&-bVAM1Uj8FVIz#;@uL0}j>UX2A{k=2)syVS-dM4W?7 zhLOfOnPOoHkr`kdO*0Hsl`u<^e74l<%axhJD5UN3i9eQC_$$$Lx2i+4V=P3v~a)%}YfVVi1v%}r40Xx3Y`wHMLFDZq)MrU}||8?iZG zTekI1m&QS|HW@9scQC}q;fdZa>)^$yTRi zu`M}2wd6qx^CqX{m&Ys2c9bNe5q6-k?hqg=BZQc_yB-|@pQF3N=eyqznze+OHTQSO z0!oJEQJrC+>IfEH%KnDD^Kl$Zum0=yfM^_v@&!N{WL7nIKokkD6j{p3eBzI+%xC7d zvo*veM4aTK56*IOe_u@Q?~92!K)zhq=CyvTcRZEA2DgnljHR63^_|K!W!yp6w^eSc zD@Qq71gyxW%tP1M%j%fN%j!BB{Lb}(Qdo37VS^m)#3)HkMoslxpPEr2QMFIaYCE|N z*y;=|HMwwM-sW~J`cuJt^hfGH&sS7|855J#WL0yltaM`E0uiMqpZFv7_)KUkEHx#} zgPPT>=e0i6wl0aO)D-N_#?=cAfn{-znl-4LM$J>Nw$x-^lA2O|_E(_hP$CFwlAA%z zeFR^t+HYUsQ?r`X{2%~PRNm}MON0It6JJzkXsH>(qp7pJR?mF&N9rHISsJLx#3VIY z)pX&W9^f@1qSWLQf21a#nHyw?xP*C7b1KVwtv`eLDqELCP*XTqc~h{9T%{;9p;80B zZPV};OAAjHF$)o9;l|%CLP#hj+pm@yW{cldr{(C1-z_Uuculv=~7-oX!e{>-DgW9U!yTDVJ*D0=S-s(4QI5=Z->Ss(U4!K+>qLNr=`o-XmJsaGz*LHG^na7H^f_c+Lx^$A1lyG+sg{ z)8nz^zXN!AnM2IGI77@aJ(iFHJ{J`=&h@!hCqP-i|G>O0$DX!Jj84|0Qy1h8r9Hu7 zOWJ<^`1drq(*?QbY8ACoEOFn)Wdv_Qu67;w^N;a>kpMekhcsv3Q~jStad7iF-*g^7 zldALU8dmaVg>g6|Wo8H5zW_tQ$ICxtAJ^%8)6{!ufb7!8eKSdhEG>~uyByv-O4@p(K?Si#;^GKub9nR$!x!ROSx9fRJkPdez&|GHwZ#}A$;@D} zt|J|Kv9={?gode57Mot^G%mr3mU=ara!N4G@tm(a=z&StTktx zZ`ur=l{sxC2UNUk8F{Y%Pe#&&Ipm&HZ!!IS!b+5&tJwK@%3ce7{wilBm%p&_fpZAL zUpSM@7e+v&dI2r2VyQgNOQz~tqg_jJ?=QXf9_6fh5WyS?b`Z{DjH4X@98*e9I8k)o z7#(d%+woA#SyFGy-wS8?_m`fJiC{Wg{n9qn#)dw|NepR-F*a1phHlX1qK*r-AxUc< zVjGfr({Mz=-_NeViIH_WPk9ap4eU^c#+4oT#9!ul$`4-5vY$N+exW%ABVoBg#tGao zeG-y#?Prh5GJ%Mp-PNojhmdVo^}hMk=ZXj`L5#!Zn&i84Ti{(_4m*2d7mvg8D9oU# zm~Kv&b)W zctwsI%j1Q3T|E=)I@LYbdKRg#eWv9L0*=upi@bIqj z`mFC~PjZK6S8Y0Nc;<8eGf@;d&l#Q{4swU*3!L$=!((u0Rp&Ng4o~lI8BGq)#aQ8k z^yC;G*Hzj0ypaMK6v)?KE^J8kmxE9~@dmn!w_QSp+#vpPA1;Js`pZYZqRE~5%a3ud z2&k39UtYjfp7rG~U+V!Q0rt8Kt>l_3r25O{Twa7fL!Z*wkE&!cmTI_o>+OGj=&Qyu z$%WgAN@?GF`mt(%yRdpXcJ)MQRGWRom|#U!8Wb-lB#&a)G_|gi?>*hEW~P|NkThnSJ)RdQ9r=azE=~Rfi^s#z!2J%c;XKuGX3+zxVV4PEEi` z$^E^jHqhF3ae?@idZA^?_nxj$Ab?-a!N>M?=6#aWi4NA08M;S188_oO&9aNl>gjMz znZK40{+Y{ZJdodJfiMhICBOId9uMec`QFpH4{ALwW-DAi@yGQ-J`-vyp&~9JI+5r1 zp8CBD;IIo(g30{e)8bz++ZzX3#c#eQHvViT`MoD=zv%s#Q5Y$VAEg_pwOiCAM0`Hu z-0nc=Qju{pn0s+36!Uw_C;m7aBXshEVbQibP!#tU{8ITy(!SW&@)1j#5ATt2U+3>V zo%Mvwkm}eve64)G_cZFf_42)^FqaiTj#8f-eBy64-+TJtQlH(IKmy4YLDcfMFAjza zYQF!HIWoZ#RRNd!^ed6H@q14h)^7bL0KCiV2CD!dKZpeFef!|JqqjPs$XCl7QAjlAZp!D?j(# zq4u#J+2-J70yOz8g;u5x#eOmLTKUe~w=>i22ILDL9OfT|Ndw|85}pc!Dbr zney?)bDG?#e2m9R0#T!U4Dwt;M%Q&cb|JUWJo)H)FIveZAF2MOGSSMGp-}$rXTNMI>xRgh^SJ%L;FIL}a_aXA_Yf z>1!p54k~v%mxKafR}G@E54TLDM%i!sc2`*5NcFDa66RDM^)CTFZ9g zN>7C$Jr#s0o(iHS@oPfV^J?msQJ3(?m90=c4h`X1TOWpf1B$Dpc<=69NV%-Sf{pj? z4#@)1{1ePKM3bZ9iDs7NtV*%yD_d?yBhH}JFd6zRj?fO;Zg2U6Rw22t8blMLSI&?q zR+~rEX|TTb4`$Z2I7m^a@5J7 zC4V~c2lPvHWwrSdE9p2>qQ|@z?T#)fmsFSvg@Ojk$t5x?SV1V@5(&WoOBqLh8M<7; zxH*S|i9+@K-}_yt^80$ScV zLB2J8;w?&M@qIr5VT8<#vC{!GW~Oiwk|;}NBW6!bTfj9L zKC>!iP$UF=NJa?}FJ>G>Vd#>PaTDTl0Sc8PqGaR~e;w@kXH&K3Q%Q0I(n!x4W6wDc zGq?U$dcLeodoF3ufzT+4Eq~T~3>LG|`Gji>)qHNb1_%8tx3oTLxrGIm7hWkEgbSft zLvfjVq1~4kUMPurXpJ)6wF<3cwHh@%nRYE=sy(XKFwzY6Yl4R7*wW<}jYO!yr|#ZiA@lpghh?rs~|minb_m zj1fZ>?R#!k%2U|Q1$ak5D9;#4SHsk*@k05=QnS;Slh0VLcIkX5*R;?I?q>4XYYB@{gXg`wo*kRQ8{K*)r$=~#Hx-K?J| z8g!EmSDY<92LglacA7rVLX;5gw=s^+Gju!8xS3L|NK%XxNj~vM%}(eXjQK3OBR2#S zMZZ2lhhNeT-^~s`OPYOez#+(as0+3Y6GpagR7U_m-aya)(iZ>_Tq`MDv$#>3wHhl5 z38?~9{^XtqM&zCcK7e8jUo##z=^zCWGvvO(5YF6R0ObaUGJ%A>r#1<9SxA5R&fsFh;=_&t{s*4O&V?>%7D zXs2=gpf<-@rc{50>WND$jZjgJze2@Ae}&4(`YX5d`;h9dP*Eb28j(M^=*tVYqz)IC zPqxKXX1I0rAc3+UwLYB^9a zZ_+_a6m=Y@R!Y*ELe@%2y+)j55GO_83zm!ESaHZ)C;Tnj7HzRP-D^uNGj>+kR^c_$ z);Y&$Tavc7*Ot^Pk+xt#qb$G4U4pUalGDOAB3&)d>9dG~x57I`S9-mgkDRr5Rnixn zEY(cwOkBJ%z<%a+8UcC5&zK?NFhbrg8Np;`o9j@4jkfuXURE_=18~mF+3&ma2TBR& z56_>22C-j{Xf|7&WxX>-{2`R3K*|+LCWE{ogjOgw`+w}c3w)Ht^*+9VEJP%1M7E}0 zR}C5kbup;RO*a_iMT4%28ZXr-N@Kl6Of)KLVn7p@)l_Z8dc)SX)GOW)ye5heFIB3& zV67T2trLSSiefC*{Xfr{dEb3^vl|w${rCIph7a#M*E46%oH^&rnR#dVqmg=22AK=i z#wGXik-h|XS%S7X0R^H=z)}h72`E8~5#Gj`W7gvG?b_s{OviDZDT+rb&2 zDtT!tFRhNKS-bc*d>?8=;l)f=|k-onlQ~ZNCg@L zGq}CiID|NWUIH1U%OQnT@$WTV>_NKXOvEz}(*Gp`Cx`1MQNT6v`n~`660GUd+k-vF zl9&E1_TU+_0lKd}c*n1G@<#2!7k{Nui@+ZIkn8*J${zfw4UG0+4HoHH+Jjx9624j1 zkgR&B?x=be;%!vVeEwdeRz0gF7aj{#5{*%#u7mScL|l!!4IWyGIBide4q7Cwhz`=J z+HaH52<#O>XN1P`KMLrCu%V1lFaHRw#QcAos)dcD-S$1VMxay2e13UfEegX>h!77L z3VeI&M$_V;rc_=i54d)o%x8aqI`h>X*hXZf#fWIbfg%1SoH=mbBaLx+)4uG_F|t$& zbBIpGF$K0HDXE7!YShRRnQb3wrU?TN6lzCA_m(04(VVnx;#wBn!2QUW|JXw{=_M`TH>4Llil7O= z4Ym~wMk+DD#LdHqxOo@=?f4SQa!(V{u9|@Q2`n2BN%Enj(jDgLBnT|fZ12vkhZ~EH z8T9Uu90B&Mjjf;oc_ZE;tv)SpH#wNDPCiYOV-+Hr91QU<`7p-<0*P^en%YqV;3dWO z=S+pxR1<&89P#I@W^vdccXG*^`-RC(QVgbWw))}C^E2s(SEh43Hd#LeXrdQ@0~`|_ z6WPK-C8*9i-G&$|{0j{wE!Kl8!v(7blk56v%=x}31AJDE6<%XQWplq@h~}EJTJJZK z;edCw8*jb1qJH>kh1CGKo&Y#d5iJb$48n~S=oXijkdfwsj3p=N>ZJ~*4DpYcGE7WY znYg?GFrwT3*cd2^*=U<@)3&9qfy>6U-TsMg+hW@xw#|}iylFe=w9OFz*fzs#yUWDo z4S-by5+RTXN+>UR3@J!9DeGV-BqnIO1#5Ql{d@C`)}W|;q8!a+lJ7~v<$o}et^7V3 z+k9X_XTKmQLre0$GKHg&Q80NyvAa(%OBP$_C?B!~4qcwrR9)ZrXQVktv7mxbw1;T>SK z+KO5Q>d4Wb#Lc=&Cl#x+>e)raR)&l8iVNXr;lPgvd2p>D<&s^p;uVoiOIlpA$<8a4 zJSeM{0)DMpJ2DQ0fPnR+mdCuM5ckI^56XewmMPZJTVR*0d{WC%yW}5XmY`&13y!U_ zmFDG#`hD6v$y}0tEdL#;+0K_?RmthpQZ@Y{G8sJd-?zWRr z=Ur2$O1<+U>!5m-y5<2AW0i*0JrxnmDY-_D_Jg_{`y;6OW|>}pOWH!O@$^=yo8YNO z<7@{SEhHG2H{zn{pgu+W)yXY>lH|HyiE(|uQX@jz{9}lJRF;bo#+AGA&S*PV-R59R z)GAhgZRC8#*F9&~{SX-bPCBP=X;J@zh(rHO>=*aDx;RL>n7Fboj0V){JPj1{*B_{R zDQQpU8!y8GprY=DS4SXLvHV#2zoC`|yJ@9x=io*vG)EgnOmW&~EI&_CCEEtb2zG!^12QtMKIYDf8h~LIIR1=h4#gj;?}{9!MtN z5|~I$?^8x?-GO0fAq^`_#=3EY=K}aMXI5)Lca?LA^QUwcpiT{PX!-E%soTYh-Ky)%|(I(%HaL<0Skh(GUGDK{T2ln$f%1PYW{pe!%bqyo|7tL_E&qSv$bX)ifT-Gko+JMk zbJ{@ub2pqqiS^YkWk4fE{vT}W)Tno`(=Jo3MqTr3(q)yA|6B|}{^Qnw`7-&`kyJV9lzGZ2b2R1T(QY{zammRpbPn8LH>9BmG{{`O&2@y5fs> z&ay2gDG$tVO8vEnXw(?uADd*Dxr_KlT;7ONXA*?y&V9+YF^7VM?2AuN1c5&Hor=E8mjP9PEN3zpnC06KxflD8 zAf>j!@qHvGzzH66p&6Yja^&+uN4wrY35z~=q8cg5x1l8KvTsaM2cD_R^&+Av$q@fY zIfelBsO(z&3jfe zH17v;nm{zKhg=NJTfxO`=3kSswM6dy@1j7q`uDn>lJ##$IEm_N)BzmtewDln`OQKKJap^m`Dyk(jiDVd#%%`#U3NeNiG>6Idc7oQ7ETg7fH|}Sj&mgXGZAuvRs zpt)jVQuNh@@Cf7GT0S~;{qL6l&1+x@f3s{TI_fO8;3v^8;IMT2M%b6wp1OB7UBK*5 zI2s;pdvF7Z{VMVGo`u3_HsC5r=Sznwzz~!;j$uHCV>qM>m$(a~bcZUU7IA#Ty71Pz zaA{IuPrO4Fqwr|s;0Edf`CWKTfW~MRrp7@ytacqKL=2|V`z zgo|4WAq?@4v=!?DP=ZKfT;7O#Bu;KXgeDy`<&AilaWu)dF-|4P zWt=jujnf*0bh`}kkDxpVJJwIkST~+s%m~SNJw_J`JVJr<-aF2TX{MjCIHyYv3Ei;G88{s?@99h2juCE_t*`^3SYd^F?_xYd3v!8 zjvcyd2egyPzDSm*?ZRx|EUN`I9FqaR-o#}1XDKm_JpD_|k*AB98}r|Isg{-{s(>pT z`e#=QI9*>|g%vsFlY4*ePE)5wO}bZ@pQoe#_G8jzl@+UmcV-&3o9&8aMtN5xfVWc>ZNJc3*KN%b|DXwluV}Y@6#@-hCjpt{oUgMhg-8 zIu~Jo*uEp}giI=zB%>qZMuVFT&NhVcjbD|6NR^Pvtg0YnB8)@G@NI;QB)NnP<66ip zL`Vx6hWKYAm9zq0g-o&fZa>pm0dpgDnZLYC+W^Yp7J~lmH zq^Bz8_I1oZdV4(_)o4RqsLa|}V4M!qMIbgXuUF1qYo2gx9#p}HNDz7%J(@({agcw5 z;uu8NMxxWZXR#LNhw3zDQ#KNvGCy<5^uLiff^E)~8^LWSu|8%ddZ`$>qRJw(wTqOa zs`Ha8!N*$VWF=R%j26`1S3)GxTB!<6_Q1Sxs)!c+E9Ri~Q;*^91-PXJ)yOS;8!gDX zT#GYFtv*thTZD*a6o&XmMq!vx8u>OY#_;K6_UdgAA2 z*$u@C|3&d^J4s=`ZsB_3K^q+P-xb%Oo$U0V=HQI}(poUBt^clZ^dDy!B;anB*cztb zW=;+0KbcsVg9}kY%@_eRQuN=xrcRZb^b0ecs?^`EBVBC$$8|0ApPWzOL{x82V~W3Q z8!d1p&GVtre^qK7rn=}qHfo9f!!Z=2?m~hp=j?u1adXZxr8{hvBvQqwJ00$`Bnh)p z#&SvO4w}(4+aiL-xJoBMaF~V30;H=Kv1kzW5N7Y*I+nS8U8k#A^lbQHGpYw7Wz>Uv z!%Nx-mnJVv+#6m6s3-E3fixRlOiqYo!Q&DUWa)%=%RtYBh1bgAEC8ce_|D%f`_ zpZCXRmfSigTlsy`F`4A|5!;jW*~;(D+u!=rEp{6?H$&^u7TtZsY`?}UE3z>}d3i;CZ|M0h2``O=mzX*+{_~DJekQ#z!uOB2 zOGi@nw`S0N5cAgz(|rlDFAx01*zgqI>JGSDL`YlA+mj~>(+KHK77aF{Xjc1M_nZk{Z&WMTk z3JCiHBIB8Y02Y!i;x-2gSF^A!XCJ}1szYFEq{!L3;Wf+2SzFF#D^I_-d$K%DoY&hx zyNw)~Q6|}K@tt*hKeVC73e`mk2@2ac)M^DYHkh3}{izL+@^oc?^3;ucx^TArc{Zay zdTLv{rHOkgP(D_m?- zL;G%N;C6HkfXEpOF~x!Q^n8y4+}u9V$f2>#iovni3mEJ1UH>b%gPP`)1ef!uaq|Mi zmIY8tJu(JeL%EdC`;IPPvi{sjn^;{a%|A}!F1}GIq+y(IVAOKsq1JpNSgQ&R429Af z21EQK42B8AeAu?Pfzd!14F*Ponn6z{@K}q|8U{oBBMgQK!+MezfpgQqQhOb0f1URy zF4IxBk$JEw`F4MG*t>_$r`*!88R8#dGfdbKXP+;kehWvD-psw+z+S*ofX%o2Tf@H? zyge994VxkU5jMlbtj)ybjd%;=@J`8_(@2f^y4$q4m1%J?%b-QRO^XbwADI@Z#dV7e z@sBMs%oZ1!xV#Zx$T(V*H(Cs<=X$&2`pdtFItYsuY^|Pj9Jf}G6W$)h-Z04-7;6W9Pc~ z)+8Za5Gr;0+}vJ7R{^#HJJoaW;y5xeA@OkQmm!cTT+6~Y(&YoXD{16r{f==8y~V@o z2-T_|%)nh~yP3PvT3ApDd?o$~V_l9zndAnHvlwlZ+@#xBD{a`~$3F05-+{q4{|-Z| z#hzWp5B(n80=&&^A!^TS_sy*!rw9Tar?X9A8<7m?pMHZ}3BAB1b0=4TLNeg-&D{W4 zm?u?ud3r`*hE|F7S%uJycqb@3gK4CT2mnm*fNBb{wN6!cCEwxeTn3i@A+#G!fk59`kviq& zTcdV#1;jAYMSsDpm;0PrnwuEnUw06?lfY$@Q)aRdv<{k_gD5GsvH6E{U~In8%AA!j zF4NB~w;s=h|KFs5Ti#{*6c#L9qjsPdQ;R2_ojO6BngwbIHzSc8}=pbsxj&lI1m$+(L5_!q!Zh?G?VPL!lEJ}13Kkhrl7$vSsf3L z6>n!w*lNv#R8RK}>ZXibn%|Re#N?vY8o=9SwYD)C@}^pQByjcu3F`e)qK@+V%ROsU zrv*v?-vE=O$c%45BTY$@vi?%tCs50zygmRaI5irq_o`<}Vstjho}wNoXB5AHTW-`& zn8|oh{+u^d0~D7n9uQnstfC-~)gy!zVF(&n@S=Nupx_BPHSYVmY7KE&$S&>LA{RFh zJQ4~1fq@z$^eItS12p)DP={o|#s3QcqyAv0XFD?oWow<32chgM1rQ#!HXj&3%P)qS zy4WduwOzIn5{;0BXH3~=u?@;DVY9(>E~V=Y4x9zovMA2gR7PK_F=745e@*l$LCh~Wh&VWJp24ra?uV7thC_xN zeQOz2je6>zntx^VBWeJ*V?d_>y*QkL{hrxNmN#JdzULVUEUaeFr-i_)RKG7=rhYb$ z?X1$dZ{SE%PnphWVg^RMRA)US<7CE5QF z0_BKGP+gwSesDTBXE-D3#=)^~`ythk(=-8OK*FkKYc?RQ1*~y-bwePeN;z^p1q>k| zzvF_Fas3aKpdsfA(=Z9z%5=R`-B;b1&z+n$m@!5sh17vp0IiL7Ihj8)wBmg4`2kOp z^b2$2;{^;cyE!sb_afmqGO@yM&P@1l+$}ickpVSb`&qj-!Cu5o{Y*%@``ff;t#C=k zpYmFWY+KvVhE+RZl28uO9OhA$2^|-Gk8#QLAQM*UB2?-bP76>Iav#cVC1>rd`y+l7frhPIVuK4y+SIaa!2qWn5)UN*NbR!kMx!0C3=;yF$KZu347_ zP+FZJOOif|qxI`KFY!%0Ar7Szh#~$F3x+wfBO1oG21bf&WzzRR1i)B|(i#Rs{38s8 zMIStQh@|kwfZ_Ywu8VfFew76f7QTENM*@RtSL_TDb~_>(HbeX)>~_A9+sHTK@&>;6 zWhUM=3#N*wIm&h+RH-k*;zB5%lIlX}1OUf{P^Df)IgBDx`?wHZWzhk65PX%oTNh<& z3#YgKWZ#b=7~9;Q4_w9~7?Ooh2*W&fqOZ9ZWfMb$lU9s{C|M2T>>-`DO{^%+co*9a zj8!a+4@{do21Z|^X-6D((l{{BKJd+R;dY(hJ9Y9Cb-JNJ(H`?$bsR^@YNw7jQRi`8 zhj~sNyAkYe7{mr8D$LatnAcL!tuS@8yW?dX!Qr?qKt{r0B^NVQsk3XH%aQK7TRT0f zD8?eB4{NBM=zvA_E<`j_FvLGHK^Nc1Z8LFsV<4&t1P?u1l>*mxFN2GNLjkj4EsCcx z89{JsuKt7ULsa;v8SR={N4=Fj0>qjCef?I_~RLT$q-Niyr?NWn7BAhipu z>+Z>1d4oh8K>lfHRcL@9gc0nu@!6+hZM+0uTtT{9Fq*23&<19(;V3G|l9y4b6H;yy}QL%e!{1_aB^ z)XJwT5K;gso$4VuSOUpQlS3>JtkLp2*>spmVTLe24Q|4svYM1%RiarHGYhm$0!ms`Ky(OLHd6H6@ja`Rre{ksc=7R1b^!9@=IXO3bg zF+%^MsDmkR_e&Txc)RwN{^5x+wF7n^`VR0i3FLH&T9%Nz(t zWBDc~uxZ)QwaO__j3#8=XZ+9t_*?*XN~}LJO^L>fTqS;w5~2Wk(&4{--Ir;CRQk1&C=DfidCx-m-RCbgsJ>KMG4sZFa!K z;3{!)r8J#+$?4Xg8JD(ZvVl`MW6ZM#C}gKkCsDxOFP8e&DNR?Q~%Ukm@O4#)6eG?=(Wf{ao@YJm`UH zoDY6;H))*h0Jo4RX7ff|HZZZS<=Y$~l_b}m665_HAzh68q|Z*6VDaeINGzkx!8Cq$ zk|&)rYotl=+oFFa_Tdj)T|5k%>Q*e}{<^z;(#yv`*1Zg)4fW5*&5<=)59*U$1)~4w z4&9e}S!cdJrZqFbCNf-TckYR(>#UB4fb%k4Xct3M%ud|V;B@!EG1A?1-=R2VhU+rE zCwm8@T>syqw2-jQWlgKu$C?e0I@o+g4iBr%fRxpH%f%!Q#J`7<+cAQD- zkPpdpSbQR)m!=HykINi}nOn^_;_^nkz{KT^crD`~tl+d^XQ6u~82x3er&&+(?d8%j zlp5Eb#~e8yEYkxYhIDf)D0iuyTe%^et^QeXT(bW-C__liG=cWA$j(eM&fTP|y{0t* z8Ru`7Speo}i1}JbU~Rk#$+mkjh@z?-j-56RIAd^%K7pZz?XoO@f@&Ug3FTWg-G|lY zkW#fOF&s$V(HzJS{|Ja-RtoBqL*)iW%0Z|5xW5EG>_X{G4i?!#;seld*_+v$3aX)h zz#*XkDyom@2M3f!L^x;ob{~224$%2@8t7IS;vX?(Sj4yEYzwJBLlkQ>Fr-Sc?S|t( zlgGF&+oi%TlJxl^iS0u@CmBq*${;3uo8vV!$Z)*ofE%=@3D%6c0-R;kqmT#e!dgT$ ziVX3OC^F347892@$YD;AeKbV(ZvnH>D&Ov7S(m-9f%hU=180bT1kNz~Z|RY`#Qx_T;7N;WE`qM-jIcsn*OFed?QVZOIZdj@@-mV zP#xycEmCOd78&9nThyWqYsV+IkrY}wJ796E9e^)wrR#Pw53u<*1H$4MkVP>)AYwgX zv0+Z`?k0O*`plPZw8+&c!|Y}|U=Rs;gN9gl$~K6eYU)!m9#UjEDiiH(q$DO<({fJK z^afaV_Rz4SUG~r|A7Pxckri&a@&9VrB@Z($aw%m;VUr$0*7=@1C_~Der^H_7nj;&U z_O*|}Q5(H({LAse4-~Gk!ds8hQa1z?ly5LOS6asbR*!w%_!Dn&E@SF%+I8day)M11 z;Yyy3(W?8hnB0jN<|8ibDbnG>Tds56oKy5?G-t}x;!+=7yE)D2i|qJy$&oI8egAwQ zkPU4&hexv=|M7pxIR01}vcK7lzv=&`>)xr|-7b-U-@`Rr5Fi(9Mavh%U7f6Z7rjj` z&{|eYr`0IUKT0Epg>|$!Z6;ND99cB}R`R7)isgqJtA#_(3-jbA^YPru6jMs3r8 zRg6~DbF*a4h9f&%#(7wwt`Jzp{IC9AFR&%;)?Yc_x6L1JG)_Rv1dL{bn#nrQ4S+$$ zSNp)*+NS5EowVz2vM9DMA_TKoXblt9F5uAxWSlt-Y5meXfNkJw1Ikz_Qy6`eb9a9}Gb_U9P*p%Pldx?W04s1z!dML{rI*Ux9Tm%%xicG?yefTDbg5mpNY!Gz{LUHhgyD z`7Ta0$)*;^bJv;u=)*0YJ=uH^#+0B&g6 z+2y#hp&W}m{6?2?dD*FxbgFR9ig2lhjTswBqgJxxmq8USe)+7rAAWKDQWu7^h?~I0 zEmo=1vfIAOxL*o;-M1uMitWoG_HL(~g$*Q4p0F%`BiPTBt!7RY8cS+UOdpyM_wF)g*W8I54KMuFLp;>UwKieQ@=xbacbB#{^!v{k!k$@E*>!@X-I8=EJw}>m=-_gJsP1d?*&DKp*?* zYBqSG28i5_i?8Ab2&{3(T~IRA6jiU6f69Ro=m!3j1f+`rN5LUJN`Y)21j*&>Ju_(={e5L zZ%u33=-L3wWw_sot_s`#b&%u#YGI|A|AXD3~vW!Nru&fCx)R7cRw8uS06Lp#bOt@bA8yv%Gv_~hAKwF=9CmcioV_{Vuf~HEX78raF%Lf+v3FnBx*GCKy@gHO zjK^f8hW_2hKKJo02CHTI0jdJD-eSI%b@B`-u7?Sf{Ae?&mbeaKf?=p^CF}I{ifPmi{5m0Y_sy`Qv=?v$* zMuR$BI=8Wp18a$a90Lm3`-2m(IRdNY*M+Vn3(w~4F6sKhWBFPx3yJ}R}NFm!9UxnqF+4O&P&bd;{lOy82N zS_*o8tT)J}z(QcHHe@7rEafA#kostx^AXzi=cL`YT)<^Js&}Hg9v+7H$Khd^xh*Cx zZwwOL8DebV2O*K8W@3yJyw$XvyqRn`W@isPd!Wmn-4o)h9}6_?wEVA4+{Evn#nXgq z17L=bL1-R@@u><~6i2%dH5V;pWBLhAGPNJ38C8Vga<&n9(mO`66is|I!H?&HIEaex zCUBU8XjPkCQEt{=NWN`e9!?(dw&?EE=Z`MM=C5rpq^SByUkZ{nN zyYleyq3_8cNG$`Xo-)q&?EGb!=ocXU3X;bUG$q4~U7Gg$`A=Z=ZhTrf^EJW-MkF^- z%>i=xt7pPw#@LW6pjXPYUZJK_i$0)q5hdr|uNY1n1Ie4X-fpsQ_DqyGHY{Vcoh#7PUl&2HI!p)Q=f z?0#&S^yt5F*`4itt;RR&>F4X#9q1ggvYW3P;|EUA6Sk!+(wtElG@Oy4fsMh_PzKph z2>$)4*-UgJrn9Bb^(p7sN*#IDLtAmv=>uWauL7XZ4&i1TkuPD)p`Y*PP%6AKT%fQ^ z#bzPKdCi@F6tnSJ>}?n>Q>QtNBPct19%#2kdS1^Dak5sp$?7lb^ZF;lMnrEMeL*Rz z#d-AEe;a*Qm$>MA@4iX&?M|U@8M8s(3GLqjeGj(VB7OIznf~vl?_2oRC_Q~gVRK_M z_%}@c?PEYeKk^zq^VQAIak_}=4h~iRh@3ubTdJ-%yY?Y{*p@>L($d01*#K=FJZNBz zz{V*vV3-x2j1L85i=5HSMpt(HJV@$>&H2yNYal)BJ#5 zYMozFD#2BWRGfH1lHA>BmM1t$#pQ{op0}HSGYVvi8COUzzBdBs#HV75;0RIQaswjf z-~M6kpp&%MuX2AX_FRwfxP2=+u^hs?eav!+tF2C_#g|QstC6Cvv0G$}c(k*{5Rd%E z{A~~D7A5Tmc8gMPI$H#N0t8zbD}21d$4_bhh8Gv5<~-X3)FBddi4h6DJ@sb-^c4mP z9_LVb{LBi)fOTx@&;0tK}y~LvzCPiYotyyNJ-jg z8z}*|Baw2B_DS1+gvSn_69Q%gF!dP(8?PsI9*!BJAI#<%La|R>i`^nY1s`Yd4KM|K zlgxOVQ-6}=I`zl6KJ{0HkU6c#;`qbF{Zo$KPUG%rN^dJUef)?W1@Pf@13O z13@Y6o8zqEk0iab0z}7AJVa9#TNUEp?>kA?0s&6aiFmsvsRz{MBwdAMGf8&~IFnQ% zwZiv=zKN8xl;dy3uxe6m*d7wZOV!={RL8J`nWe(*+M`jxD(DxJ%nhqm6n|CvH#8^W z%rzm_sFNoOM1FV$>MTNWbtWZI%-?9{iKHDc$GFaGR4IHxU_|-2l{ig$2*p9+1*pq$ z;@eYqGFz7T55Y%Gr`PA6_QK`+e24bJzBVutU^aGFGWK1z8k6k>N^f=^ z6FEr~QMN%8Ekd>tMYrtWh@vi5vK1l&rKs(}o}CD12oQWh`G}FFAvH{{jfI9HOl>$U zmR7}Z(5dhPBgu#)<4zWnVXsncGPIxp^`f|&U@|b~i0xPK$pfbQ$BVR*6j6TrB}Pd~ zz4`cTRb&(HZX&V{E7z*r{PWd>ix6`lW72(#q_Hq~7kj zAsUqcA0ST#)IZ-rHLa8>f7NpO{FepT&d$F>79?RK=>f^dx2Nt1w%Ed=H}iNB@|Q9n ziBkWUy94`XHGpEC8FCx1(2~{FLu+-Nc0{y*WQc#1wG0y?^)%!1Mm!{O{bj2(DtRF2MJI;TL~-hwd|R7`G2ZF{nUk{9*2T(D z5I(M$abp{zeH4WF`_fG!K_nY}ehhyIwM=fB=t3pl!c>fwICTVhYR>oZZLHDeZ*rd# zbS3Sx(&lEHN4^;O<4CQ|8&nKR5Ddk3Qb ziPIw9QvpPXtSZ4}4df2?I>y}nF`v*ANwDc#x+my69cN~ZwZ!g{z7KIlm+?lt|Gdum zUurR1{W=8pdwTtP+XH0CZ1rnWd*Li}>@XT{3Bhcy$^S_&OEx<8Mw~ITb?gnJ6FN4E zqao&N*DYV4A7}%nzWw4Bpw^t>L{_q@)hn29md(XXa9RBUqiQKTjjA0z!jTdlQJQ+; z9*q=nzJ=7`vgniG!#qohiCLOZuB${?h(ge*`X`T*e^Ehn-i{(6%=ce4*c6A5NGR6^ z&h_&tJ7fOq?$$a_(hjM0E7$$td=%vx(8zrX=|E|`loK9;oo~JT|FlHwa#59E%jXnm zPKy!TXvgO6qr!{%2i~chleASAnC7HjJKQ#C&cH`Iy=(^*;9FfU=XqB-TA&ICIE}7- zgvZZNei6w7y!bZXLo%p#ds^qOMx?KfVJd5f@HQXwp}MDM8(z z^mn=G9ecBcG@;Yi{59%ZvAHEP4CorXO=Xw0a0kX33uif&*U?oBsEXz0ORMn?*^9QD zxG4~I<{nhmH%m~sX*uU_vPsbA{;#Gr9ySPj zIt)Zyle~z@;F~Tan@K*k$eHA8k!oAf#EPYz$sYT)gY|M_W)({#;(}ACO5+j))~Wgf z>ok+yx0}n7zI=4bWN!x?)dcr3X5Srm=-DS}$DHe)?2~a8472ZM{Sl^+^6o)$nxT|y zeiqIB{lMpl#u6tZ4PGY(#?vkfv?d}Yt z#9jGtg|-nGhN1*-*HA2EGN|2P#^E{skfJup8krUIkK9!oPNixFJZ9jS8L;QkhiWzS z4I$8(w~|0i7<-N}nM&23@~H(K4^!ByW3>BTpMznamT+l`BV1@B4eHW^b-rz8q&jr7 z?8VoGslB)bUxX1!xU})fhPxMsan%v?-?_l<#rZ#SdU3i4Q1&9u*)Sg~0gQK|7i%Bg zXfOVkEUN$Qz9!js0nW7oaJMtpU>{jg8cA1OpKMPSbDl}g5x)RCWo=J7{+fQ;`YVOC zK#Ud60SlXLnV@S|GNW^7WAJJB#tQeap|Wc;)}y)X?7v2l+TSdzcGF1PJyZ?Un6~{l z#F@;sNJVBfUi{;P4yr2I0)ben;nZA!Jazm!k*+M)+?fZ#%aAVpv@9a+m3Oapj^;rd zs0Vj(mS=2-QmSaN%x~hFNlJZpJfAK9T!c+X45_pKT0}|+|7?A?J=&SZz>RID^E%-y zmL?a;sY^OBlC}#^gP$v_rHM~yt=)ff;F)%|3(=1%9M~_?>lVan5G!_K)rf)JSrK_S z3aKyTkr=K+&SA^|3-!8B+v z4Jlv(tc*isd>|Ain6RgAXQp5X6JWyHG;BnDZ5lGfKNn8Yp(<7d^+{a-!x>uv2I3}w zMKrJ$RM)^5;-3pxkRUJ_`9P?ez^VYxsTU1{^X8lIG=$-k zEn-Ro>uKk0Sc0n(se0XGOinW@^(VuGIM=jNrMAXJA!2%0smFLd8y7fieY<-weIUr> zM$|5JME#4VU(Emgo3sroX|J7b?2{_hfm?{$Ncjxt(h3b5RP2vMcz@}xf{NLCz5+{B zU}IvtyAisE3JI&01;B+RdWn-?JIl_yLE|K8<26nO#@-q&VQ}pTTNYr=Nl#HcXeS?+ zG{vBur*2Quu9Nxiu0(#qd{>KLOtZX&a+*OH;vf6WFmsFeMqJ*AuabPzc&W*hH!=f^ zqiMd)YD$tE7N0L!nlU3Nq}yePe{4tK15}WpWZdq624aq+*w%a@EKYS2KCw0~KjAg# zl&61#!cEJoQ9GHXlleI!E{t!M-HcXU{4Cq7;Ae&EhM$KHboe>UN-_V{J8FI&t3pL$ zu|fd~xNs?Ht;5q0w)we6a%Bm%mc7zrpi^-(6p{=RS)9xG0Uh%5DW;VgH38CG__;=X z#39rCJXTGmJ`%+Y-l+u?wGR#En15QE<{e4<_Ef{qHR`jM4L@fZY>jV)kq*_U)P9%Y3{37u@av7ceogS;DGn zxi}nghb7oS^F2fSBX=`QXbTAqad{(7qJSV(EZ4&ehZ8?W3T0x>CfKcCY+5fMFnnMz zh2>qnI~o$l`MhcyeZavK0nThnt-8^CGDQ~zKbh)@I-MH_3DPaUunKaJs-Wfpg0KD* zLTw}Gc7&QCcKJwLAY!O_7j0$W+s^W+&bOgvCyRa!sm6T!l!VlOs27RAjEMuyij+@}mwzP09b|k2MNGG!}(r z#T_U^#p{@b2(xf{H%|yD(?)9U8)G&t0petElsDq57zc&;HbPXATtbv_Ekr|TKzE-Z z{;|94CP8-*R18-`t16y6LXM=^LNvSsgs2}ktr;O21_&DFmrzqSEvJxlglMw-r1?NY zb~N5D`Pt57%;W`l8~OR_zcBH&%R|cr|A1oK9_W?bCtxM@qTv8Zro+<^w&iChp=x_z zp#;Sq(5aXxNJ>${l%F4Mr(3bq251S8o`<*YkrON6&q~+>gKtMKAwT76vqnHspFY48 z|5i~gt0e8&6OH_|)WfpPml<8k&k#_N#!A#*KO)KL-l!s-AHYY=?4M8pL>^A<-?W^R zbcpO)K&09FTZp10dMVy6qRUu-=q*S#L_gshhv*y%4!j;QSlK{9ho>QIlX$6=5*5`Z zK_RhD)n67F5(lWF0{k7$n7;!bbCZ-IwLl*V;*TgGUaRi8UkKUWN5I5ULY;(9zu6z@BS`ujH6m^bM-TdtG>!jM zlOY=>9=yS!rwm`rUugPXqRQ~Y3T?!@T?iKr5+fbP59v7+?vz}i@Ina+g>`C1CjQuO zGx32qmTs8%J=`#2jDQj~`BqZe&BUemF~wie;$q^jk9U}OjeH{t`mYi!Y_zSQ+ELcG zc0!+iq;U6Oe%K*HF_}a0x-Xf#$I=$a%-t?V&joW7$Wh?Go&wqW&$h!+byzlz|12b8 zhMvS%jL`#^OolydHxV5FXf;({F`zgq4+@2wDq$)+eWT`N>KiyiQXFRc-ldZ*?c=ck z1iH|;bONGKEEsOJ>eSn0WyH^aV}*~e~K>wA4lAfyhd*U1qLIbuVG zK}Vkx+NdRD_-eGXtrmT*PSQzE|H5ea0mjs7$=eaq} zrZDq&C1U(#A8)?b4=gU%=q#{5@!q8P#NiV>A@L>gJCqxeSgYseLmT9ByX*FAQfp zpR2Ix;GWN%iNe}yLo3NAF4ipO^OpF-XD&iZeW&+Pn6)xDHJ68g8Bi0~R0Une&gU~n zG-^yEnBAv*UuL(NQK|m$YD`#oB8>+e4ps|r#ABN}Wt{noiT=&99nrKSpUe&>IIEEu z#R`=@i%rU=Pvm4dgPhLOPa$yR(odOVUx-l6`nF!uyDKq~cj%cZo zO2As)dbOy-?$u(8-jZc-?H`L{xw+7jVZX=C8g~ zw=8M<=$1{ropj?kVj%7g8CQM5gqn+OI^){nGDCH20G{xo#f(4rZpKLN< z!qO4#YA0CwEa;Ko+jt}-$>9v`Fwq`~Y828Q35NJ5H}LdI04-SrX5%n&j`21zb)D}j znYUarKeH{w?Pd7>dY$hANz})D=$&|rF1tS0QE!p{+VfL~$rb?5ew4zN=&#ea(M%Rn zHP{9aCNui0?hYB}w#zuqG)Syzj{cf}O$uSJ#e!L%b+N75;t>cgTf6lsm8{I-U_G@X zzTkE%vnF`{GAlE1NuTo~3k9QW41^UunFuUm!Lle%7zo>n zugAZiOe7Nc!bL{D<+Qc#7ABr&(r03tURa4^B{TdCC@j< zv*hFQd`_MZ%X8aFO!vz3D=FD6&$s3ITX{Yw&xhst3wi!Tp4ZCrQhA;u&mYM1D0!Ye zj*#z@=NhhMseoF5>0|t# zb%SXw1$s(!?o{OBQs@!1zrykQ!RlfN?H;e%7CQ(%&%!DSy^sRFPc&g4p;2rek|Tc3 z1xoYs(sY$k3cqRnk~Qz8y1lJ=Z`6&Pj_YM$$W1I+{HhiG+KRrs?%rwqIo*jR(^|{( zr?nnEbUMykG%qhm2klkdA94ym?LN1p_;`R0l)Y_5KewXY!@c&imwWpsmYm#}Bn zEZ;6XQ%)Uue1SD{==i2Ndws*s)NfGHra9v@(!&p*S+PHnp4>Ds#D+B1p~Isy z_AgL>y#-jWnAW_aXhOYbPDf=FU@SbWN^~G#MPJb9&wIP>JSdQGete|`F8IGB;Js4F6ULKRV*MtxKL3Y(x-^w6PAbBYDC&6`rz zZtvKZy;1g(dhBX;r4vYox-Xb39Gr&zF?b;jhLvIcc>qW1*Rg(|DU)vf2pHB1)CMzR zXU_6Hgry0I8Znn+VZLI#n1~QKk)e2}tYA1(OFb8l(KV&cs7?##$?ZCFxF)Efp<*!Z z-}{Uao}R^QFOSz@1u)d#PkSBK&HRLA~`26X}^wo_?zbCapZp*dKJF29p~O z!1jFhB*^QI-LaWr(H-Pd?({yAo0%6eHH47Y4h*$u+9u-S^w$_mWjDY`2@S{Iz z87MLdA2fht<+lY&IX6%dzRgV}0S3z@uO}3icMbD=UO(LG=qQ@?RYyGjdHsOTU$8n} zD(e0muGz%UN=Wky+AV+sX6hi0I^ z%v!KI=nslpA~IDG&iF1RSu%r5{k?QxS;dj5je459dO=*nkO%>?q<5$R+9=yg60Diw zd^T5Ygb9MR(P;%=y=BdO$=Y26MF=X7fFQ=LXnvk>2kVkwilX5H=G0gN%L|x;Ip>x{ z{2_^fB|d$F-5$)7ly;RbiRZKzSqoUdG$G4`7I=W7R#~SJRwAN;YPlA)Ra+!;+$=zX z;Yta7j6kfhC=E#WApWZ5fKFZ!TnbMN_IMh3{LuFk3XA?)PY*BTz#9N~;HlBvrwx)B z!s^8Ap}+cS__*UwC_f&bV)TMBtf+U!JI;!;3n|e_Gm$VQx>lPt&GEQzZXQd{d!v54 zirD1*=$~-hXzw2N4CNgTi(@bVU`nym1Mif>A?eKo!H|Q)!BqFU?1#=%1|UZi$l_6mLW3>L}}l`U0PQX zH~~x&1TnxQ`@QWjNdPI)Ne40^`e!Tp891b_zHz*#?nIc<>OoSdxqTmNk_Y83nSx=w zZ6L5=OeTjqB}5#-6qqTJtRhT_d2dQCH(pXvsAn*`ekufO`BL;iM&>m&i|t@Uhz&>N zQ>+OqW4D(O-)Yg4Vd7p?IxYHP1|Mr0GG|N@{dj!&jPm2k#gLv-7Jn8~&{H|#wdv6= zEBbt8w0oLw@@Lk(^>ycvc#+Cc?{j@n4I7&)f*PzcXjliP#4Z_A8T}T&QNQCv^!F*; zuUHX%Wm@!)WVN4Q1vIVs?*m(Qv6^2TXvMC|vzq^&S1&&*RYik3z{LPy31GBxcr3r+ z&=vXndCFJh4;BGmep>kt%1_zU1p>sQZ%GlXkGXHuueU~Z!0=1rlJK#|oglqG9{q1x zvv?Q@@7?(=haqr?5+>=V(`KqE(J!Y*zpjXWU`5|j*L*@%)=NWwYb*MSTJZ%h*<4!z z%9NHb!;WNpdURzaVga~XTOTXIO%a}D-T%TFCI7>vBRtm3POIr_4@Uf=GR#p^#fssO z%@7Z`eS?wTrBvP$eR$wZ5Tt=IwUFbkGZTB;NO8IR9xuiF(OV!dZ8aNldu5x)Ts zg6!8zmT%q>;HRDei}R+>TVKDGH4j3Mj$2e37WW^%=LjrXee?Dp&jEpIAO%~zG+*LJ zY!Eyu!OvmH4oRDV4aED;M*ru2)(Gw3fbdnkXKGfOo)~bk zNl%epdH{O&AULc&i7V^RYbWOD#Dge=Wti@=uj2J-(G~I|2<6dN)7Y}D$?=V&IJEiO;VOVwdeDpPC#Y|fP?w&QJ zWiQ43f7%^lBnrDR?*Bc4asRV;KDkxC2dH$${fn60oZio5bC?Y;v}`*NTul#h_S6kt zM&0$>y&!^)_}w-hwO%X>+SIMy{olY3sRB=~oIpA6^C$ojy91M3z4KS;pIHqf+=iT$ z-dRW?N-Mq92tnW=?MEiGv;a}-oOS>#JcBh?=I62HM0&LFj5oo6t(Ex!J2B6S7EZAf zQSspcu?i^zh8z8WA6(ypX5_%{($U;L@~!$eO$ zXE48)fME>}xZ;PVYgH6hk+}aLLSUEKHOo_XXj0dzovzg|gq3kh*Wfo04_;WZ|7F1~JMAw5j8 zd-rg(rB1+g54_YLIP99&JZTjKkf(0QG8jf4)qow0mEI?j#L1|NXW6v}^i-+4{@xu| zaeV)x8ui(TgO46av9o7nphx{^l!$}@JwbK(>_n~IFtxrqQi`prM6pRIw$ghd8lWI2 z3Wf|*0h|ujU7=s{%i4Q>q*n2ml^$Uck0DRpWRkR0{SH`a7m7F)!2-fBaEg%WQ6)qc zs4~Ap%H=eop}7Cl$`PKZw-FMEqN4$Co5WW3BzAHC#)BHU}XXa%O;8p^*ahQu1d501*}MEX*L7pJcY?P4~`joNE##`iuw6s!8j= zhFw%YSa`Q*By{TEkU+MFWTzL}cud3O`as-YGfiZBS}D>8KI~V>X@CfkvbgRNOUizX z#J=@0JfXaLubTLt9ugO6yUhjbkAagzmAzt)$ZhI@+AUj7^3| zscic7H9xpDke=%$`8EPckBO}YY}8`@pRux#>HrsV=Vl2qBYwvopTO^gEP)CAjQtO> z8*(takk_%8&JO7pSfB5YP^$hhxN5}s1Tf9#Gof1Q7c&zjkRA>L~}89Be>g|ha9GF<8fH4{;|LcG&Z-)b$K z%-2fqA$al6ltKO&oxiuv-!3_y?fKCj7W>Oy9OfyH4s9%N9nl!=cws3!?&uIz%E~^Npf-N>v8`J+in)2P;IIsq zt86LEHsCL=EU92r)`RlJIt>>zeY!Ng0!?H8Kg?dCVstfpvT^?}C64z0QUqk)_RVX6 zuz;mek>{It9)i&8;q}iWQjN&(KBypOWo1QW zMB7rJY} zkXy{||8W4~C#8S6b`U%3z4(;T0 zsyP_7+z3Qp5e{Q!KwY4#7~|XsE$Ip-i~lSLEqJFFuxmKWj#oxYY4e6c?6>2N#ils7 z_>Q+?=azJHpG(BadMkEed`c^}?LL`R(Yn7Cea(s;_wn@T`%_|v!AIOuh)DWQOIDz(&;B*=8VI9o5YlveIh zL)7;~WW=b?@S76hLDs-k<=8HazB>iNWKa7%A$I|WHbyI6E}5`)_K@heqk1RQy&RZ5 zIQ~NUgw?a($HO=GEeuiog^JJtpS5q}sUKB2?tpg@@Xe!qQcv|l4!3$=MT+2lKN44X zS0I|#gVUPcN0|Y+xR&w~PVbwBnoc&OpcR|`y13JElml{y(j7jt>F+U63P}xPD}er9 z68D$js4FQjowcIVU$>%gGebcRMf#-jAMX!R>}awoW7Bb{z&i*n0tCy2;d=ORf(Edj z%p7Hj>DVtsdpHRw&H0{qlW(-g8e!}kni`Ml8Y?kYPgJ(nKOqGgS7Ais{us*41zMNu zGEZO!#y3~2glOKh=z1PV!TQet+TSh|JMJ`T8aSN51qg)llnVgX(Aq(M;AKOZWfzd;8o9$EY>Vd(+Zk zp1N%zxUNIM`f3$qTLVHpQ`GykIN5K@RUXlLpS85i1|a!@P^;G>1PKe6F^u-Rcu9kD zCjX8fZm0`BrW*>!A%v{M2aj;PscDy@0v-Lu#(UubPr?7`|I;80XLFM0#^n2vudc?= zkEUef8!_)T$a747(oZ$>vZ+MR;S6r>ltX+0t2IyknX7i>f}!NWT>P>H7z()?BZ#wp zY%|3!fV2@Vh!T(bMClFB(jekx%Xim4#Kz7L)0~E_I z!MB1@uG&!qG1e)y#^smP?Zf0~cqljNtl2x+vFOke9H_)xXYxgZnB0@!^E9OArgF4v zFc1{_yfwTpVN5Y+yyypq+c|&#_MTc|i){v?jbocncqY*ts$bOpInt_Cq)3=At#>|!n1~8~Ez(%sFpSygB@mRO0HSA@nvHED46|45 zqd}&V!iJt7Lt?6X0Vb8TZ1&p%Gb(|ymN{IVl#GIHd;uO|J$j&F@2T8S$& z`XQ|83gI759be;H;;jK}^2Or3?ryLwJ~eK{%TqVPgz~Tz=0$?~0N)X*8^I_jJ>D)> zPo5nO5Na2nxQzzy-`;&UiX(X+CKn`dD5w zyucJ&K2@>(Y8&lYyXX!AZElwyv;pUym$VxZa14t|PRJ5n!&<TnyNM;2n_mWKeSXW$A>FG2>WdEBlCbbpl2w=d8}~S zqoDb<8H8R7j-uEwz(FHX7F7!gBSfr#(f7C&8dTe2S5=4h`Axc+tP!&5hw&@ydIU@p zy+V^tcRpS}nly>1*M^Go07{ET3qY`dz6>D%a(I{+=o!OTq8&)M~yl1B#bC(0~#eid>2i%6U*1D~; z6gsZ<2=>;;&>HAGL>w&Wi1v+hR*?qiP>LMGWaxg_Wv_Amuk=2GB>wf~8RpX+v=;MT zpP~9QoN8!s>nJYEgujHRjh4Z)0Czp4v=y5xK6<@YSOu>P*9!9`E$;v7n{6>R=5k5U zAi`xOj;La?U`(+dWj@mFb0*10Xlj`S86&qNkbrhuNXAAhoRcEkNmn^%a;a&p7pU|4 z1m0fBIue(&UFJecq&1=g8fQ9s*WHWDFPP-_c)|$IMUV?x;%-B0Lmcb<4cp3@R30M< z=gBdWFwRdPf&(4pY^{;?fMK;8-I_9-gLw&cDa)$k{uKzKOa)k`!c)I30hD7h4$*}D z(+@yc{C*bt@f~}o95&7v!1~YJB@Vg=HHm7_CA|d1>g~3FZp+o%x%!)(t$k16BOVTj zW<=~lz)?X?%<_AC(WmkOM03(Q#73~seh#c;5_2ff5HX-A>6oj1#7Un%$o>rNiGUT`$yYQ4 z96qUfZ@ebFchUB~T`(R4DX#{_{b!VNvH3y)a%Ok)L@v*61UAOtN$__WCGcyfq=P?T zv*3r11?~|nEpOv*OP1kh`#@IlXk$$A9?P-CTMqWE^ge)65Gy!Abr(XE5%_xcCEw5K zfDV+m!m(AAUye=q^47>u`SOQ{XQLJQ0e~H0C*(2VfT?GlU%w0j6Rh;oz-Z;rK+|Vu zpMTc0tvl?*0Xp&gy0gyRx`WaIXwVU;Wj^!^rWypt(3bp?WXR?9bu~5+1Np4;>(1^2 zd1m?a3I}qL0~yAvhFk=hRv;%pvh8BNZ%KX$hWj#XOkeZsVIHHG@<*;cB<`Ekj?b>@ zB49KVuf{Rlx^N<1%Xlymj|>{3MJVK(`yd)z>7DT_%~VnEF$lqR((0XtfQ_$R#Zv&dSM^CPLh9MTI&YQL@j<}a zdKDcbV7FpU>0+z7YY=`Ad{F&iE4^#*OOVvuQST=RHFp-Ydf!LDhR6;Do4W#l_x+XL z=a2&hgu>5A;XteRF$5qKXy0(>u@lP?OyS6X|3?>nq*nF`!u~EZ3DTmtdD60b@YzY- zRx9&MWY!Eu0HpFn^HYvN#7EBmVq09Waiu(K<#~oYXUOv~d4}Y)>0=P-GC3{qkJ@Im;}N@OAQ>BhT~YSuM|F*&@&DAV+~5 z1^yQ)pzlNHZ$BKzTZeIn^CwU0ADo?Ds=AbtA5=IEzj`S5Bqx=_4~vD=(1CJkX=%nH z4XS%UzeS=kUURPQoZyt&lyOLhS9E$<#?%!;kNe$J=nz`^=wyLLi}3ATEe0@JK(v3jkh3b)n+|uiU^}r{VQMYGd%GSE;GP zvg(g+A8l{93FTwcE%k9>R`4~we$t3*Z~2>`lkX^wv@KCptbstVwH+^}<@=aNmxADzS;JX2B765NGDIE+Kx~cRv{LqfN z;D?0-v2eWMha-NY`JwpPP2`6d`2DeO(-SUz|M{Z>swrKSwB^A+Gtw1K&p*+5PXoNZ zpTDU2myCQ1*;l2CGQjAEULs$~84wUb)%aohPPzc3!T(98es~M(d$zEC`v+Twf8!R` z4{u?8&lc8ie}4=6zlHU~TUg(-h4tIJwy^(OSU`h~zh1K^aZ(8}k zm1kc*2Gjk8z^0Y|IAO=Tv`;2`s#J~mD*e!>p?|sD`46iY#=`V~dS`{wR`IC2wS92; zzr;RBZx#0k55xq#m<{jkg&N-6Z#NB|6`cZmJyHN@VKrobW4*)-v?fna+JQAxN`oKx zt%dw^b7I|-AZfbtvFRmo|Ae3D->OMjYosq9RyTi{HT_|$G^jH-seGwgw_W!96OHw< zzxU*&sge%=XlyOZ*JW8gI*-2<<=9`0(Ech_ZC|9PL4w+8`PYU=dmZ*1;lW%*1Fw{L+t{2djr7lTV7>K8#*ORo&!JMTk@|M%#H01!dL>;u3GYFZAjM!L_Qg!|R z$KJKTSv7tCkxB_oa(k#4l*TKAVv@Mja6MvBj8`T~Q<9O&keH02X(teF#5bA4-6~Vi0>LrRcFoaKdSHI1zu-SXM7}IW2E)DYi1j9A3r7 zTqGJw++7P|4gzTdj2BqP+;xF+&t|yb+>K&Hr+J#q@?0WuUCFgOt2;f6A_q@5RoN{ZVy#hfBs?rOxVSdGvpkG{Gl2%pqb5l)5+jxaZl z!U70>{XH!Q{^r2n>`315?1aHhOCX=&yfa(u+W^v0L4GNGUf&?HkS^dlVPSqQ{(=9% zpu;m2m8NhJKqZ3PBYRGEya^u2dH6cIJ%S6NN`AHJgHx}sy7q>bmu_mu!%{(vY%3Yfqnj}NaGDwjN^M_2Rk;uEB36+ez zyBJVV&G^|g4^9^M?sTn>E$aMx{jUf9^}xR#sDcMHsrG`xG?lJ_vU&7Ks+0tIdmnBjskpb*0`IZbL_-AC~H=;=Q_V68DMG zeD3mUtG51`VY~l`{>jsU89p1=#vMONIu$|w*&Nq?VwUI`Kc6C%feEKKedx z|0L*C1o8P)w>il0IX!+p**X(1;`UFu<$fRK!`F0RhR-4K^GVmK2=dPn zIxxfML9aLjDDOY5e3=hRbz6d3JoNW5Ixwiw4K*?7q4bwkPyY)a z$7g>g?AOy-<7IbC`!ly!%l>`5^_v&Gf$^0r>b+~v7x(VZJHg(+h(B;?eDYhaj}Jd4 zp8NrP8V9UQb@2@Kw%wttZnZw&kvBXiVer0Kjg6`Jtb>ZrH;-%xDj3NcV$h9Qk5=)< zpR0P~(D5dXS<=R=N;YnexzQJSHS`4%COSOICM3#`Cdu z^HW*B3u@N?Ox_?5LClAXfXW>&;lk&Xgf4L5NN~wpToTdb|g9~UDIvb~RwLVpNjAl53CRbBX+m{rh zmT(ckh!3@A<&E6KG#2p|FGS}w6`!|Fi9bG91w2;c($eX}{(f2<voaL*(=a5{ox9t~ieJYrrpf}d_^C%Fj0-!HQ>a0Y@8@}{vYjWPs( z?A4T5a0PR>^;7!ljHyX|t)8r;?~L(E-?p2jeM838q`oU=Rnph|C8e)G>HGfCn$*`6 z!qMl?lvkC$=1O0W$7)jFawvWI^ku%K^t~`p`t$wAYf|4>m|ywy?QE&yv!l}2;i;O` zcifUn`aX4PL5pva_Dz1eCiSg`g9|?U`ZZDZU7_@aCe@_Aw8tvxyQ@OA-?{FYDKCiR^M6G)$ZS-&WK6K<6L zT=r5;>e~R1>ihIv0bj`RPw7jWQIq-x9ac%-32+RW^v&rn?VI&#P3pS~R$e~)-g!vr zJ6GvzGpi=`omhFiy##6>WZxJ4q{WMA0HXU&zq9`kBa-(py)`Qmd) zGiBckeWgF&f3GI>UH4igeV0S6oc!5Q>FcndCiM+~Ws%RmhoJUP`WD|H?VG%)CiT_* ztdhR#TPuHFq4b58)}+4Yp`zil?;U6Tu&$4^FaN`u)OS{kO8wz5C~}iOZ&&)Z{HG@M zjd`(>eTNpR_N%Y-_4%YG_4S@uN#D#-O5cRu(x1ydt4V#gLRrPve&;Sw`i@fi(w5hx zz7JtI_vyP49@kS6k3|gNRrX&;GTv=g>IqX;&3{_OGHn+hG!< z^MlUcs(mhkVQ-IHba>T1Jy+S`eeKg3lGz?gEZXPj`0cs-4~;6uo(H`;u183N_t|q3 zEcU8m&z1kt->1>%^q-e^Xl~KrRr|cX(hl#l=ZOiLn>=>}oY#qnQ6K5=)A3XB_BAXU z_i&vKuk6_f%OV@R&z=vV7PZGs7WR~UsJ~CgPubHjPJ0fiiak3Y)$?*p((%K5{o@Dv z`*e6^&lxa}+rxD_ylS5dSJ>fw?Q>ie?KwDpdv1nxMLhQ0wcHNxv*(&eG&ebo1An#t zgZ4RZss274UbW9tziV#M;Z^%g|J)AmvnM)EbCZQVcR-PE4`&D1uk88HZ<<>ed%p5E z7Ck~5yw9GwP`uLdawKT(r}@r{i}m;E@XDUuTQs-m@Tz?dsER#5jnOD^j0x~J=7W`s z^!MrbDSM8O)1K2|-MNRWHS&G!)2fR0>>Iy5*Zyk94_=i(^U;By+TnfnbbDBHlSTWS z>b>+K2CdH@s(oS}hx2aH_}j7PN!=7)gZJ4pe00_9=?`njJ%S-1K9xQ1KwWK*TQvL} zdp^=l;Wc=lJuek$lz8q7%-4^-ufI>D&zZmd4C~x@?AfK8@@nM!>{$)9+&z?7*t2B5 z{yvR9$DTvuw5MHF?AgDH_H2JIZhJ1O(A=W4U*&_Ix+%N{?`xmV4{DSc+6T{T_lRda z1$-0lAWe+)fcydY(`V~>Y3zYB2$^D;ZgK>gg7CYC$0xsjz&a#Ie!|@Nbc;y_|IUo~_;m2j5m~kG#k$1_!{^|F`1qv7lRqGS?$8ZB44Eiu(#xr=o`F;DjN9HWrD_u;V8IS+dMVfB1#qhuRj`-x?J}y3d z_MG_eE#hjgbn$9D>m~4ieEBL}91mwo?DIpqm>ehndAh|8(_W+Ud_A(!1C!f_A8-!Q$AKjEPh|jY+aFBc$PY;NnPgtiS zh)-i3nBjBRGjaQ8#ygr@bbN5Vx$h0?OvbXXJOh&5^XEOI4+vKJFGybEYK?NZHwZs= zmeSut=`X&vTKdP|9iRTsVZKXee3qRd?Jvu$mj3tR$j|8iC!&u1N`Jz2)zUxu)%ffm z^0j0C>C*m`>#L>zyLIvDZvrpJA^-PK`ZIf1OaFWK#;57VLH$L>|7p_xa8|YSZ;oR z8rbZR_AC9l1FNO~)Z+N`_j=N4|BllB%$uvFf9zNB>5oFaOWLpW7iCvV|B!3r)4v+_ zH)Q;$O8ZN1sh0j8KgOs3m$i=lN`J+mYU%H#+k9o_A44Htr2VHz`;!J&OaJe>&By@# z^nROR$6CMNhVbXdiEj}ne*H1=@p&^&d|{mUtK!5T6DNMh(ec^4G*0})IPo{eiSHCA zzCoP$FOQ1PKU3qx4~r9jew_FgapKn}$7k=GapDW(#9tLB{+KxNJKDx)@6tH&6XV3+ z7$?3{ocIQD;=epHKL1RO6F)3Y{P}U>Tf~W9-zGkL-;5JqXphgEi|^l+@A1d0m^Yq% zw=f@Hs*eA```vyCZIbVg`Vuaj(wVN}u%|?LR>S#?wEPE19!VVQNGynvSg8cUe$;7K z?@u~KH$@A^)BB7b4=AI%9CY{NOI-eVES~vTShVWt;&me7m6gCJRb1(nL4#r0qC9CxE<@ z5W(8FBJvjRz-=&+Uh(s?clse1nT7B7314c#vlx+2Y_veGK;#1}Es%-$lk~@Xr=Ws) zMi3buXdyEfk<;$CK+Zmtf2JM z8U3xGVU&7?6_kER8U6lb&ia*Z?m0$sndUDGsk<#lcI2li?@bvfytP z{LO@)cFTGt3sQVV)3Yu#R+UPJ3t|DSd3tLD4sbk`(>U_8xtrCjh6IT|jiEahcK%A{Z^{Ci{% z$x=KT!v*jN{%tpHKq+gUcceTnrRd(UYm933dw~(~&WZgLtF~|ftaM?{+x4O&;VCKM zPkvEuY*5Br>*CW{|6Qz!?O?oI{{?L8xf*r%)B4X_ExA~{(BbX!Yxiu`V&}qz6VE=` zx(_;i${%gh`M*{cojP=c)#cV;84{Xd2r#hhK3Ccwi#k#FV}btB;XaQIMRw(7~0Aaulf{c3|zzB zY034FT*b99T$s47XNyssUtjU=jLi!FJJ*`Fh36%Uu`j=Ip4+oLe+1)c{Au}$<{s~E z{dj`;_RjnCH|q4|4bPCjZIKa^>+ttGb{Fumk~cgeZ;VvB@zzoHH)66qsWiWI2x>gp zcw+$7NyZxks5UFCBGoUes%*P^EbHG#iQyk_n)H);b1)Vmkj}r zZMl}}?#KReL7qk#+@-_g???4BS6Z=N-`#tCQ-CC(oh=R=>S_;yse1ikcdJ#|H2j>m203eAfdLMt;YS9 zZ~^1KZuO}o3b;c~d+{n(B2;5ip&FBeKk)>Avte$Y9aELb7AqQF#t794ZEP8vj}2Z)i(c346bf+7~y3)NiGZKa1Mh{e9H3J5^I(*jP4o z*SXeBP24p4o$-Dl=yGOSt{uU6%3sF@JT}GNkDdMjFE6-QywK^B^}l^=<8eV+QbO=* z?DZv{!!*iFi@Bqgdbj(C2Yk?|aQuDwneqGkt$@d#Tfqq@^#(|^7~^6gJBNTb?xdg( z-hYcz=lH)FHdWfW9CTrR5`f@;IAo3bLbb%*aN#6SZA*Z~V{hl=MxtQxEe42uyVKkA zIYEvs5j6Yu2nSu5pAH~pOX`=(mgC^UWXl%s9TysN3-dRCfAY%r$}b(T!Y)*YSDa+5>>~eZuDfJzn<6@=Nx-M~BBgce{5Y z$0(oXkDYcN2(v=@OOG*k=;Rm5B-IPtyvH3nyj=yp<(r%3;loC7;mFmA!wP)!z~LXq zbgrWLH9K$x%!?PKb;XhF;<<|A*>K@djB!>KE_DW~ddcM{Tl!bxX}$5*Zc4>+UD}Z_(eV!{^P#8M$0q z<5ld^dSO}y{u?-B(jw)I32@?x-nh^6g<@4#j4963jrq58yc63-HHcS6|9pnLB+EC*~+vDBf z_wEkH(|GZ~IL$rY-9hy>IRDUJf1^ep)Z3tuwQ&Zq@W@IwKxgmXoshtvpQ!sKE5X!v zpMu-zN5hNamgDQYmpXDHam%S2n*+)mIrHL{GW))3wOIP#vBrN2>!w>!Ty_8S#91#sb{*jOssYn?vjkG{ufC2N!lO(D8BXKU!l;Fkadpa7@#6f$n~?-+Lgz z#o~nq5BZDPFBrPsGriKyI4QuH8k@c11hA;PFZDe+ZKIg6{Au+^WZ?i(_6j`lB8T@%(XWiYv;` zRrg8H2i~6zPvy}Wg>k=1f6UnDS8W4V5*j4$LpbvgPkgk1_E31e$aJxF1_$x{akOq8 zUWvB*QLijh47pJGBY(5>N8*9i@<*tXOWxIu7aIK~$uiP2L}okpCJhc2Iy2umdYX$ocK@1WgiOBw6q4Hrywc`Dx7Oww% z=?^LW$6rwm{bBLi!SU!%7Zazscs<2*k;6i~_I}ZuN9#ppisLLrUF(VR zdC~qu5QDQq%HNYWs{A&n8vf1{)8lyGCgziO4^sNuDE%*2M}Jtfi&Osvry1HCx4crt z0k>Gdvc)rAw$nR298u>j>)y%=#MJiCVI0IcM>!G(32}zE1kmVppja3b2U$Uq2D1VxFqaGsV=Nn;ShgUYyNy3QU@FZu9 z6Q;!&B{#LPfzm$7SsqkxyUn*6%9Z2e<3lRN$ChjrAN|(J_;`O-_2Z+{S8>Egy4cX2 z^ApC0cxH+T0x7PZn9|Y$78b*Jg?PreXFe-Q{mfOW0o5%Vq94rc(?1BK;pU{)0{( z5gRUY<5>@Z{O3&x10a;` z`su8TMvE{X-QuDAeyyobTHRo2kvG5gsnX+9Mav6~7H{k3LVO~9AN2Ag;$28$oJZxM z-Ny|mFs!jxZPVx~Npwb?N#3yPBWU=bkqNyfSv($4)Y9Wq#RnJg_Cf@`;6Z{(>E(kP z_=kw2(Nw6di=TS3EDEC|5p|^Z?1NrihB)hLR!~$vqtGLrN7cFR5-;cIRV9n@ck)8I z<%kYLImp6%0YR`+9t8Qk`xd#oy%a8-f@qNHzUOmtAr3M`$q*hQAFw#YAV^00^kKX# zjP^4OkPK07=(&>7lGAxXlF?P(Lngr?`M3HPO;c8$&$OyMpE)103=Qf>t(JrOtX^Jh z7_76@i2(&2es60k#8eX>#3$X;NpIG;U{^oS?N1Dq=55a~@6w5rAE7EtNyBVibJ+ETrtLap#0R^2c zWP)Uf5r(8HPegv;wJjC zoFjJq;7lL1B0~*k)yDNzhWPXmfg9RA;E08Ms%{i6I-;R(YvTe;el_EBauT2?!9&Hk z{XKA}=Ps=Rz~%s!n?r}5nu#2uR2jZN(in#y;5&NIEkQELkWA>SBPA1gPg6za0uvbt z7iV&O)Kom0g;UHXjW{Uq+lrm(QC46CH~l95;kJXXo&T&4nzkuvhAzf|J|&U065}Y> zP+Ei8?PxFcYqUiQrLS(}Q5cC410*^YoqlF6OB$2&ZZCc57)62fDg#7D%wC-hq$bsNX!vq`LINJot5#vmdR58ed{8>R?4L$mJNfpyD z747-BnQs3^oyUk4W3+y_pZ-3FqDG&yGn_4oyqh&R$lei=+|HG+ffUm79qtnpD}WI` zL4i3|Y&?#;(@7F3qJc-kAsxqG4Jk-HVbK|SDXnRGl*#e;<|}^FI=GUqAbBJDy4Lva z(BX0XtvJ>mk9+B>Nt07j|S>U23F39hRrUz?i*wPK~s@_p?oPra~>*7Rx+z^tZyT=9uBGRc~D;q z)$E5#jf1vPyzM_Qh^W8)`i@cUcRE~HwcnA>9s8N?aN6(thn0?%a1o$mkM_H_UXTHM zwBHpxG`9WP@lX{N)P8$=(3)*BpEOqD3gVvD!l<$sVUpnGUF>=Il zo_dXo!0uG>N_*CrBxpra`R(2=&fXG@QZIgsJc+?L*?xUkD79Z2Tjch|Z&Oy91Eu!c zP^$`7d;STw3*xuPlO2px_OnoF|9LJ`oix=cDSn%>(){-CdrR6f0Lr`#q?^ zRP8_O#H;wnAGv0m!R;r>EDnrM74^E>7@v#XeB};SYiyjn>_N5GnZIQ0hxYfx2jf)x zvryUoU2I$+`~P+u7s&Sapk{0LLnqd;7Q9+wVd5w9fpE#x6Pk z4P5U#B>~v~OA?*;=WIer01JyI9?U=~h|k2ETtz+!LHKrTbq?C2wK$`kb22sAAKosL zPLWzQe{Mq2s`+r0fvS=-F7pgIrzW{!cEMjy0fvgqjT!}uiV@vvXmVn$s1g**DY z?P8RV_0XmEcyB#dy2WiP4R3{$`Dh#qrQjaomE?8OV#k?tSZTibSW6G;bA;sw9TRt) zE#+sB5~u8Ep=5tbmfK`Htv>r%X@2`XsHMq1n2w2O|7QF4XQ9%5ujH@O>a(Af=C|L2 z`V6!Dpkw0MzscTy7Aoz(!M^=jX@2`XsHMq17;pbC_V%+-+5bD*+s{h#+wVbrhFN~# z?XR%6pM^^MVGB)dN$Rxv;-8h~x8H+Wn(Tw=n0WF3v%UQ+l@h{{#&)7T29f}1&v7Wx4(~FrI%z;d&5DJD?J7pY0l)C)~UzyP$@E643b4{ z9*P(sT8hvw*1Imy5r{}=IYOuN&~yn+z)iM19;(t^B0@7*C^UYm7_!2KBR!O`FDp&` zxfZvP39!oRv&+7%v_6~t=@0Vk$rmrl_1Ub`e|JVwlTjA>t`U{=6~e};eEw1CYjb8z z>iZcUsP?TtKY|4*>Dx9<+BdFCP3jB5K9W!0Sg5s-z5=DM&e_$`2UV9$ap<{9W(OrR z;ZiG^n)V@im;T4?nZ730;pzFsFN>|$&xD_9kB9ef)rQXY`fn~J4GWde<#E*e*Rs$I znIW^8A#@dHj;W;0KxyB7&q7ryFGc8V9$G9p*2B~mWud?^ zOT73At5|WwANUYwu+mDxQgIle2eD8{m{R~O+F9w&MS<_FVQDJe#RwhGLP57c-LHPk z3RHHNqrh`mfsWk?_**b7St#gE#uhx;N_Q9qF8z+BsqD@~Xt5P^3POjlP#74eAk9D6 zT?;_bP<)DaLRHfdA;wa~m#4bpurGc5&wbE1sPcHbc4ejUFYpdEz?T$DXaWY}0v@WS z#7PL9$V1bm)G$J`SttZqO?R-T1gl%5TMPlw|)O5 zD^;13iO>=&Xf8q@;-QK_F+zK@P@qY@ZN2vxvOY4Xw;gHdO3>SuoXB=t)!T-7=g9t_ z^ftX$Xd+jatynnY?Gy~0NI)aC)7)!utxQvIYE|Y}NV^}D4 znaBdx9Mxq~QQB(0t`r74AQm$a`l=O_g8P0RstC|B>}nPY=46T6-)GHHeq4bZ4`8J^ zgJ=>CQQs}Mks3zmY#yqdl!?$N3w65nLHzKj2GNTQeHOa)=5{vSdXjfo?Egu(wx-GT zf3{rU@Bho#Sn&0K9_s7=Jk;0!d8n`dvryUp-(}75_5aUUsIUK9L1q8vp}zjlLS_G- z$8z-be^#2m|MR6HB~|u+9_s7=EY$7)@CMG{WdWedF_&Cq=-k-;DN*-~WrzeRZLZ9_(b*|6z@`lCKSA$RV%@{)m@(sLB&l5PB~U&5}}QBlHR$S}dU} z5ZaE1s-WG9(7k!6N+~oMUQxz*3i@EG*fN)cI6I0dI0lbmrIm!GIq3+!mWL{H#v`=7 z6?8U2>+?`WfaVKdd1ZEeB+)Fq&k1ZVQ{A=L&=;Y*c5TZFQr&gS7T4GRPkLc6O}$qW za6jP&w%*{3&jMrll#g7GXaqW2#59xMkB5$z(ML1sZ}?i1ioP(0)ayJ{b*4;&7P3(2 zOvz$O32RO>$uS3|b!MeGor!wLfmYCRl==f-mQn;N5c(Di1#_~*7jsy1lppD5%?BE! z$z6((yg-#^Gcd`wVg;6DDpw+O(^4Cnr3hVU1*JjyaUL3$1Zb<`78VMlJ|&y2-jn{C zSO*lTJ?Th3lR&aremD=21-6mDxLyhF#sA!Y(Yu)H^$XaAwv(S`Lj#LP`5Ki9*fN9; z;GtPEUdj=ACJ!x^&;;zIO?as4f=LKnzsPNHjqxQam4y*n%0i*Oi% z%QnwN=;18XNhdGxk3pz(vgR;8S3o)$c?b`Y>7?UNu8;q@Nh8KGO&0>sQ~tP*U8wu= z$K`y5D>i=|%R^)H$6h=%Hh+9R-)%OHMNTkN{+P-`WAjHY3#I(=#4D`g*!*!KE6tZb z_OXIe{#f;%4FSp@udqse`z%PD`PT0tp)?9W4E^T)SrmB`5-{ovuC z;8irB$}tyBYQ>^(zb|qy50Uv}n{XW%)64$3mzv%NKF!4S(b@b0UiI{?Fd~Sie1%Nq zk3<}{Hk7&!*64P!67}?XJXGb6FiL%dhpM>GMCgq?ROOFcgoartbhuP;%}cB~Du2-W zXwy3^RCSHnsCc0jGyx<3aVuyNLT}-rifal&&t{=ud5*Y#8f%VnIW3a5zRf{lt9>>G z(Sf``6-48a-t(+LXVoM*a7KLf97yR%TlP^_?=fE{?i~MtQTU9L6%7?G;(Aa!<9}iVgPx)?feeIH}O4j)2-lOwbVKfEjhexvO ze`h8q5&-)9>#ln>0-b!AfK#6jc<6W#2QfnV@M#{ZLOG05hw@OB<=l(x4) znk==q;svTCmxBUdoyqFXl#wwWq4)DpMY9~CS6e|TAD+NNRa;U%tjj{3Bp2o9YAVSs zI>4CZ1~lLya&6mcrR%_dZo)EHrb$208fA4L5-wxw5l%j%=Oo&`>UvTm(0SKsDR$LA z_yUs(@D&LCn1`y=w-uq!@lX}u%`m`+u~5oqBQ5ueS+nvES`bV3JlU@=6RMEsEn>afvK!O$LK^{81BzPVY(q8O^LQvy3w1SRDXcra=c2g!;(vZ!(>WQg3-n+at`2ylQMZDm>P}h*c{{80| z59r)k7@e^%G~j*wB0Nh*Zw`j!<$UQWSwf2tdMpoBaY@hI?Zrc9NU78xKcC9?38*w~ z9?wCXIrIwTIFgm-l=cNeuVJAOnK|MPE5)=VXvj+Q^~5zVa^^r5m<{d`yB_6G&atl| z?5|^3fsXDO2+iW5&1Ay}gmz}3Kyxe7yqu@02B$=vWo&qXvj_yHV)m=c3sg~-jshpL z0v)@v5t_|HL3a-79`y*v&09F$wINcQTH=rSb?gKRiMCA zSbTYqt#qfOz&9teG?m@i2raUL&PHe-7V6AyHq^D5-Lz%jeoeER zrGL0a#0=j5UjE}fpqZale*XR1wUwTKKOHJZ^8GJ;<@4{$lD9g0S|*2S^g%FF?-

T`F08_aG}xDNe*} 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�Jms|?2Z2>8q25bB z(zdT3>5q?WKdRsJ30TV8I2T}R4cNsFc*-!&@5R>tb0Pja%Ar1st(RD-i9YZgm1NH+ z>6e%O+Ml1g@hvW={nRv=UVXQD*F5(Be1gw#$mTtR7|Ot=JK!0E=6%-SnyB~cJ9X0s zU*74Lk8Hf^fA9-_Eah#y0c^2( z1+V__Sv)>>7gj>ubzEul!)N{YTwk^ezF)K`zS0G+M)|BGpQl{tf)63UHCFME zivCT%5}z|+>qI)9a|TyMJ^t)wlkJyc+XT@E-*~29KGNr*2hgbN&gG~lJr8{v+A`Rf zAB{J7RS3>c#4D}Bw>+?^4tQdjAFll~2DgCvR*sjnNnc4CUmA7#;UoI1<6Zq-PQX&$ z#y9je^#3oS|FLzV)6vNIat1et`c~qjO<#QU!$&qg^|z6LrM!)=0$bq?xc}DyPZ^DG z2w0^u>RXAAHhuBY4l{eY5Sq9fUMv2$4B&AkH_lwY66z>HqIJsWnU8pA+}DW;wV>Uke;UoI1>z(@BOu$m!#N2@A8FgykC8tf zUu-|B-*w|pT*SsX^f&na<7>lUr30Sw+K(w11^TivopCwlnYo!axJA_UK7QP% zxIB5KYfHPwqyv<%^5< zePrWOKbr|y%G--Y>qV;BV7x)9|u2A4B+ic*)7?T<*mHki`-(f_x&u7bYVm`($a zs+!-X#l4}G-?&e4dGfU7%P;Nw$mUo5Ou=S1qTGzZ&6+x8n{V^yD<8wD9hBL%7S9+NPr3_U*B!-|yWrK>GW0irt#-f@tNpxUaN*q6`k6L; z{Y*c6Wb>{5W??&tZ2ktnj?aIAt#rUskH)uXac|yQe6;C{kAC>b#;5+KU^|Iyd^4~$ z2W-9ro_ciL*9>k6b)BQ}?{fHT(-!rR?D|XlKBAv#Y|MrF+4q(ZoS$r53$RrJcBlhh zwLAosiowmJ9{;U$VyRPYSpR9qM~aQw?#B5KaEl38D^Gv=-x{v(8bsaaPXL{2!}>!z zK2j{(vXGsH-kh=Hli@!4Q#H7HfOOy{Q*Bs(Xvas2W!vDNOOy{Q*Bs( zXvas2W!vC4u>L`B&e-wEa3B4t8eBcWAL>*a)*ssOkz(0af$YFLvHm4stvvln0jrcj z-IpKgR2$YG+VPQM*|r4P8gMfSSSwF|8V0w7y3Zf#R2$YG+VPQM*%tmi*1vaQ{lnIc z=ug(*N~rt%p-#17{h=KnDVA+z$SwjmpMbUU^k>=N)=>BPL!D~F`a?TDQY_o*kj=dt z>mRmmM1RT#H;cN@AL>*a)*ssOkz(1_zk=&O;OYrjD^Gudo5S^81E~A_p-#17{h=Kn zDVA+z$j(4-#@O-6aNqxD?@QpLsFMFDK`{bqxDyT?P%sE+42rCx22>0x8iNN4YCyrL zr~{}(MU8h<)EIU(imnlljduhOJU8B~$8N-n6?Nmecy2sav+J?{@3*U7y3*5=nShA= zf2q%B^6lzZuj*UxRln}(>6wsEg|Vwiz=u9v49kac!o=CKtqy%NZiq%!B(Syp$tMb1 zC!??(Ha_&}Vpu+m6DH1|TZQc~KJ@8g zSU!vsCeD^^P3T*2Bc6Z4E18f_v9T+~c8$?pfBJMWEFZ=RlfqBKuTNGauy;NfqtVy| zxi}8AuSSgA>L@nwN+Nu3Szzp9*iMwIb;TGQBZ|%2iz~ZZ{7o}j=4ZJ7fjHGBu4!(u zNq(!0UFJ=x@neiIevBI?X=Y~``o?aGM)L7WCgfLsQ?%Kv7Tc+eA7g~^W85&Y{2I_V zb5S(XkigdVC%+unIw{0<8D7EqaqSKnBa9#8hDpKa;m1L30(<9!F_sydMBHrt)rggO zGx9h6oWCG;z>XZ)Iw{0?*LG3O~jO8WVi~Lp@yUahO#*Z<=_%UvnSbo*$ z8$+CYypjp|l^eU-6!|em7(d1h6U#5si1n`q>t6y}+n@Y$VC$q1+o{YiV}$Wz+%U2H zV(44TI0>Al`QS$YVF~ayUZkSkp4d`2VJJvtEk_q{h7`qB=r^1gh!uT<6 zm{@*=Ut#@&U0niO+n@Y0?ua(;%Efjn{1_vQALE9JkEbF7jJt z>@x34jUQu#@nhUDvHYUnVEsd!e7uqg`IQ^H+7$UQMi@WF4HL_+0(~>@#`>4Q*7hgA z9N0Q3#C9t4%NSw&7&lBTzsR>({}?BMt?f^K%Zyzk`z=bo{xL=vKgJCc%P)q$h4*0n z!z-DPUx~4+z;-J97$b}yk!^H9{L*E$U6$u z^^Y;a_%UvnSbp{BTet-4A706X{7Q^n1-4V+#~5M!7&lBTzx*bwf3T}dU~Bu6U&j5> z=3TkiPK6(1gz;nCFtPlq(YFF|icQ?GKHNusHO8(!MShGC#*cBs#PZAh57xg2V8>Sy zA-@7+7sGZc(wTTuk8#7q^2_}%*1w0a{w1)r{mCx}woVGMoyz@L#t7rbxM5=X zRiJMz?8*|@+WzFX%-A)u-=gH}A7g~^W85&Y{2I}>a4FV5ypjp|l^DAUY^O4Qj1k6< zal^#&EB*oNAMEN9*xLT&m+^44c~>sBQyD+T2;;}NVPg65UN`S+7n``jKGwb-vFc!3 z(Tct6&wN%`yGQWcYVT+yr$^M8gd$^v<-@pPV)^C&I4Dw#IJtNw6Y?uHcGW5JV~j9< zj2kAFUp4wh9>sH$32bfu4WMMf)=2@kQ{>1#jKv%&_P#pfhl%Bx`4gW1fL&<x^9^wo@HT`eCdvo{S$RmS+ro3m?Prk5@9;5C$d2t{U5I<;ob0$($*6T*)I$EZ+w7 zjXaL|Phe~Nb4;>e>m(oBsT@Cy5muj!8zz=t@y~-I)v${tu(kckZ>h0sz;-J97$b}y zjgm#PZAiAD;h%U2Ote+n@ZJj9v84shy7) zBW(N_H%u(QYV<8boI<>k3HenSySfzlF-90a#tjq8FA^CXiPqt`OkivKliw)VIw{6> zD(7>?2;;}NVUlKc#?ZG8b`=S1jj6Y$t*~}arpAvk!uT<6n53DV4d`3^B+h?$B@>Qc z>66iBvubRoGJcE^#*cBs#PZ8e8ytx|h4n9it?f^KS+I4IkL^_WF-90a#tjq8uNHl) zVHZnaYx{SAveei$U^^9lj1k69k1^8Kxjnxz zZkSkpW$4=gyV?Y{wmaVxevRl`hB$?IB@^3bsy)v7O5NGDa9b#tjq8kI#IqxDo4L0$cXC_H~HW z2-~_=>|IRelkr^CsgYc4r;-n2gyqAyVPg43Hy9kLK%8O|H>?l$F-DECtHX9<&nTN( z2z|O3wmumrOq?y-V(1%v9)1(p+WzD-3bsxP*)N0-eYzNy595T1vt?U7`qsj(EP<`< z&-q(s>>9D1=(|+5A7g~gALE9J<(IqR;7H*zT>s;hOvtaq*i~RV;diTyGsXzx$GBl) z`Bk8ABkbxD*xLSH{r|=HnTzd2-?g&+7$b}yLnb<&{t2VLQ=xvTQ%b2;;}NVPg5^Z#+0s@HagFk5@7wzhYxoj_pL>(Xzf6Ba9#8hKc1@ zjlQd3w={vR?N5G@`e^g69Be20&Q`M#HW(v}ALE9J@t?4Zm&v0d9E%BB`V zpDu>I{$iXkakgwLLEo%5kaq%G+n?i=3tK0XuwB+G`R9s^5jI|o8zz=tE&48nU3mgq z+n@aEja?JAQ~BJ1F~ayUZkSkpkxd6jCcTLeC!^HCBvBBdYA2Ab&wJ$-eYS_kFv3GvRX{oVmz;-J2!5Crn z!MI^!`SDtU*A1Bs;kN8=?Q0P$2HX5r>|IRGQ@OEQitSZ+rIHhUFjm++F@Bh2b`Kwi ztoOq0oe##yH8!boOmhx^jLkTcj33kNZCd*n?3co}ycK)bpZw~LT@$ubxwd4Cu)1K} zFtPmV(Rb4OxcwtojGnIA-(ca6e! zD*PBDj348MiRBkV-zvl@F>%BCa37D8T4UFM?Nm9kKVvaRiaozGewbLEb?BS_A;tr* zWWpGej9nS~^-lgikulQMx#h>WVPg4Z_QdBOu&YgAYx{2qrODXkeiV(g`Mnr?Fec}O zV)>Fsm{`6g=v#rf#dswXj%SUrtH*XKYa?TXjVI%ViRD*|zPTU6j;|!L0on_UT`9I} z@JeOQ>6)>^>e7oJ5<9b3cwQ?EhmdYwj7DRVDn~mmjLkS%|BQx(@b+2z64;l*wxAVz z=ZJGvVeD$K9rj!SeYzO7?ieRboGsgG(Klli-v1=9wf)H_3R@?mupP#SK3xpUhjGHh z*?MigvHroXB!R8%&l;&Ub}O)*=r=!YzX)Q49S4jXCYE0z`i}Y}ir?u9x3&Gruh7_) zVmr}qq}qOr5yp>k!^HBdM&A{%t4UyM`;%XzvCH}taPT@1^Ial*vevaN!-e2M!V32beD&RZ62o#bOX5hrIuWQ?$RW88LW zAA$A}Xdi+05ojNQ_7V8?Mxbcoo)goa+bC_&f5sO)SX+3+cW>X)pVtL@>^$Y*In!s) znR3e1la4*QWa`ON_B?s+Ni$ELdd!?DbEZ$7HhcQ?Go}w8v2E_Q+iyQ*;`FIwy&Y3d zo-=&Tsj=9}vrm~a_qdaeIeG4!DTf?4=hUe)C!TWZF~^;pm%IIlDWxNKn6l^eX{R3R z_uDph%rwdQEClC^GEkuXZ~F+eX#}eFij>)F+jhNuJlgBQKZM$khxX&4{dj0U9^44D zuLtexLHl~(js`qi)qefhe*Ns1Lwh~69}n%vL;La2JOb_KhxY5G_UonQ!=e5B*nWO& z)A`Y_oc68u5ojNQ_7P|wf%SO=F8fo<>%n%teLU>-aeFy-c z$AcSz_Vu8BJ!oGK+|dw;v>y-c$3y$^(0)9)5oliz+Sh~j^}rns?dQk#^`LF*fnPc8 zTkRvzJ_79{uzrp}TF10V#~6M`u5((Xv&HnZNILbL^hl4q%vjpy>5)!(9b?V9+wb~0 zKMrZ%tz#^EYhY!^SoIgZB9VT5ng{8TZ2A4B=J;EtM>fmr9LpXCoZZ>8uQm1qE){#v z-)!+$+~4aXfB9Uso`Y}CD*UmY)7pEU#g z`r4vY`_Uft*J8dozCF_;9rMz~UpG@vS}$GUzvJw5Z{AD#^zr7jarfSl{k86oeO#{A z7XUeacCJ0&=<9LCSa;o_L!@h3uSh2xzpSH1^_P_|HM9%xrmKW+=Rb?zLx9|xsrtRZ zxHzW1+2q=9~&(KYi3h9D!p%0~?Fn)1EB@~2_H-jM>;hm4W_mrRhl`aO{TXhZo1NI#oS z5S{z7%{XyP93RWETsi)XK=kL0X9~xo=c7{Ahy1Nl&oj0|e4hCx&&ILBdFP~HZv{dSD!T4A^{cGW!L`|v)(cl^G>mv)q!m2X`u zd>tpp*VS~&=xR~dy5^d7wV4Q6vs?odyKV=4xvY^(%{b+vrtT||JP$Zf@_hZ!#Oq_q z@mu4S*Ya3erF_mkRe0F-FKdv${(U#vwBvZ>oEMn(`KL&GaBREo+#%9CEi00#YgL2x zVeLf^khv^WPrGC}By0DML7acQbx8B0-;<9K-d%U>5b1_7;I$uZ8qF9qqW&JdUF>S-2*19k z`26Bx^LQx2In$x8&F;M9t{uJec%{@x_16BF7bD(o*GasWkCk|{OA^PEb5FnKbI&T{ zt3ub~I>n4!@%zN_;y3*SnU4d2l*55;+~e{x>p5+k*9+!{^vn3ObzLpedCAlLoTnf^%Zql7ucGBwF~pzGOq^3r)$`Bqb`^d{09)l}{Rert zc)*T2zbj0<3e0cp78#ETnG)}GV8VDhf3{vSw(vz=O#$DUyZMsGt{5YLiqXi3h}dR58-tjur0hM z8GjY*yEiC%ac_ zepVSjh48cW1;Xbn^rzgOqMxi`{dq@?$2C0_7)#a-{~d4cy>vWt2) z-_x@9RhAhpwRjJI#yt}M^j8@@61f1FX#U*$kKi?Z^|t<8HjI({s`Pxe>|OEO`yZ|N z)$1SUzxiGz&!gRNUU&Hr7b7p1r_0-&*Y&(>-^0{zC){?|`$x^!2<|?fyGC%jJ9pz= zR90S(<}pkg(jn4wTGv=+u{TWq{Zwa94&BT(isRtc^u4>m-(&#qov ze}}Z}9ab<^Ka{AEkMr$r*4sQy)&%>PE|`o0fH8G#t&PzVf4 zvfA**Wt!Y?=W*fk_tqa8G!nY&(x^ax- z=hg~`uBI55?}r?+y~wN?TsLR;l+RvZ$6U&lOFr%kFkbWe;(RJ*kCZi+eU=*j981U3 zjw|QJo4N4=yxsYxu>t2BH{at%NdNEO@T?=V-;_F~4dojkTRH{n)XazDBXxRw^Eeld z@awdAtoW+{N+kIopmoqW;*E;YJw%TwRx8#6T|e@ouwMpV8{@^c&qH#}gkP5{Oq%7W zA(HnaAB)##f!ulRzzX-_w-|7CeFJyld$oj`$0h3?edlM9|vUrVj%Zd0yhFauKEjKi{0x$+WiYiyOM8Z{~RFq zUkT*?4|M;Rx_^^@%l`X;oU>cM6MfI`rT+my_CEp0{!4ZL)4Km1AT1AR68ot@+H-y> zTLM`J`Ko(6+wdpu7!RB)*LHhwjdRCNqV*sxGtE11r}2DQg!84lCe!sIty7x!xm5FY z7O$gb<2s6VdHyx2yJq&zgO#!-Mb4Dtmc#e^S#q3s?Yd?anD%G3jBhVB?QhTXT;6d*VKqutD*USS3 zc*l2L<)FwY=qJI3*F-yM9UOA0@cJ8&K8If>yq^PdUEONF=>G$`|@s+vH9t8 z$!p#f!kc|4!-4d>kLstYUa5L85AqA$7nqv@&EpRB!&r>-azH05jw{orO)uNC=o$(;VG zxy{*CavOHFaGiCHaAiB?Js|sUI8pTAm@{^EF3u^7H}j5{iWImMPxQI)nC}nY2Sp=lzbE>yC@65xFbJdjObH41LmgD@c z=CiC^@;QH@@O%Quab`Q^DPr2N^vv7I(2I2BEkX+bKxl*|-Nx+4%yL#*HHqFOo z&XF=UFKVAJ)koKZdq;Nplf;|CXZ_6wHQbrpQ!$= z^6aok_D=xP@9V0+38cIaq@OQU|Bvd7L%9V=F3VL0suA7W)xs(as-Z?_4T z!~Y~)*iN}zx!hs7n0o_^oxLOGXtB&u>D1)oQfs(yj-G;Va++Q(T!z*Nmp=kIE^Mc~ zu3WyhT=Y3j)(d0XwWTQqE~5|k$Aw%v9V%RU9Uxq0+%8;R1Ck5dDgA+*qn%Zcs~2(^ zf%EKgInS0(OFk~k0$j!`m*rasm#6O#F5~YME^MbvQ7&Z(xG=Wm(v$+1gC@5emn!9Q zU030<$6dnZFF=k9+bMS{m%k<8!q}Ee>Cwr@r6IuOpUUM;J*J<&TgT-d;lg&xf0fJT zlSB{B5o22}O(}4hIi=;ejD&C2?m0_zT<+Cz0dic}P8knmy_}eU3uCufUyeyWE=`6D zIa~$B3z!R6)t<+CtTQ0sZuTvST5$6E=BC%HEUA}e9DjT$A)~Kfq&w6`V7L* z#loj_iSS`N>aFfv2Nr~6^z!*is6IL>@A8ZmmL&#N5zNc7=2 z?L1z_>9+fY*Ox%r|KS1AuK{{O^*)l_Qdmi&@%ZwrU1;?;VIm3nLm*~WCe#vm< z*qw@4#4EOzJ_{cdZXZ4*+}KVj2hzt~st0SGv4iimBF84Lu_;ISV@Dp(D4&OFgwOd8 z3!ft&(K*%lZz`Xi4i|nwK8)?%BbkkRB)Iq8>uXsj%TnOf7~pgOVw8Z}YyE}O<&O!c zUXKeWwo|47IY#GLPUrcbJ21Ar4<9K>K0fn`{qf=X;|loZIGr$3xO@)|l#`wiE^MdV zq+Fh`TujX~c8hUIflJ0zp9?v>4Bs4=`G*LX1O6;r8i1_pFPyGiHk@qc%8rY2;b+1; z&qj_*J}$pETsSWM;hUT$>gSp-)d`pUCxr{!DY-z-(FDuIjtgSjb+Rl4F41ZJxRA?q z<#HWT;W%vmlyF%Bq|SCqsdD*40xpc5)+5bZle!MYvxT!e$@m;E<8wFqW$1g+2~SIm zxj@Efv3BgoXLobG`@OtJSb+YsF$lD)hmU!8$@b6cW5;L2$DTmSJE~is?itavVYoIc z>JbYb`xPhnb4VZGAP(bko5DGucVh9;{`i$c?=?l{vdccg>xJiq$G?HJuU#hkqd@wk zJ!J@xEeEJ>`3Bbq@)OR{<~4tXaz0l3drtKa<66!=j`2BHq3u%inFKsv&qe)T5RN+n z+3yL}>wx6^hU%BTC_4L7ZUD09)2heiFwI|2$X9ak@BLKG^v9iXJg54{Gl7n((<1NO@KHG$!D~*xq;8X3I0@ zRmvsf$lj3+^_kv`*TvVaK#qNjTHIQ`m&Wxv>*PL>zbK!y0a&MsI>nk1-+S{uU&8w3 zeSYM0htA&V4&8p&59Nq&v@ele=J?Ca9=8dvHkjKR=AZPCy;Q7Z$ zt@Qq<%;y9k`y8YC$w2nG97u~ktK_qk5kTtK0@?m2AZ0O-{h!nJ@3eh`Po#Y_Alq%d zq_QpF6Byn6J%PGelH22&TZ87-;V8*%h~fdj4Z!PE;1_cx*GlDbE0Elu29jOjr;^)o zKo!9}c9x0!W$hFX289NZGbg#^M|x$8VwP{l1d+ z7lF+6J=Kr+dd+k1x((Ki<+A1!&XHUvBA11=GH)Lt2IW5?v25Qe?Ry&fes!z#J@p&u zdkHXZjy6Z!B0TS<$CVeP{ZIP{{2v~Hv@YopTul~x&vUK>HMT3 z61f-1ew}BCz6p@=*oU$NNZ-!|;@k5G?Sj|fj=Pu5*iw?5QS$vJ)<#ZFAE zj$*Up>nMu8u8uf|lz(3%^Kg^a&!2&;r@qHZJ@p52p4pc&0?2wA7vPbso?H&Lo~kr2 z`h82k?_uj@nQ4C~FTUQIO#6KMI~PTI{9CkjvW9h(Q|8xE_o=3i7i(PB=h|L}oc{#t zkb7Rwu1BTk`gPP8m_N<|g>%oBTaT8WGJv~Vu1DzW>gdPoB>(%gUj7DT|Dh#PKf{5n zpK6V_1n8|tf%wVl$8opyQ=|EiUoZV$fH&@T-rc&A>U!eF)zu4iH=ji3$D*sJJZ;a@ zXRj@W`K7(?x8FU@KhK}1+LPqCn|8B|^CdUPxZVxqxH9+P*g2mbSIfbzk(!$w%W{o* zuCD8z50|&$+3efpv$~j|ZY`&R^Zny&kls`B+QG~F9M!ZRzHR*aP-EI}8x!BY!nAL3 zu(W&m73sVX-8={DL9cO|&rci&@M<16*Uw^Wbz=SJh1W&w0>3UAv@Qnf_en4Lqt*qm z&2{1C&~m6;gIrvlh51d8Tl7Ldwho1x^>cW>c05=fiJf#m;&>Z1#!eQzM`Cj)6W zQ}@r+{n+J6kY6%A$Unc_=N~yi_~!x{vsiToYT8l9f4q)AkTyR7z46~i#~(;AdA-!sCWAirdKkbm)|KK}--`An^!d{aO9`q|UUJ%!(QK=L|kFX4YR zkou26%0}aae_tT?4+Bzm(*2%-Kgsw8+k^aLm-+n5W=Q?i0vWSGb;g=JPU~kU;c*&} zHa`Kq`WYqqJRs#_pjSV-|1RDCknZ=4@F&PGnI7a{Hs9x;d93iy2a;P%b;de+g79C6 z`+JlJfwb8bzoSF`hXAQR2BbU>B>$DV|8w2{z3%sn@FyAHxOR8GcIODU#=HGo>x=aF z|A5|me$A0FKf(ngc{QI;X}{QuR^V=2(e0;24?Toq+6ryy`Q7 zjLW{15kSTm7vK?`&$##dnuC{@e($&33Px{*Vc}!U-~!-`g42}pygkBmCt|T&hd3qW7>yaDeYc;xH@3HxVmxZ)(tm~ z!}WV+M1Jn)_PcuG{z~j;e^XcX{a9V4UrYHX%W<}RvhZ2{51Idi8>B8c|8aAjphoK! z_e+)=@9?11zrSAV+_kXYZJtO>y zp!|SLmw62E9{Y0)u8GrD3m*>Q{k238= z`nyj_>&(@Udtd1Cb@k@j9lAQT=;}I8*FhftY_}NZm-f2f)@{A!!Fnju_lpne@10(9 zz0}LyK(@0k;%dUh3UY9|n+uy`QOj$9tgB_LEAYKS#%W&P>3gyAp6&B@d9<)I`8BsY zZmFW<8bDjmCD-_MapxUc7d+4F`LN2g7aybfF!#XuaG9~2HB%9rzBsCBq%uH<#eLajp}+gGO! zgXjLnYi0brc>3O^49In|Ht_y_wtfe9;aFW?f!_MMhpw+cZ+!()o(IzJO5Ojt?*Cr* zdq(&ZcPu4YUxPVB7Wz3fPM32|RNvnen)f#s?=9ol7r*OB83`oc$ALUQyrKH&kaqde zu6*yW{AoDGzplSmkJsoR;r)9c{n3W<4Um3@n=uMrt2;i;*M@;LEpER%#@)4$vrn`? z*zR=q8#nC7HNu_i942blHPXFzXvUyl*WY2VJ*X%0>-sx%c05;f!d4qaXKO!IzorTMoVoSrJW`Eh(52J1A)KRD09e(pCaoSoAhZ?}I<`vvtmR&)(m!TRwlD`9hxvJ|^(QTSH^AhGx!^HM9`u?&k4v{2jXS;Jg*-d(1psAM;vovHZqK9ddAS9XihB$JeMz|JhyK&X2^f zKJY%#-Pg*wXseErQyGvx*iJbg$o|)<9z2gQw&jxlVsb9e1i0L;T)xofQa)5J`5Orr zwo@KcF0Urw!q}EeT?$+Z7qlFg_m#^v`fSN9;NVGyaA7;;-^!(n)=S*D1i0kClzd#? z4shuU-<+eN`aSexz=2YyT-Z+87RWi;D*+eA_U_45%C$&c3S3Hl?~e=K-bM~mE+5X4 zdKs{>a5)XgdSN@|Smknd0xpdGOG)#!gF9BZR?Nm)ple<5Sg-zD%VRxvws0;6a{Q`Q z|LYjZab~vUxB$rZ%lpW2{xFa^Gmp6Q=r4Vo^S$F@nYY6FQ?oi#UXY-u_#`bDRxzwk?<*opirwU%Y5Y^US{SuclLE@lm5?6oCsy=lG<<@IM#{Jk-IuQ2*|;q#;Z{(}A7 ztWev?cdshR+r8)X=C(-If-+c#H`cg`zw0^`5lzmK>o(!jlhk7F99=v{{e0c96Yyoq!Vx=ursg>*adhu za1-ELz)gW0mG+Ko2HXLd37iVV*Xkly0J{Mn1wPSJINr0h)Yj8L&gTjsIeq~o#|?5e zh|r=hkR0=XSN7oC_q!D}dy9E07!?1CrybKyv&PNRDYkHt;xR0m*SYAUTc$ zlH+_}ci>VW$I_nr|1WHNwTpWh-skeDsU!7Vl8xtox~1LWeGkm5w>SGl#$sYPM(<)? zDQTzojx^QCzQx03e(Qjo-`%$reFBhujs|jnL7wbC1jzjf$Jo8sbEwyY*$48y-d5iI z1oCPEuWoQmUt5C@Wgj48oe13eK56Tr`h}cfFk@hW}>!TpwRYkZuY!$f{uyW{7^KUI6zFA)a)IJ@9}$0Hdg>hJa^>(BcpmH4jgZw#@F ztoPDb6?Rn0kWNaC?kOMJuVR6o=@fxR9m zH+E0ntadv8-h84C;?UjOb@!w#hCOHF?(fhp$@4bRxBYpjeOSh&daUpoxQbVYxE=&@ z+_)Van>DHN5{>`bJ+@-`m_M zalYy=^}N~UQr{;4DJKFMFRJlI0KNJS#1GD4u)ZC4Ti;pl`uT3JpW}zscY(3nE!p>k zT-~q5`fgA@-aI@a^RTPd+oI22vApQ+<~<`1AeV7V-66qwU_f zE=jGvtL_Y`Z}fHbeW9+02M&;WJ{idM`$g4X272|a@kRi>`VPcTR^N`ht?v~k-_r(5 zzG3y9@t!{}yB4aQtK&qt7VEoO`EXovAC-C7c3<%?% z9M+Tdd(;R1Jl$@6#U48GX&l$`bBK3VGkoEnU>R$jE zk9{ahfUNK50`Y@$7+k*{cU#|8Cf~E&_rY10dHO$zaXrcV70Zm>Tz&pN?s_Cx=WDUP zi$9ck;oYip+aGsqdzb{QB;%zx`?J zJLhA6TpRC6t-dGS7gFEo>+1U~y>2|WtJL?6K-TvUs{aJ!JXLGFB|xvf1M!1%7_4u{ z-PZRc&4)E`r@NjEsqb=QS9y|Iw~9ipyIq~H#rlr^)1Qaxhh!dhyjyrZwNmPPueaAu zeV1tL{!`63tS9xobd_Jz^GZ^zx%ch)C8;}Tga^DrB1}hbzQ%K95?0`9Gf*+ze_ashr63`SWoJE={J6TzcwtszE^2G$E`7N z|C!@RVQuoo8YC|L^8oyfMDo4A@~0YoU43_+FL7?#LhAd^K=$h!6}>-@@z{s51n8~b zf%w5W46fgfyRGl6Z~c7Fx<=w4U#5eV1rE$1N7P z|IBfu1nax>+4%a7qOYs(5AtPRp4?jM`5!>~*d<5wU4e|pK9mta*7vwT{ABg*xZC=! zGWqtoIB|V1Gj_)eS@-o_{9l!W77X4^?f0b?Hse<*sRI*NsY#Sc?&ZR z>&f*=(+_@qPt)sSTi-c9`s3Odc>aUqND0>Wq-F8-U5&o3zVXPvHxFa_Nj)D0q>o2c ze;mkpVjs#9ptpVp;s@t2czxoy+xniQ`OxoW?tNp(^+~z0E8fz~>pEJ$qd)ockg3-v zPwXwcrhO{){Sk0&)OU%-zWZ1+4(myMFa6oC??KlIe_P+Hw4LJ?tCf0VZCDA`_ox@+ z>pP0RuD)05bstHMLz<_cTF&?YP_e&ibF9?>{fr`3kA; z0%O0{`Yq7Mf$9{W(10KN4) z5IhAymVyl$@6#U48e_=dQ2HlKQ?ENFSZEMc)L-d1N2T5}>z!2jVBI zZ^zx%_ax1Se(%xe5kl{O8@v8dGq3BYzM~obJQV8l-!m^2UhjV-^*#OLwNu|E8vAbt znQ>T8*6*bo`}KWw$o-R5+Rl1w41B)A8leR1d+8e?^^Lx+zAvbdaT>6x)bs8@`dFy? z4M4BHHQo}SSKop7$?Ds2xAmRX$nr9nU6>8JMt z#=a@_{Vb5}-kg~4B6_;}uFGnChbO1Aj9EWDp4O-PgQZ>k`QCb}%%i?HO54$_U{a9pBV-{;N{UQaET`rhl+R_dGY87lSJ$KMdjcarm) zzmr_OY2V1#ECvX3En6TpSF6|nWG!U=-mk^Y^!cFqLppl>F5IT0S5FTDDQ^MUXQ!c} zj|Wnp4D0~>O!cnAqhXASX0%U$Ks{WO>Puybd=2zdfWqy(CB)?q6Vj%fdsJ`tu z$#4FC!vDevTAx75TR__Hw7=-%fz&4hz4}zW>jBa}2e>xtv!Pqd{Hm{z{OT1WS4w`l zK+3GaTA!N@cdS9SdpQ^tCq>SjccJpiO-ZH=X%O#J9=9dd3 z-(uCzyjk-5yp!bI-@D3JN>yNR^V0#aTDuFd(2^lX`5Oy{Xu zv0mpdQXzRiuiqQEtGn>KwTI;Q29WY!AoDx4r|8E4shYu3o1CaS$wt=+Y2c&f0 zaP8)oo7FPEMm^6(ua-Ouf#h4Jda>TGy=$cKyLBh6Pax&LK-wQVO7!D^)XxNZ_4zx| zw+B)d0N3XHvcrs|)l{sYjf z&wZr*J|Lz0zH2wX;=V2OE7WVvGR0aT`8KG&qrUI^e7NxYXj{pz*LI@s45a-vs^6~q zqd?}jZ?3e@0#aTDuFd(2^=p}5gI5xz zfs{*BUkGG=L${Rn1A&w!z_poQS^t*#)#*CYs2IIQ@+$;VZpT|a^69dR@Y`^-9)Cc} z;XsbZL#qEp^_4*8cfzjHeie}N4RCGdSFw4^{3koKFRJIi+x7E+nY#G_i1 z)j-N4K<3wbjOasv)OP_gzZX^iO4}!nUAy^JZ_zTpTCKwd#Y}wW#X-{IntVMk3GtyrK90{W~C~&;K^`?B@b0m#DrF$oz&zB;NyplqJAlGC%MCzs#23 zoXr|2_l4*`vs&^RGFte*GEd^~bCw@Jc(0%<|9?Avhl$_8E-=2zuJ0XLyjc7^dYt&l zJ6`SyH%;-_e)_&FL# zIZ1VHx5jUU@mmjmTj}SzSCxsMPUoh^FJnu8F7j{a9Vyh$SARHB{LDT{{G1P@T%kI* zTjMv%_-(kccVr*^p4xk7il4(V&#t~&^HXB{)ZNrOa*AHZj=50$JOWJU$J9xc@ss<< z-jS#D|3~gSNBlemq@Pz+e^>Qnc`h@4qsViZo+k#Bir?#isqkwuekvCBj?9@X^>)HB z;^%!J{d}YP&#EWmm$Q{Wzm3TIy;H>R_H)JW9l%uhO)`Fp!SBVp#n0rU#m{me{d}PM zm#Qb@S8n_kV*K{Y7QbCj7r&PRQ{lJN_^AWG?SChJ&YUiOz6R1yhZ&-83QXwNtOKiz z-(u8X+5X~p>iOd5Enq@Frv9=9`SVbZDF<0lj2_qG0B(r3DEPQ!XdKXY{5I$QN*{4xgn^HPTT`>;&-rJW)C&H$#uZ1vbpNqZgu@Lek)LavnJ{MULby60H(sP%J_+(PX2MB&hKpT zvlvJ}Ppke{)syjCX8h)3ey1)Gzfa=)P1zae%T)L^89%i+Pp;DMNxi7&?Xfst($7Ra zZyu?7GJZK*`}13i`MoJe_m0 z`27@^3csuze;%sA@44N@Pv4mMsRYu`&8pv{dMH1$t`-=-g_xJitHtk~Iu8SJ9Z0_; z^m=eN)kFQ7b-&d3t;6wh?;+xM%xS{+5g`4B`Z4@!jGtVr3sw4D!oJhQ&r?A9c~$jy zRS)%R_^mL0i@~qxBH=gn6!H5OFcp3oL;QKE$7e0u>hp+0i^b0(ApI;+{R!2>_<7Ip z*k>n$&r-JQEuSrQ|A*(ditaa8?Q#?>*{5Akt zUzxXy{`ydf^TRDtZ@q4n`uhUN`(Pb!6a69}OMjYSd%?w*GvjZ>{si z`B+ctv3xt9f42d`-`3+&(>~#7&CeaDuI>`yTByguT)%FrACWqldam$#3cpiJ*$dy> zcXbd~1A5*K)?>x?zTbvh#c$?qQjhsS$}aj`{?IC^w{bw$YyWGd9!CPHKM15e33NQD z$8ibPUr=9-dTi7@81Ji#*S~rkHNvmQeWu3OV~J`1LhlEx%k?p`gI_mwOQlYl^mEPg z-j{mZ5Z_~Sbr4qr3F)MMfA{P`N7_aoM)=gzBk_W2*ApJ&*5TxQy{PhR)+SiFm0H}wxm z-Sj$Fc)gF`ZKX_qr|tDvJ=*tMeY5zj2eQ5*T8~-!J^#-xmwM}Xh1B0WKwdw7r}}AE zO8dFMU%MV7yZZC_^4U6H>(TXN!EQePANLXdwjN7O`?Q_ceLZIG?$=FB>v4&`&sv1v zS)~lZ?+Uv*NOgTI%=i7)Y5g_o`WV&g$#-%j|IQ1f-Ub6%uRj4o_;+x-XZH_^iEkH3xSk${T--X?v;8w1ju?EUMuxD4oLku zAmtUH<3T-+OR)Ze`fAi;vF5>e3-t4$^{F0f_VVlPEd3nbu8%8B`$?16eLcp;`E^tH znAFM5dY$w>e#ewDy{YZ>Si86Hw``I4tp&2a8dTp{-_N{QF7@^?knN9OBK7zNkoqB) zO8ZpcuU(Is1^#>%j@9{EkIvVV#{2wpCJTRCkL9L)O!2y}$LKzO-PArPb+e=1Hy!wf zu8%-h2XSjsg7vX@U*B)O-fxTnSzpzvU!m*cWq*=-yA8vc76nADSz17XCr%?Li>hFTYyq@irj!!PiLp_CUu2yML8>jA zH)^=f*Lt)*E-m!y@xGD5->#3VO#57Yf4MI2Kb9Tn*G+|9Ki+w@@SgUb)Z<4$R|l!q zV_lK&w@j}WYxVlELG{D7lQ=KlC-wF*koEWYVm)62sUNaL+NS~?57tKsFceMf!ZSYW=*hUiHQOWPBdIPU`IqAnWh$g;I~t z0jZC>UfK@?Iv$~1)3`c#k0Cj0ex*52{;*ksyY?y1MyI{bX5Vv1ik zQGK3b!Y;z=Dg4eQWiR}$l&gbO*T?!Je82Vj{w0F@KCG`?z5jF10*TZ24ym`1K(=pk zr_|$MAobgTl>2~=2lY5EYoQ))%RPh^;eh~=y?2E_1K_!FkatVbiUT3>&Kj<{d(Ntp!j;6WZHY(xbEw*QTcG58?_!E()YcK z@H>)}LHNH)t`1VI$K2_DJx26-$6S5>u~_wI?vVWVy+P`229Wi)>mQ{a4*^nt14wxf z=y*_%lHKndhDh5*X;FU#<70;7Vdgv9iFeNl@I5+OwZTv z>T^fw|CD;X5a{Y4t_BjUj}0Y$J!b0X*ZKPSbxidi^#89;zD(-vG$8A5!hEU689?eE z11Vnt9S`bpT-HK8<{#(J*YkQmV125`^5cE})ghl3E;a4@9lq|@$HEg#-RS4nGfITl zv=w^32D&akJtV7vkPz3}y^9!H(z*W(i-WW4SASYp~|=<^oq^8Iz>WWR0-_4Apr zI|=Xi@w8~ZP$L44Lac`@8-e$415gj7^(zje_YmE)@>Z|J|0Hlae_t2h!^++%J<|JY`Av=53;bh`$B12PsZ+Qf^Y!g^1F1&x zy}$A&^L+oeWx40)8RBE=PV##p^G0px`J^3XOCWs}sm^`D-?n$0nt88AUJY%?>!sZI zycz>}jnVr;19p|XM(-wh(T>vL0?8{6=p>kzCFY2aSl&D>snWq|@a1y6Gs%>#<_Vi*}SfG_TpMU`}ddC`tCLhEo^D|P5Ntw~<>ZOChb9pm$gUEHz`4{*Qh za**UT`e4b6c9iphti#2sb6>Cy9j7(PD{@il>&Dw5d6iw-GOrizk@*@^B6&?YPV%B1 zWdV?RJ*7JL1@m&8)+DdoHsp2x$oToHy|86o=j->KZYt2@YrNz|JId2Q=JmDe+!xHt zaaxnSirbLa{GH&L?-FWOO#1~RWo)wwU2m*cc1c~!I_uVY5V z=T#OsFK?mu+s5pyb-0Vxp`Mo)0KGa?JuENBX-)E~YeQb6e;1!uX5jeRvX5RzO_#jp z&5*okN7+)3ucB6tFUM(3@@i~DUOje>&nrK0d_6Kw@_KSF$?NTLk{9hL6ZQByua)D= zaaxnSq8F#W9)2E@S23>h3OvU0=d)`hue5y0tKS&Oi*}SbdVRR4mFq*tX-)DfY(rkp z>=Hj;^?|%f^!Kpd8!LJJxQFCLJIV)|SGQK?%W+zhyvo{;*Y%_0^J)wnU!}z|Ujt5% zyhhKIyl6-1aG9(dc|a$@_0Vxzle}u%kk=`@#^+TRSm*aG*5hl69$!aDUbLgUs_T4u zE7ymP)0*Vf(1yJB+buq?hQM`HiTj-MP(8jTNnW(0e52P<16w(NIZkVmS7v$Y>&8~Q z$LAFZ7=4;G>lGl_X$%}TB?wZ$F)wwTNhmKQoUhe(A`@I#uf1Zu|08ZEY0PT8O zq%*#cpO$Dm+&H@X51DC^Oxn9~bh`VE47b0%pNv!cxU|;`kC*@7j|caE%YJM3g&iNa ze%X0Qa$k698_siG#>JoK>dt6+eSFC-dR-FH>yk9RE`c58RUqG|rJpG}_XW>$j+6IU z6@M?T4f(8ULq2bZf9HcAIE8R@+oLTKJyCV^C>(xkWaqk z^WIR&=f`1^5A7&N1DQ{y>f9I1$8lPnd`jDp&wk_M^Jyq+na}6?97oy^$*12ok`L`D z-vF7#n^%_`R+NPi`yuyuF>|Lp#c=K-OD&E60!Hv^x1TwIQFE4v3$h#(6FCdFyVix6QQP zG9@3{Q99`Hlh?}e<2bEOJ~@}AzP?>w7@tpOAfMgzceti*EcwjqB>B*evL%r7Q=~fg z1&<%cX?60M)P{U!9vGibSsJ7Ylh3L)uW$N?9?stBFGwALw{ML~7n`Yy;u77Lj#wmDTyj^d3KRh@d?dw6y^&r`JxH@z9 zHQji+&tIJ0{`o`u=MVoEK7VLG9$K!iZXNioogbA?_Wu6&Ql7_i4P{^Sja=$oWy&>m z<`Z(wnGfVObeZZjIcIyZx&F0{y&g{kY4iB&8+*V1`3cZH!{6rbO7T0%c^&=FRa{-U z>ocyWMLlEQccEaHy*u;B^1c(n-;s%Z*|#~i0F}D$Tm5aMt(Qx#(_fX`*oQI^NWW*Oeyi#)sUCd4L4INTJZB+)ny*9c zceOb_?YjTJDOO`Vy5jps?ze|38l`4xwZ>o7n*T45^)leky}kc4yDxA9=%)ht4(&!D zzajV+;6}i2fUKeZb-g33mc4EU{m`IXexXP86ErcViuRGg|fU-2Qu_Z2sJTI@$D9<6wV;=_s`DsJ|S*zc@3 zU9m#(QN@peW44lYyz>`QQ+OTWno1?#y_85>gdXMVw16ixluciGUAZxZ# z_2+=B-3`8x_EA9A@M)^w0c0(&QoY}|QqzY6DOUhl+b^l!_22(@YTFxt-}s;AbECU9 z_^qP5hT*kWivJ(12J42CKOZN@X^V6IY`q3>=RS+>J*m5v`lZq3lK}1ayqmuE^LY4t z$s^nRFUXv4{Px#tw0#(!6~(hPTt6q7_O$uhZqD81rv1>i{_cx=Z*Flmt}X36@tIY& zSL!t<$GvBIq+?!s%=^FamGT|d=(qm8;OO(R2JbXV_GSx zb?ysZ(>hKG^K!?kd!OWLiDO@c`-)D-TzlW6ch8Xp@5?wlSM%<^i}UMrH^**&g7-n0 z|84m`DDoG{ITy&BW2!Uf9=pmo-8EFk=~W zCgRS+arYE{YI!VWz9f9|fgGDM)j!=s_>bO6_#X{q`w^q$IJyMLe8_RFA4fd*R7!p1 z{+xVH%3^+fa89bRK5$NE4v?G<&Xt_1fXv}~)tBgc@`|n}!J1`k?>wpJm)aD#beYwX z%O}d^)a!&xr|pHyL?F3LQvFBe())$*=m)!p)AD5~Cm+j!&8y8$qGxiG_yL+B+ z$pTWw!p@uf1Y8(9dnDGr#XY^_rZxpGTg~>zh3m?x@I49GsZzL{rm>$=E^MciE0-HB zmudcS!`LmxCDO0CPMM?UME@`+zG@8@*2_ci&2c&DWZ|;U2pNY3K>Das{RQRnk>z5J z;atSd-T~*%<@%c%DR3D*r{%c(1m7j#Qhk$f>Ar(-ISEKEr>LI!qRi2bK#EtpW^Jn_ z7yQ0QpT)hrIm%5-J}%1wTqeLb=V&ke-?(pT?7=$<7q(N1mCIbq#mo_7{~D5L4XjJ= z*W$iv^kv~)2xL7}s7{XeL}lFP?Iz=XGmthn>@MrzUx1tk+OG9=FmOE)>yUg7=b!4= z6KlE_>pSs%{e8?2cagmEca=Q$15%#W^T9v$d=Oj<89OM6#yhq_%ki#QF5_JXt z6`h+G>2>bRNy1|RkT#beCgc4u@K+meo_7|@c_+GI^096@%^z#7X?3V0j`jXSrG~of zAvv7@WDabnysCBAsCsa$89Uo>sZN2*1#??+`JZyRLw~3ECFL@7PvOFLO1HntoNNcA z1i3J_+}|JEd>y$egb(w(96orjs#bl`ALo*9yb^&o$8wa2O54(64+QT&`UuiyPm@|ps4;_~`2kk_Z0 z*XH{F_Z|UXN>+jJJ`KpcHXAQ_od~2}u#dE}KjkOQYk3w$Y~_E+9O`r7UQ$?I|;^^!tq zXMf7UK<0J2>cPCo)#hTigL!3a9G=&%uSj0SKqsyaFF3PhUSDcndu=0meG0ymf&+#3 zZ9wL+dy(XI1CV;@L}_P#N*ZD@#vqLu%!^!YE_T~<@EiG)=v-CYx#hX4?sdt#5y-rA z-w^%&S{cV-(_|bc0@*&{Xc@QDfm|z?Zg32e>TSKxz;nZFIZxGqzl-aT94M|fs?Qqe z>HMsfl8f^%Yku<~l2h6dlGBku`d~X{4OLOka1gZ{4e_Qf*hR{%NY zY^QYAb!MQhJ3%gt{cDL^BU^mN;Xcz?9QdrG4Z8iDzho1s>0(`1&j)h+?f|l$Ujgng zTju!R$H|y&biAy!*+AM12lAS543J}K*VmM`b-k6(i8pWloVZ50{h-`7e^cgYoZ>9S z>w(Mf6plkr5RN+ona9bhUk4=D*Hw?q6wbQ=DYJq6+_qNre*;%5m%u%2&v^=en&;Zx z%T9#up11uxCeM85nqygnXMoJ-LHV2dHT(HEU2|yXYG!tzmhz15K10wsa?cq3V(9Wo zfHsfv&HOwnW=J01`aE0CcS}wCXP0ZcS^HL*_N(-B3hO^B)A#?DUVnP`$T_|`t_jh7 zmSS-=KR2sY9<0BL6;ks@{z>wgRxb7W5s>XHEqjc4x*JP3cUG@7wW6OZ+25UQGO_8) z#o)FR9#?$LyhzsAeAfVsf^YM=0{W{*iI1!12=BX25#F?;i~!QtG}XB;xaK-e&7Xe- z^K!?E`y9*VyN*9MtM1g39lLH^9J+A}es1PHKe&1G{e_Aia*n7ob41P*a^#C^D{)@A|GuXj`UmL4dzK&F zAa&5WLh>4amE^fEkTrIs>c^?hew6Qk^xgmOqTAfOIx+V($y46D^=amw*|YU)Hge9r z#OKV~-4U_Kx$zp|d}^g|J#v9?Wjmz+$o@5|2l+5|D$>06yLn=L&(_b_^Y9rv=Z9;F z-CxF!*j$B$hPYK&jnIv?D2!ZGmX z{?hpMAc7jV>%p^nEiv#K;dM38^Qp%|cRe;Hm}4Wj9ym^M-{*35?bZkPIk#IEobJ|W zx1agr91{Gjt~RUX@!N=Tr9|JBc`pV!*<7C+`|(eb*OoO>=lyS&<99sJja}UM|I)`V z&v}dGdcQb3h5DcG*FW!@79vm1*~eSRe7}9GM7t z<*@*l%azL?rU;k$;6V9Ixv-s5ty~^Yz=g4sN%L`-o)$^ReemYvj`dQc$03e8XV(?S zYscB?-h1uFzB0}gsEL*6%ej93PT~3ukh-0B?|B*Y&Ccx**(B|*NJsSHd-l?P;%BMW z)=I6lpMhKlw|YmOyWI!K>(!Xz)j&R1_?Y7Rip-f$?q$3y?bK;^By>I}cma@p?@+7< z(w@xuTp{PT@CvC9-Va!Y9V1}F_3^qY$#dmhlIO=j+J6hA&!g^^YwRVs-KdC%kS2Bg0GeVsf`Q-O^1lIoi-mi9a#bGZn}XB`)* zzU2~WuK+UMe}R0Tl5xNAy9&r>A@5NAv&zINj`&slw2U^k@-_v%%?eq z*Y^J4d4@I9)|lA`^4XaEyz?Z#>yR1k7nz8pncsJsU-myF&(T1R$21_vkHYaR59pj* z&KGOof(pN8mSV>e*m6zzU>}L`nvUr|b&P*jz3);P! z7X2t7+ou9)e=?AA7LYkrX!}BKzg^oO(suHrJO^YB^{TgZT&;a@J>(e6xaT#Gdvrj* z$oUu_a$Kb`J2wcIZGp^%!rTrD=o|-*fp^SZ<&XC&>^ldx9PjP)_Xm!7M8;z-koH%o zekYKzpHzM0M`ip50vU5pAmiMn`royEC6Mw7ko|wu{Tn?d`+EYppFAj)KytlabvsU} zYzN1Z5szii=20j*nc0$ z^a04Wa-(AqKbIGa|8HZ6^KfWv$%G)o?D7+}oIGDS+i{hL)J6M?O3LR6DvHf*U}NJ^ zVq@=(V#AvtZJ4j}=PGBh$>^9JjgHiT<$>hv@?AQ6eUV*1rhS{))pz&9Rp zR4==H_LH67c6+vem>;N}K>4QqK;_xxpRb?X>SOwKGrRt5Kjc*I?mv*6T{}71W$WSA z+sN6qn~Qq(J<={ZxB6plF--vDo5>uT9mHLd$FlGnoO8)@ zAk#LG<=?A(R^=>fLZCg3e%9N3=G*%_z2<%k%VYD%XTnL|XNbK#A*h0jVR<~4#pX{4 zx>nZ|cX>{-sdo+jZ&FH$gdjsx&n{0yd6hh#;;}`2dbrD3-#(7VC*pWh&s}b0L-%nx z>EW(t>Kg{C@6I>Jvpw4nru{(q?sm-af%4B+&VF;MXY?fLSL1(oJ$L!}`sH|KSD)i- z+kL*{j2=e6K>e9=!$AF-a??&ubhl%UcjudSb7G+SCO?Pz&I0lOzx*p6@ZRG#_vCml zi_ag-y)ARkN}osA&o7o$@!jL7Fip-6&OO6eeSVRf=RM{g{r5})UvU{+2F6JMvpUBWD74hovL_4qYl7zavMq-*cM$f@Ra^9~8Zwx>f4G^{Uu$|LdYRb@9^;dnEI@fQ{N#|2HguBW`#-b=J~vf&IO^Sba{I z9nC#fo4ki@$91CGNAft{TVvcMqTOu1PnH}ZaY6sYsl89=|M8kSPVB8RKCrzZmc6^J zwmfL-!?(rmN1l*&#)9l8JHL6yM4z9O#rcE#8~UnHbCwcA8+P7b;W0s z{MNES<;EwboN@|$pzYYtDGpgSa?Fe^d~cFj6Dm*hUkie*wSdR}`lhr|>jCjk+Xuxz zJdUXn$o68b`R|_VMkntYoC`Zbukpn=`#GN-N3*dbb-!;-WBq;orHzjFiyeJ?iyb_U zX)#DU_NmM~w;e_&uN`Jib37QUIuE@6f5VKk`+19dJR>pZw_?s4zwlZuyZ;Yt+6nZ1 zNA`#3H(vcHM_Dra<=ioP89hw9=A3F|W1q=4vMD$9UHR_kN6EEa&yT(npND_1&yPTp zDz%bvS~Ww)X+Owu`Ff^Yw_P^tJoD4KPGfuSb>6#{7(W}Daiblvy7poXaew|bsg7KS zvTYNOWHH#ob6}L(#d7M*zu_~pK2u7=y2EqrLcJfkB30}ReN*gu1Y}#qre5LPckBmJ zZaq!PS)XYe$o9{u?2c9HYTIwWx1U9M>iXN{bbuFQL+e>tZRiU-X~P2jjQl+4#+0c# zvYhEDkZruCvRg;?o!eyQmOHk>>$ze}V=4TQ#umslZN7}z6LUq^X&`l*G*A5dF=)or z_7&^qD4TWO#FJs5xZ-!*Q}nZ`(BJfH$Ud2j|2NL|`9A{r$*__BuZ9=a={QGhdI_Y= za;9k@+gPEp+yCk4+noaWIsJyLehxn-eZ+w5BU$C+cZp6%*NILg){CEud?8xv8(d}u`6Mr`r5>o#@k0K zyM4{R<$KRQeLOejtj~IvKHsW7hsKCLr51@kbry?0EN42Q`jkE_vRfba&F>f&KOuYD zq+I9{GdHVmYNBoWW=B=gWh!)F>bXR8=?gM7!Eua{UIBDr-&xkA208m>k4u-Ks>`7k zqRV#eyZpPN3(J|3RhPE|=;A@&_I|3h>aszPcN)xxnL?&Vg*J>=BXe`QaWv>g7H^B{vkm)zbQGll^sa$?SvAv{+Vo zzE9_P$S>kp>YSk00h6F3k9%>c%-^#hC|Rgkva0iIrt{mt{+@Wp zX9L&K5=X^`aQ!`k;n0)mGu4;nOjSYFZ?3Xi7xrzh6{)$ z@+8PHWjWIT)#Zf%y0CA14Gq6JXTOZMbm2J8K-=-)9X&*sBdSaE8qtO2Ov_Z4eYP&v z_o~_V|6(%x4e#EZ=Xl&laqshznq=L7q-Tm>JjW$oqCuudbf4E~vy5pEknz;*GnvQF zf*fNWYtPYK$rrl+u;xr;)0|^t!J@2jnua|UW2Cs+RO4f@=~<9Au$*a|?!k_!?4C31 z+nzHEa-mD3#aVUvU3GbEki_X8)urJlq6^EJf`5|nhycVBq95xp#e$570V=inn5*PtG4YNd0+tuOV< zF3)M~FTR-h>z=R4Ewawn44t3BCq&m6kg1nmLq4%xY@G(umPtEgzJ3h;WAoMZy9UuM z&p)ozv*&xhapl-0z)td|<}yzXY!SPnw}~BXL8f84Zp~7^xW|WmyHg-vN4IkMT74UQ zQhg1YH1=xItI?ODM-Py8bo)xzNAMr>w{;zy2^&nmhDK-V$G`NYK3_*bPJ*5EbrF3w z67q%E)B$80EN2=Avi=;E-M(hu?i9$^nXR+>I{9bmBMoF9o>L;=&JG16khg zfcW__(AfD;o`+Iz$=T2Km;3z8y;~CEhkmZxUSem{H)2!uZ`IElU*k01-d5S|XZCHc z{o%Lftjl^!7wWJYZO4PNI*BgBp@Wk$L>HDbrK>K#+Pc{LCG;)VIP<&>z$r_)jr_~=I<1hG($eUtC z-@ZSHzT-fazi?FIb2<2r#iw;2BDrnOF|m7P)-j00oMTMfG*WC@`@Pr{eMoF*12Q$k zakMdB=cqFVR!p$(vetP$rrr5<;ohX@DxWS9kdx3hX&VvwXUY;U<3P$Se?~|V8jY-xPH3m`!w`q+NJukoT-w= zR0EaWy0GsceOBO9xWE?^i6! z>!xen9y$j`f;;r{0lTz~Qy_g(HB;KG1G?L^+xI@FHTQg7%+6$Emw8U)?9Ed|$3h)s z9bli~XT{I%HmD!}7=Pr^_bcMnsx$>|xF`*>5&MfPp{X~)Te7>Sb@_;92C)=P`fS#Y(bl&~jK;yXG~Lf^&ChS}cs$_+#1FQec8n%y-C^pNnc!MD zo4$J#b(toB^z8KquJ1ri8@99n!7k!w$49}GGUvEqu#i&&h{2w zAvS&v(#C5Gi+ml(a@JwWi+&kDrCt5ocJnxQ{21N6abw2YjH`)*Kyl)Z1J>iSW%Ep) zGC${|?K*yom2<$duD-qC{1IZW{r&z!R(aA8DK~mL?dbU~w41M;G5WpZvd#HF2;`nR zzwcD&_At*gu%A9lfRD(DV5H8|`9;OAUw|wtP)z(C3R1THXur4Dnn?8V+hEl*e~>3X zKG$8gQ65i`69p2e!vd5)t~#tl-yxxL?DfIY_qdR3`ZD+8j2{CL_uxWP@cjc*&d*v$ z<%3rvIvV z4zTr#1Ut@lTXA-C1082`yiKgbA@DoL-T92zJ-+oJ`8S!bY0BDTrJcz)Nerw7InTGK zya#0baZv2I%T}fi7;EqOusY{JY3I2Tj}N(CY@$x#_xf~-gDzLUE_%#pD0!qKMbCjzI0w4*FtKU! zO-$H&=;swYaX$YDLqFx z`Yh5pmZ*&S2WWH+K>Pd`-$!(&4|YzK`C|W`+C(j<-xvHYvA|>P#2DZo_cCP0riys= zc%q$Gd5J?^vrjVFFYEo@fw#-}jsjVKh03cy_RG3VgFyB%(xrzTV?55iUotk>`@fBr zU6HQ#*anl^u4SA3?aDyh8oT23c|nEFV$aPW+jw2&Ng(ZE9j22Y?J3~uKPP*P?)EsI zwZ^f$&UGjL5TkxHv2Dm0$G*%vfAn+R-Z^2`DzgR|*<6>Hwa?5A6L%)x$bt5w?sC(Q zS?f%>>DR20ravQ_dM4i-Pd%_k+H2$BezG=Z!1rtPJdxN##w`uxIN9T1uZ^i%H}4-Z zj#a_pm`1Eqrl+(~7v$LAuku5nyUi@^TWjM+ZNI&?KM=fsv9!NI+dH7`SL!AG)dJ7g zzISYmFI{9j21?#IFm>#>;W^vn8^33>HWupdTW5|;6Qm)A+}d{%wv_iXdb`cM7M zJU08AzaTs7bgW#5c@kxvPS+Sb2{LA`^n^OG(FEM6zY}zD-S4(;s3lcH2@drx#rptqHAN2_6$+^ zHIO>*R{0D_-Rq8&<2!-*Ag8Fj5ae%m{G{@VQ5R{W^?7F7CusVDlJ{I;Vj~butlM+U zK9}fRwCC_{_?s#8sS7-Rn0wJR!39qHQSmnox zYdJrw6)X4OMqA|_duln>3-do=ms#bdE2^JpKYgn{4M?+pvYBYz7i2qJ2U*VhgKRGm z`%B#~+TUl3d06b^e2dN_@xMi{A7iIUEbjnW&M|ezoVoYtU3b`binZ5Z+~E4${yg+V zt53FR+U9$c%sFfL7jO6oA9T*aJQr%D@RUle`ky`<+SozMG0wpU#3V;%Ro z)##MP4veK&HuJ;molFd=ect2DIl=6S|L*@MXUEW^GIp~UY5bUZW9AWA{0jMPLyQ6A z_7LjO-wEoAao}6(zo5C|zltFJ)g0up_L$r6=|_{i>xuD;i#*PIOfK|XFj&tgs^>}Y zj&fq>mbXRE6Cm|0`Of+EbmD)J>w4aj?eo}f?f1&Op`ICW(%-2C(qF-a+4Q5f$T=s> zd(QDZF8Vh{J4|uPG2kny((X#M$Fv!w9ak(8`5G_}7$d*-`x&vBQ2|a@H#UHcXS<%j`ykug|*z5iEC8UkL%S7LE%SB%v$CMX#v8^bz zk9qF(-st3Aw@oaXSTS?rUtaGWfAf55$4V6Dl#z{|MmG8zYJLd+rycG?^BmCnDOsD6 z)jx~XUpqmrJHLZp>ofiPw~3Djg7oPtAdh()ctol>6;^Wf)Toc8;vPRZcBevhv(k{2iLV zU-Qpse*G`c?_>LU*hc8WHs3@4pXzh8d8p46{*`|_Wt;LhQ>!|^p+)~DKNIGu2xZvD zH)=~z0hv#g!OP!}vI%I5X(346>+g}c=m=7t3Np$8g_=x5R+-P9Is-@DIO+XJ3=|L$_5ZvbXF&yMuz|Cp{ZcKKPW z{Qfa&pYewRXvV?5UW&qX5#@`#ZVDdlJEx@=l65FX?{Az4FX9Z* z!xf4+u|mNe=iV_kx)~dd57kE7H(j*P-BJI0<39UY-?*>Pdn>kWyRGt-@&Da%&wS1| z?w-qJ+?(p>`ifVSai0KkjmUP~&H37lyY4US>*M-ktUl0)X^ZWd#5Ix=sN zyzt*d@9`kVmd7#m067km&NB{1r;8bfjTd0gxoqso#QD&+C*e_vtAUwf&-2H{9v;V( zSH~ghJmX+=@}9Rfe*EM>`|v>d?zP_Bk1=%LmvPJH++k?PJI^iVS*GdV$fjSDf3fxG z2i$9P;*&JzY;&G4>qww{bDWmj>r3QV*&}j{+-r+jSI!=l&-2e-TE$Zz$3y2BW0~)Ia4!`ZS+>zJ@44JvB{}my?Do5eQtkt>5%H2tnDt=es+QbRj1>1 zMW=J1v!2x};#{lT3eryd931ey@uwL#7v0w*X(_(zk>6Ff@XO(g2gOfU)fb)WfYhn8 z$~{2p^r+@PrTH&tejxqidPM%O7q3SSp-uN5He;M`58D#DkE1hcy=lW9XkEI`wmVl@A9Jv_vneJ>P{zwFwJ_6l3 z**E}hz-A`Fp8-ri*wJ{8BeAiam z`=EuiaSU{~Ve88GUVYtbi~7kO`@ygJVm}RiGVKS$BBk%UZ;`$q0vY=gRGtP>m!+D& zM)NmozCG^tdx?Fy$I95>jW*q57WtZQ%q}Y&>S>_gH|*U;#|(7)!MXpNBG-srP@m;B zP`9=IE_8vmQnvx?$n`LjOf%HJfBY9{>^zQhgh8b zMwllB2C>Zr=&#eW@_zJf(%%x$-Jd%aBPRLU*oHRp>Gy?Zcak=?gYGumKJ@CXev{w& zj`prG5tG9_r|OGte)HMPYeTaqb?znI>b-B%WlET*jo!BjE+X+;TSN$MT$cUoFvdZ8x#M+dVQL9s!xgf$XE`y+xdRYIQ)$ zy+QVw0YHBL?r4yD%vEjyV|A~c(o<}h1oD{ry~O5@Amzy*b=<0Q!TaU- z;vj7fq;sHrx4sLe`Sd-b`d(Q~^lhx{0Upq6&b8YAW{~>D_ZEGh1}T3AQr|rBBHsWq zH3ct5UlWT?BmdBg=`+iHs3^Thk81_{K1ZP$zWX4*-y(Cue$G_iDu3}-Ew`RC#ardY z^!Mbv&jPqs@_v|E>uvHrm(EY~xd8if0G^q?dk)e3@(j|_F4BMESQ(R3AjgDdcDy*U zS!-1X+ve8V_A|OC@y-RyuEBZ?+q!y*^lR*LKJNxUa&I}?I&PKuUX#_%Zmayd+S<-v z@JqrhpI;KxFRR;0yD2H+mr~=-;}`c{iszyzy`JMP2YTP64wa+J^x!pCo9@{m6z0DIUks;#k$WpK1l2-{IJ-=*vN_Jk?ta{IpyLAM+n*_kSRmIF zshD%C@g+sZ`NZimrYk|p_IhgOt~Um$YjNLP3c+t(l!}$#jf&B>Khm}72>6*kSBaV_ zecT2z?jHsH`m#Px=meGP#k&tT{xVem$i6((yDyJfi0hTnVxzf7CfAMf43*cr6LE}r z#u!;#V)-`ZW8iH4KI)=5qW|r4MgIXH(*cnCywdYTt^}UXF59)`B!2pVEN57_Vg%dfzV5Kksf?x2l1(%Z@Gky&1S&v(El8gXP)-1O zUAhvS^|bWeXP@--2*_hA@0asXW03O8AnQ~*AopP!fs_Y>EPoDUngE_pS35QWy>}YQ z;l&&CW}Q@jd-FL)Sd;AY#98>oqI=DDJ?Pl#6r;{ z_KKp;5bgjOXB6x>a%6KZFy|xMmZHBMVzr%FO4@cBv|bp`{Np~1tZ`W-ym~y*&a1qn zqAu^(xzkqNA2vB7^Wk2QZLCyzHAuZ#pJ_43em1ytaogm+mRqKFIBR~QwXZPqf$^JY z#Wmv~_R{W0Vm|bZTeyzf6-_k0{uF;S1_O?pnR8|?yJ_Z#vBj1#zTUa7`xE=Q@I*^D z`rYWj_acK+ z2aUyj6=SdY9)|lmHqi5b_w}r4$N15doAa`fjXoxye&zFe9T)p^x8a-g+>CMWTwi>% zv$)LF(j{cB+A(eRV{-je&->hBFxr_0$C>dlq%ZT83H8h8Gla34zf`#oG|9|iPmxN_ z`HJT(K5t-qC6QMMJfxokmEe|+h~w&Zd3Vtkk3qN zm6G!AU_r>QtIR%_-UF$_M<8`PrTGoeA8l$6QqO197I*B>PqsgEDz}fd-#gdxSSPqQ z$=EDoSSS?xJ-trNQ(Elp4bon_uGvFD%?nQF-Iqq`Iz^gTH8H3$YdSQsXms(mt1)`P z`KF$kgW8`n2UC2p@AQ+1|5a;_SB78>E0CDS@#o+z;?Gq0^VCd)QK(ji`G~KdB?nIKsToWHPpfdA@}6SpNsKJ*AGk|1MnG zZcrhcww>qkzBV$qg?YAW8%4`XJl9d)0ru5r9Q>}_comhVrWcmVR%zG+{ToiQM zlO@iq`#AEM?vlReZ`*y(V~3*e-FiJxt+KTJFzDB|i7BP~bK>bc;6Gi1Qqd;suLBpU zUAI+{wnu<0I{sLUU$*XT@_I@KRrVCaRR!-AMeGd2=kLY;hqa%=SB83?8Yy|_ z&>mCGYSQjfko}a5$e|zC=iXcI^4SxG_NjAc@Y8A1&tkO4bWq!ER$cl@1$k`1v1rNv zLmlp1i_)IpFTy;(q8-*5qWw$;r!BkAXa914w%+U7JHcPW+Yk#&8$(b42@D zul;-vzOT<<3e=E(ZUos+8<71>Q8}PJPCvfSu7rN+i>=GA3iZsqSM2D2owUCSWczk| z=;j|u-gVK$vRSVT&AP;Mcr2cex%UbI^4*_zIF#Y@K{|X8r9R$qv-lt=+TREES`@Q4 z%+pM-G0ZvNA+I5HpXQ~pMRhA1&Ce3maK@dViHX4=2669$`vGnzd)Iwq7nxEjK|WU# z;p{KiMt!!yeWvMu5!Q6-LDF~p|Kq0IMboFB@AWtHobMo;|7RYR$I;QNm-$`2Yw~(7 z3%bd}Qs*;n)JMO&%=XRmOWTKo599M7r6l(Je28nC&_w)xpP?Cl{T)H~`N{Dg{&!+o zXYS%VFS-`R90~KRK>v(qPgtnuid1<&IZnoTFX)c-vbE*6>S)Jc>TZu8p2=oAejFE+ z1?fF3RLeGb{bt%!hTP~|L%C;3{ZY=b(a@Rt#eC0@|bPBS0@%oSP7-j7>)OI^2LXXL{ zR*?}_Tr9G#_ZYiTDqjk^#>K0<(Urfk9jnhmfAU=yCX|!?g4=xhpMPe*o*G)oIV9S7 zm6veTCX65SQs2$5i!SQQbe@IaK^V6r{iD6Sq&jHn?>#vWY3mw1GMyhP?N=jckrH z*TGytDNmanxsdag_7_+Q*hiD2p{D1ix>|wU298Ds`nFV&NyQqx?NoLvv2h zHsyRW-g`bt#>E={&s^!C6lY(@_C_-gpSQg#sFSCp_AwDbSGGl7PZ)l$p_Jw=W4~BO zN^aG;z6hVEsh`&q95mT;nI3ZpZ3Xe%Q9QrzyrkzquRp`F4kxlk_Q~;MqW<<6Y~;F` zR=k`uPU#rO^*v<{op?*eu-F{`bc~Ct8s2-)nI)uMYGUGme73x- z&r6iwDlfm+Ugm|T}fyf6RD?Id*Uf_z?=r!TMK{4awlsBiL8S6A_jM%f*j zcdPCXzTdyo}g1T+>*@j=7l*&F%ZV8t-c}O`$`3Y!}iIcSQS>t3ebTlzx;^d%} zXX2y`+Tw8$y~LiVMPkoYi^ZP1K*q^*mEQvyCqJuPX^F&1Kalo61u{-nt4uwZHh|Q1 zv&v^x{!`^^pa;uqscn8S0UzZy&mMzZz5g5H#H>H|m}=wM@q81W3O{Ef+ZsFphvO=X$&$?ma%e-l#Uwx2uI)U`*ODazXS$7>sUzYknA;6fw?pi|8Km3^WZgj^?f+2a;~?#Cwo}UA2YI}0&xO9v z)_7#**8YU6)&6Q~zj7St*st6Ro~kVN5BfsvpAAy~^&rRpPnAo4DfZO{Y5xe77lO1u z?^ja(B>3;xU*5a-P7YW5Bh-H7IMA_QxmQ`ZdZ_1tE5#2DzY#wqfVAUzkbd|`mdE`qsnD7WG~bQWO;$Tf88&39HGg8DYtR5pn~`*3HH<0*~)Dobv~`E za1HKv)))Vr+%Nu#I3V^k2c307BBx%BMm0Y1?$6?*lm?xAv!3 zRQq9{W5046=-98Ua4o*Csq|Eux9Y+ zLE4}9Cn+xvvc7H4g}(o*_6Ju{`(Yn-nXOC*Y5z%O`Rj0hSpQGwisNGcPax|QIwAHq z1}VpatUC~-{b?#625Eo8lTzLdMa5N{N%cBG;O-?yF{$V0OWp^@eRa8~QNw#r<1Fgj zh2Y_s^+3N&BSFT~TguPDXR6CFi6up!7eOcHK*n6YQX)rzoJS9;99CM6uLkuEv3hM-$7oPPi}b z_?0xz9&G;2&tbxAivILvOq9f0Nqs(CHcEWm7-Tukv}3}NjSbW>N}m~7w4XD^YhTBj zyZm70wrRu2cAR0XOuYF~kGK1ZxZXD|A+@wW)4ttqEZQ~Cd~EW$GLNUfnV-UELijuu zp2geGvC_03`X@>Kcc0!D>VBj6?;se^f5uk!6^p)XImMFod6oS+)IyQIvEx{nKKR}w z&LRFyuUpB{at*CY~&$*}E)b~8X=;U34 z-Jcb)?W4Ws^P%Q5c}6y4Ve)A|pF3I4f=Abtb!Gwd>8rZmca!Ko9;83)cr|fDy_t-T zcAFX6W(L}9)nELv;;`sQtpA7!n_Qy3=`)^eHl|4Yme&s^2b5ouF-E{tg)PFkY%zu@C23fbnJz{?^ zkn&iN_U~8uo_qf-`+fJ9lWtP`8>s!t9-w2ta-nh$nA}JFa8-BlLkvhi^abgMSt_pr z*~V`m_IIT&jr$__w&(=xepU#uTJ}PLBrz5LAvTteay|zt{ z*70a0d*Vlwla(JUe^y@ISdP0@`LHq-pA z_VEqKbQI)q7izCl`7gfs%|~;cX0E@?ymV8KbMATIdX=9m*lo?bWX!wl67A+6{XjNv zUJ0)rPqgzYFVU!LU!Nwo6aOC{C;lonUi{YwWa59W|7K=}sB#Av;pB8&~98+GkC+a-*7@fTKn9qf~?_=d8n{niP z`TI%imfe`1C?(mKLWWoIHD}oOyp=~ zACTwr7nRGE2SA?dFK;fatBeEr#A~E-p>hw1kFR_3v=CmW>;lf2E93O`3>l~TGi4or z1Y}wQa@{_ma^x&IZ}tb7W`ML|Daif%DV3|wmVM0>kmc`#+}9L*OXTN4+BO;FzGjcg z!E_58R;=X1xU;;X*Pblt^qOnF<0zoS5t+~*OalU#50 z^{#7aZDn1H)4C&-3zd761zStoQOa)0(ID4=xyqf&pj#xrhVl-ObNzAU3}w3VH?T() ziK8c1ik*d4NzAkanTCUmowX`^R?E6|3&=D9qO23xjxliFY+3YJ?HsQ zYe(oRv3DGa zJIK6EZ6m(gpgg85+g9?MD+efF0}DXU)yhN4673}aCglTQMg1Mydp3!04uTwyD>sYW z0i+L~Q+W+Y-{$#D%3lOIAGfI7?Q@xrGeM?n(`7z3204$0sQeDd`B-I(lrIE1AAeRk zX{*e~bs%l&uubM;3P`!gc47H!xf4i#rl_0_($6KnlJY4a=fggg`|pwYuoPr!^tHrqdywEE>~dwvkVHv^eI2RR>$9~F5r$m`wjRqp$v#Q&2Z=i@4sGeOSB`;STa36S%#?oT3r z0CGO&%M>{bq%G}0?h`*&x$|+Ej}t+bS3V*0u{TKhBuLHbofLT?NZ+jjnLYw9CQklW z=3{tgYd&JUnZ|<7d<32O2zGf%;$Ys-GX6_JmVF3vKIS_ma&eG#%YjVSg7jZgkjM1` zS#J=?fSi9BD%UtC^Y3Ah zDd=~J_vRo|I>>og_79OKgPey8K+eBoDp&kd=HEn+<&|-j#rf15q-DB zZTa(voCGqB0WW6U|F!uQU|*SVhi@KTd8fofG{_jgALJN43*LOQjA!4x!A{wuAj?L8 zoF5q~AJg(*K&FEE#82fx9@hk9y$&GzxC>;82QS8-PUXMpCF}fo(mQ{W?v(kHaF_V! zW#tFTqslUOOLod1v$?Ssywi0uydYU0@4SYK-%~_$ochHF_D9UWqy?ax!>%l@@SAVIVeQR zUjV65y2@RP2Rrw5r-1a;wIzb({w_%QFv$MSfb2g{NwKF0crkJIug%*F-M`w$2blA5 zclqZ0D8vxce2{Uo4dnbh4bIokz8;0oSat?vS^iQIL(M_Tu^`L4flPfs`uG`;u{Hzb zaf?A7_ddw93A~uGa4KJ-m#k}m?_OwhS6Kss?-hU5Q{Jb1Ub$4cPgx{Rj;{}L{@kq` zsa&Ysqbzuz+zY)%*;$#SoC_xCee?ELiXV4_^lRy>MD7IA-zh4mgB*vlVN%`;E%H6_c&ZmMrzD5O^g9AXyqd?C6 zWgzEhor)r-ft>q!D~bFP$hp5&<$Eg2+PIYF7G`~eJYrswKw#fQs4`t-EQb!v#O6G5g0AjjYrm0MgV^Y%rM>B^ciZ@Ym^ zhe4j}qOKQtDM;Nv203pFMvB}JGuR#yVyoQ!>ag`aJ7< z@?KNpn??Q@vky#8M0tD4BX9t*O(TvM6XaUkWRAos-AHxqd!$a(pP z%B7pj{B8wuUawQRO$(XV-9T#ay2@KYe$J##ODW$4@-r4!wi0WbBPsd8(Gr2bora^!-+l$DIOMFK-)Zrzpr2242hnseQ$78H|Nx2bZoc^FJ-CyJ;%D&21lxsn*DF>Co17uC9r@T-3 zymF~>AJ}D@jNcy}#NVT1#Qz&WrhFY`T$+MRNg&7TW0gzA%9?Ty$aDncnsVK3A} z>*7u#j{<4it032uT`FJES=N-NL6#S}UDlKskn$doYs%Gkh&&hMnsQ9#0$pT|-vDw= zS*&uyJ7o=M2U3GEDz62(rZl`u%0B|Rrd)ov$S;FjQ@&8SS65k6W`kT)Ds_|oYJt?R z5y;dEyqI|Xzp$pH_wubNMG|BV)CPGDyA$O6e*%n6mYA$@kHq2)Aj?{SjJ@G1r)c>k zkZCSR->(IE+(D4_PJ-;?50I(wy%#q|PUTDdl66fP?%k(k_Lene!9elbPGwM{$TgIA zD4$Wz2RZ-JmA@&g4wC$i$|sbwK+daAl&3(>r>h?&x2e?3-uK_8Kmt~LC*OMmCN*#wIms2d02m0 zOYQ|J{{V6=sX0L86(HA=-&G!*AnlI?+5cFO=?(DzP-bR5en*cJtwyV5P%YOu!ego<6;)!xxU6A#ffm|=zgG^n)iy0TE z@+Ex9x>hXntrdM_tw?%Ad^S_LMR`tH?NKR@RSpFikEzN}m8X>z2IKd=P~KcQ0OY)x zpiEQ#0CK*BJSJ?U?5#`zIUklO_bZD&j^7hSejVk#%ICoQ-jXpc`lyV_M9{hRQMu$` z8M|1JDH-J0f2MNb$7F5k05W|Aa-UNEagnEiwEbO>Ys*QMs|}I0WfI8p>QBhp(ifyW z9HdX)1-U<|HB{u~Abs;G$Tj7%Cq<41xkfBkxye(qw%i6%ld&pq1i3$Hk|gDuL9Qvm zPm4Seqz~tS{5<&~m9Ks#*n^*T@k|6+9zHDC@o5xT26BSRvp|l1_;4wo2jXXwJwK`Z z;0UQd801)v1ZmHBkoHamY5#nXX&HDibL9W2eNS$#w*noLWexOwwmqq@@3ZaiVjeJk z1v2)7hJ<>0&Xsxb#z>hDvp}w4n^oQoGJOZ;c6^))|KN*R$DHqlMO~2~pEK38@~I%#*(D&?qZ2AuPmy(YD#-Gh<7Ay32vU9tjC~{Ab>+9Dl_j)zh8T&^; z{Pc_GU6qf5{I4m!UX$`4LB_(LV0p0d>mok{UJdz2l^=d1*olo%UDb7K-nf6fItx0Zt(ua7{E z=MIqLyC3A-J`OUT&Vft?r{{j%`~S~H@*7|O=ll@h+?$H?j`?2MIIN9K%fTSI;3r-)D`|qbcF`O%e#}nmtlv)?Fh|DX_vNEx>%&?NWw(~M5C|0wL;e`Gu=`;R!SJ5sq& zxkp)Wl(ZcMat-RNOj6DTxki1a{6$%LwB&aHc}{y+nF{h+VT1CxGVEE|e>7G0Q%(fA zM!v5+tStGQ>^~YPdnuDauCeba_bLmIk$p#$vYT==7>?uLR(_$(_k5`5$Z+w0(M96_ zi6H01PL)e8*6TBnDH+TQex`EaC3<}ZGHnOx!|y=u8!Epmau<--XP>Ej+k3L^_X4?Z zn5ObBko$&qOQrk^kmrf8Wg<5K>Fa?Yug@}79=u%k4bOo*zid?bPmr1oULob4m2w^` z4szcRqw*+_`v%V{DIX1TOkM-IZ`iGJvDLC~7!9&K_! z<#pD}dHPY1@(IwH!5>P0MM0jY!$8_|4aoC!eULHS5~RO7ft&-~L5^=fkZCZO+con4 z-1#ZcHRFFFKft*&VX*Jqc|Fz#rp{mxI0U>ZS=NiL8)Tj64f5Rig31#?rkP-F*L){ce(H0X+iO9l_UW>Q zzXCFaZILy+Cdjp*uga+)*YMI?rF<&LHTZzX~Y6k*jSmT zO+k)(FR;=pI$w9|d<9wdFv#=x5|!6#`DT#mE0DfC0rI#~Ur4=5AlHJLAX6joVtnpY zz638>=WU$#-g@*-xVdL8Ax%IB2t zg2AaW2K~PlpPdEi!+PI{{1C`7S)_6%NT1jKR?63aoTqs*M1B$EIe3@KUH8g7?GJK( z%~Lr8sh`Bnqu_;mo&$IDo6`d-F(7s#@MAjh=w zA(5j%#z13`sSQYitj>y6kpyB zGK~l6+#d!{_m>!HdsbrO4v=NNK+ePI zDlgLV)gaTSAbq(HWssUb%&z;Jb;3d$!O@2n^ZPIJvtC`9z%5%zU zuS(Q5cwgH zW3))+Ops%6^EM4+dE0y;@{9tcJPV|4yFt#|PWeU70C_E4ses7ufSk7{RDQBxh%;|L z09n6LA!)A_$P^1+Obq=m&fA1xzIodcvB1<9xfCu%_}(kmszYlyj6j!0(@tv1ngZe775L9`()T5TrFKQNz(ymzYH`yQd3tK6bIr>r(j zj$=KJ856G+_(xx}?{z7QzpnZ?kOX2Hw2_S2c+)1L5^?fP?1}KjJxMlehs94*Ory?_dxbr_)3Yh>LBF- zAme6)%IiVKTb`?=yfVo3yt~S?L7o>Xgh_cVkTwq~C-ToA^~+OU^bH1?%7Yv;`he*V zkiLt7kC}SG5A@qokm>J=JNI)I#?Pf}+x?q5aie|bf(>fhQIKOVglAlJVc9 ze%l3dy*UWdpVh7wxh}}M(I8WMkbdn2^0?6;>%9!}xHmzjcR(I@p|(4f|3fd{bBOsJ zN<;mhXCV#pdddXheg)PGetswOIXRc4&yct}4bm^+GsX8ULHg|hu+M8U23J-UpVbC= zY!i?^-3;>B_SIzW^#mzT0$DyAyci#6856VaIlmzv;r*S_)?>ekFLC=ewonS zozJx)b(Yx7ceT zb49}Qcn*NJ>6;B`fBJp$zVtPsdsC2QS=x8bH>uwLmADLToPeS{?l9U&zFyw1);9KM z(+0ZyOUWDK{LNK-Ce8a>(HiT{|DaeD?EDsf{7Vwwsk6o3>%hw z``c^Vp7nRZ8hK;SGq#*(8ycVw&Z2#i1{!i)N4zEZbCq^E&qMdjkvO0pj1%(Ev`Ws{ zbNtPD^c?a`EXE`MDzwMAV;*C%5Grobyf&jnhYgWp=UI?CU0zG@LT<@zr%IKx25WdPp5YMZ1SLh?GuIS(HCeeQoNd4_Tpw1;r?lmFg+B}}3v6nmN zy4kPF{Lg$R)bkrYSVFy4H4#1QH}%)kdp>hwrJi?=okcrS;dIuovOr>^HOO)3qZ|tk ze@l*uYbJf9fUGkW%I`AJh_F8@lKG(**?q7`;chgTEM+)q1VOUrO<`xOJ)9r z5-Snls=lJ*-7Q7Oejs(3tMZktM8^n_@z+-6yFjL1;Kk@F|5MtxPl|cN7f0=(*UBlP z*N@syiPrx8I0{_Ai#s;V_G=U`r;`IYeM z@vhgU(4M{S%tqOVns;rI=&-n**mMkJpP3-rEZ$yZw!stua=p0`qz(z1zZ;~EM?vb* zOm%gyJG4JgOy_j0+n0r=mh-d;;LCmJpL*tBlD#kAMZQVKm(g$g`?3@An9R9vFxqwd zG6HQe?}r8IOZbfGnELKFkiM+dL43(Jn8v7%Z-CTco8~t}d-P=okiML$y1M;C`*Z6{ z_pxqY#!V0G%NFm7FXKTIkA~DU^gVxHKL3utFH@1nWPJIR`mGT1xJPGPjzJ&v<=(r+ zm)qborlK+8yQ@I@vZKmugXtK^@%|H}FYBQlrpX|6Tm;gWm#MC9U(){E`qF)@+n3AE zkIDG*CbUPt*}gocdC%g*o$TWze8yC>qxiBR zNM8e*z4zb_LO z`}=Y@@|cV-^PxSrFPCUu{hs2>+P8@>`-AK=0i-WqQ<-frl>zC?2#~(KSMxstspD55 zeHo>?x_wFebL&g@vF?3K=4{`-r8oK;R8wrZu9Mhu8%SI1{-E0blgYima`xUSviFXe zC;O+gRWgRBK+eO^)wnmJbE$6^@!4>YWtkwyIqXi68-s3N+J4RQUaybcj&|$lch4X) zkEcXzG3R%ssZqc!N*KBk#*W@?IJw)!o)3puiLEUYAXe0mLcu%em zJ>%s5=>+u0xiWf?)EU)H`aB7;4VE*xVJKn)c7JNyoS`&DP&7 zPkBVfuGFJ4b}X~w$dQe$f&TxODbMD6R)rRd?d+Rv8S=eJW)2-#F6WzQQvk+6U(O?w zer+XfG`U~&?%G@Q=5b7eK(;qkW#+l(n9<1_bLRgdy6gyY|Nq5OLC$>gjI|T$<#M1Wn@k zfOQV6^uNz`7I}qGX7(H%&@RWHdFDCPHqG16TXdN-RO~tkvhR~1_Y~JYDRMiIdx;S$ zvrVS%AoUmoQl~dH|2vSn{|a(1(ouDH#}WNu`z@#PEXO*&_5IF5`qFZqApv|_jVeH*>n=UduNJ3ArI_?AAM2fJ+F&PHA&+GO7RMdI72r^L7YK>Bt7NZ-Dt zGTUHU1G0~FkiPsw^P8bP`m&GeItQdaM?faG&*+CNezNYJJLh6od6r`xpLX}gYyD;A zJb9rk^=@JL$mtj_)N`wqPd(2Q>@uc`nfiWM6S0 z^ZSELJ3zL>zLjP4sJg|w$@nv`U4z@Ec&&YfFoxZfo1HI3w zo?OSodB-SxRXNW|C`r9?o z<2gnXfxFOdYtW2QA#`33Z8L979no>zGve#lL5@*|%5{gySablX+hCAm^s4610+|X9 zmoZ{rO#MLG_%z5ddROyrLBG_k8%TYARvWX#yK8RHmv(ue_wG68u7~da^T~Ve);&i^ zJ?wvCOF8?k@b|4f$42pUjB?V`GLFBDlJTfGTE=l0$QY#Iw%@Xq_5A4Uv2Z@;{D`so zOh#Yf+E0;ZrJskvK<(Rm#UyPfzuq%*>|Attg2P0ReJ{d3mwSsv`v2g$@1qR+y?ckS zJf6#n=a+g>TAx(igUp`9?0LAiFnff2M`ANpOsJyXQ)6Cmfw z1F2%a?b|Hx&7PwzKf4p*JOk(FHwL2*^O={>kA3r;-R+-=h^~%_N5Eh5bbczo4kp5|EuPiwP6|Z#(W~jHJ%|c_2Qdi>n9-7A&~3U zO;bgF0OZ=RN##QzV}kuLwFjxs0Fe4l()=Rmhq?{|nI^0Jp~|)&-E*7%v&-%G*&Um0 zp8Gm*o$oquJ9H?OD)zrHP3&9@(k{C%NAZhz@y>G-AGNTDj+Hr=20fVASH`E}8+R9G z{OMP|Z@r@2Zm7RY*Es=Nnef2_ka4P@Kzx%zk8?)IzE zJ>Q`Zo=sz2zZ0lpzfU?e9 zyV5(?GSSXj*uvvmpsfd&$oqlwq^(JyyDj>_PVVut*9*@E(K88c7n>_>KmLxiU0{KK z+g?2zmO9vJ?8P~+g!^z6#~2%AKGI)`y=sP z_~ua0qUNIe(@VtWLht(9?Dd^%jMLGM8RO1qYx@LgYs-7m*6*O(e{MC6ex?sw&)pkE z&t$Y+te3QXe7Uqec!hu4rVV#2dOj}a`2-zPmk-g_kR*BEWRm*>X?AP| ze`WZV{c|l(W&bPqSHcYt0h+JP)*ncHXHwgc&Mp1s@XEfVhwwBLhZ#w_W(?KbJV zJII*%0;CRh|5@IvZ8C@ZdgsDf^l>)=oplSP`(mB8Ffk4%X#Ps&-fWI@4#rC%{6%k( z>!JHW%A`rum4BRDWS7q>Ir}E=op>$AyuQd|J$}D|-)Uf8lIHO`a2e!lp#$d}kK>-O zJ`O63ewb(Wf1{!N^O`q#ve@{?cJW*24)I$8$n+A(x%rXGeRjz{@B@(PGmtu7vs>gF zK=$1cWPgu?)OWJx&jXouf%Gl)Wx5HZPh&y)V5H_>4LxapE%ntDkhZ_CvOSjW^?+k& zmj`-(A@#C5*1e7-ZTGDso1y0`O~l7TzYyD}fwbM$2PXY($-UP2oja`kSMW}mOG#U0 z9Nq;#zg6^Y^0nxD2gq3a5_Icr+hFFj%%zgvxs-uE@UeTRE{$Xxq)BX>f0eiRu4UpO z?}jdn+vlc9or2$rKJ7ua!E&Y_K-Rx@o5=1lV*lLoeJOTD?-0K}46@HRK(1|Tz#aI3QtGqmnCSNd$YV}}Jm$`y zWKT2#q&ySk@wSe+dY|RIR@FNf6TT|vxfUI=&F@uDbmL9zbNNo)QUqh1 z=#zVVF-)6iU&0r@=Y_O~dBc%c2;{R^#%VvaM>5ZR#`C!5W$1n1{=bOd-U8Y8T#)|S ztuotSN&?x(Sdcob(foYSjXH*c)MJ3^>Rz{Kx9!6m%bjO~zRzx_9|-KX{9kA9w|9|m zlJVQ@Fa7Ez)Nl2W4KN8*g0kJri}~-@LDUKBy1*E46oV zJE`;BZ({FqkoK~i=@`iRrvm67gT7^NT*EsDQor-9&uoM3k!+{`H`$M6`EUKl@}WKc zV>udmW-Pm)y&`BY9%LTpz%p>G=CyrC`tE#AY)b~IOA5%bT&ptMUzOR=cE&QmGh4rM*Y~9|zxO>`K{r|aHUoVcKN?b}&KdrGn};8| zp?&-_YeyRLjNj@bzd71#4H~~q#QTk!7pdPf>+`$#Z6?S*XM=2Wv&w9P=?;*7iwEhq zmo@(@kUIVZQjeCZt9uU6?(@w7zjD{}kNSsv=fxrDqojUbwA&w||1gmH+kHTt|C!`H zzv?;1tO150uJi1~pJY9V+$ZC6JIL`#0y#c2L5}0c;DQ?@&IbH{?41XA6jjvzC!vKN zLQ5ziU_d}h2*uC?Mu>tCLJN?K@T})p zt9w#%W-iQ?d^g?mn(D)-v*yKMtP_Ct?DJwT>XvKW+cm`Z!}&z3B_Lx;1=;>twagjQb7vBk9v3o;j;4rksx;6S8(i%U}^eD(!GC=ydt)SSoL25csZMMmB z0c6bi&>mxI46;lD&2a!y+jCm)p`9N8c+O94u4}nN+rUfi@ml$NPYoI8YhLOZ=L4rb zwcUHtQ`;k`v$P$I?V`|LG-zqN7q1U$-EDoPUz-&YZHIx>HUXrzZ>aqiNNw2`%e^3D zeF&tcOSS%c&>ROKHH}5gEFPM*c3=BNO|EOXscARYel_)SMPoIBVcgT;kEBnFjI-1k z&w9qW$4fnRdi)1jKN)n6=a^HTn)gQ?KLh83pQ&@3v8ZEPe19_?d=;^c1zE>2eg$j- z|Mt4U*zmm8mG3Ay94Rb)Q>=*eO$f;Ld#Zf`WZ(D|ljUVW#t~Lr>^ni;e`!3(dd9)> z7D#PA1KEf9;Fskd&>U|d`*5q)8_*Ff#0tc zjTJf$-bZX!|663Pz0OLm6G5xqB6AHt=ULBOztj4{=iTFhnzJ9`PP?!9p}wpejXG+@ z2eoJ2bkwnMJh0EtAja;XeLTF3xa@Tt58dILbt{+3ceMzxD1o?fBZz-`E2g{!z$ALd$U~cz-EL%Zp^D)T$Zb3XO4}sKXBFG#M zX}!l>w(URJNA~6R*XFswHP+2;d8W1;=hSIe+~?Hw(1*qJ^Mq%i0n0|!B2ybtd5m)S zolHr5-otA{uAq&{SeKf2K^sPC(eEH=mNH_SZCLXGag@XN5mp-^zg0AF3n;UVN6|)z zZd0u(k&1dGnEf}Ark zm27&qmi?A}3|QZ5SofN-$6)z(t>gT>&~a~>gsT!)hQ?Lqg6vDWfZR7t06G6&0y+Qo zfWcE_th`rQ;{Fw6+?A@x`<2=tw^;&mn@YFH+;0fd9tLvxW1wqXdCSxGIc}!>v#QVZ z9>;wTv9!Ole$U_GqUXMqF0|5KxE6?k{h2gXwrN#U z;urz44K8Qt1akYXYCH9(@2rZYg*A_z_xIbGN8(P@wl}M!hK4qQtIe!VX#kwkb-;_ah zMYrW3eZK@!FK)|{3{ubaAbo$U^`U5ou|bwUB_&fJLYS5Y;WDu=w0}j zuh-~|50ki8fQ;Mj1L53oagI^zvoed$G3#GQ#%#i`qSq@R^*RYsuVPnZ%r*e2*S%m( zTzOGdBKLBx!ZNP?$=q2*|@@4kJ+Qh zhq)je7n$d*-#o``kxQOqHUxF{F*_dZImfII+G1Vahr~yRMxxsckiKVv)PviyB!bj) z8Av@p)%sFshp|-$spmwE(K#lWuU)%rmpkToYLTq$OR>VVyO{BhVK0N=+8M?!R61dLE=+FM`yI+p_Ed>F+Q|-}yC`b|CfY15&TeTJO|@ z`CdyekL3=%jAB{q)&39fdi{xdt5|wHeA!d41k~B}I*S~rja{$dXp40RM~YsLMu=V; zKc+gUrJKichi);&v(|0OpWbz= z|Cgt3Fa7GN+g8-sb*qB*oVvZDb+hzdyVDwrZo5G0_AW@>E~w2mSQ>)Vtqn-sMr-{x zkh*;WQnyfz)u|ivzLstt%N@EU`)94&cKBrMaPJ~x8gkWBwb6?zGeE|e7co+|o*JuDH|BjU-8_~% zbjv7_wQd*S)0=L~{`SULb~Z$*35ttm*|=4z}?-I({abn{s5&@HlL*1A>4zjAuh?XdZ8od^nr zF*E-5e|YK^hdR4%dsHLVS;vERXp6eVHIwnS1^TdDRGlt?)U9%J(T#1edLYyooG+w(8bHV??r)q{W}Iyi5TIVPe&_Vpm}$$m0^UT7`)e+-)2fZWFS4jD(& zKyKp~CFiZdAnkiWjSqinI#B#%cuUoL`LjSLDN(%jI*= zKgQVHX7jVy4A@p-?A-R?Rry|mW8eB5`ZVfTtj|oIMf;p{);v6o*Zt5I>!#>;=PT|M z9gl*HF&$(KE!v1~V?f$FK`v*TEXf-CdXO=l*7`AMpD{lTGOlA9yK`Prmz?OG-F9;Q zj{CiB^@>^V=MwUZ-YY=ng793Vj-3m5>fFo-HS?zi%!}H`ppM1TxeVH~>zsmR?`z$? z`h8}HwxaV4kiO@EZ1Wwp*#=7ukYl0=NL@#0{g)tPJP$ICD2>&r5A)AT*X-7nYjoXX zcY1KvWA_C7GtT^eZY`Nl4V%q4kHEHyHFgtyL{t0NeF=3emZp!PeY>Wov8*H7VqGcy zoT^{6Xu1TXrpX{p6Cdyq;QiM;(hbW(S}>rS_1I znE$VoY|kZa_u@9H%X#F^;z34~>UgA+=-55hQ%CEwe>vV&bDgVoM?1IaKI0d(WfdOt z1O44L$IxEbtmnAmnB(g%exc^MR>~H+2T)V2!}0oRs`PDQXNhSw$n`$~x&3!)XXx_M zT_k31&(Z;;&%PjiZPR-D*s#BLj!EW~X}Nih8tlqDrADxE7VTQ|7cY$;;lr{SV^Rr; zg>f?$GOD0E-@&j;U>)ZB@^ESEAo5_j408P%UBzwyvTd%<5(?5s1jx2$Xnm%bZQo7u zdtb(!X}RNlTSiUy{CXSh6`w0HeWEe^tTEWzU@SLUoa5F0oAI>U
      c^jy&T9N(hz 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 +#include +#include "QTextCodec" +#include "SensorMannager.h" +#include"SensorOptoSky.h" +#include"SensorQExPRO.h" +#include +#include +#include +QTextStream cout1(stdout, QIODevice::WriteOnly); +void logout(QString str){ + std::cout<"; + std::fflush(stdout); +} +vector FindFeng(vector point1ist, vector valuelist); +vector DengJianJu(int position, int distanc, int times = 10); +vector PingHua(vector value, int step = 2); +int main(int argc, char* argv[]) +{ + QCoreApplication aaaaa(argc, argv); + cout1<<"Welcom to use the Auto Locate Application"<<"
      "<initSensor(); + + cout1<<"Get Tempratrue:"<GettingTempratrue()<<"
      "<Settingshuttertime(20); + aa->GetOnePlot(oneplot); + cout1<<"Position"<< oneplot.Plot[1000]; + + + + + CVSMD12XControl Motercontrol; + Motercontrol.ILMES_InitializeComm("COM16"); + + //Motercontrol.ILMES_InitializeComm("/dev/ttyUSB1"); + ControllerParams cpTest; + bool res = Motercontrol.ILMES_InitializeParams(cpTest); + Motercontrol.StartBackZero(); + Motercontrol.SetRunSpeed(10000); + Motercontrol.MoveTo_NoSyn(550000); + aa->GetOnePlot(oneplot); + MSInfo temp; + Motercontrol.GetStatus(temp); + vector point1ist; + vector valuelist; + int i = 0; + Motercontrol.GetStatus(temp); + //outfile <GetOnePlot(oneplot); + //qDebug() << oneplot.BandNum; + //std::cout << temp.iPosition << std::endl; + + Motercontrol.GetStatus(temp); + i++; + //outfile << i << "," << oneplot.Plot[1024] << "," << temp.iPosition << std::endl; + point1ist.push_back(temp.iPosition); + valuelist.push_back(oneplot.Plot[1024]); + + } + Motercontrol.StartBackZero(); + vector valuepinghua1 = PingHua(valuelist, 3); + vectorloction1=FindFeng(point1ist, valuepinghua1); + int lenth = loction1.size(); + for (size_t i = 0; i < lenth; i++) + { + vector location1point = DengJianJu(loction1[i], 5000, 25); + vector valuepoint; + int lennow = location1point.size(); + for (size_t ii = 0; ii < lennow; ii++) + { + Motercontrol.MoveTo(location1point[ii]); + aa->GetOnePlot(oneplot); + valuepoint.push_back(oneplot.Plot[1024]); + //outfile << ii << "," << oneplot.Plot[1024] << "," << location1point[ii] << std::endl; + } + vector valuepinghua = PingHua(valuepoint,3); + vectorloction2 = FindFeng(location1point, valuepinghua); + if (loction2.size() == 1) + { + outfile < FindFeng(vector point1ist, vector valuelist) +{ + vector ret; + int lenth = point1ist.size(); + if (lenth<10) + { + ret.push_back(0); + return ret; + } + for (size_t i = 5; i < lenth-5; i++) + { + if (valuelist[i] > 5000&&valuelist[i]>valuelist[i-1]&& valuelist[i] > valuelist[i - 4]&& valuelist[i] >valuelist[i + 1]&& valuelist[i] > valuelist[i + 4] + && valuelist[i-1] > 5000 && valuelist[i-4]&& valuelist[i +1] > 5000 && valuelist[i + 4]) + { + if (ret.size()!=0) + { + if (point1ist[i]-ret[ret.size()-1]<5000) + { + continue; + } + + } + ret.push_back(point1ist[i]); + + + } + + } + return ret; + + + +} +vector DengJianJu(int position, int distanc, int times ) +{ + int begin = position - distanc; + vector ret; + int eachstep = distanc / times; + for (size_t i = 0; i < 2*times; i++) + { + ret.push_back(begin + i * eachstep); + } + return ret; + +} +vector PingHua(vector value,int step) +{ + vector ret; + if (value.size()<2*step) + { + return value; + } + int len = value.size(); + for (size_t i = 0; i < step; i++) + { + ret.push_back(value[i]); + } + for (size_t i = step; i 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; + } + + 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; + + + 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; + } + + + 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::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(50); + QByteArray qbTemp = m_pSerialPort->readAll(); + qbData.append(qbTemp); + + if (iCounter > 10) + { + 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(50); + qbData.append(m_pSerialPort->readAll()); + + if (iCounter > 100) + { + 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) + { + qDebug() << "Err:RecvData Failed,Incorrect Check Sum.Exit Code:4" << qbData.size(); + qbData.clear(); + return 4; + } + + 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::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.usData, m_daDeviceAttr.iPixels); + + double dSum = 0; + int iCount = m_daDeviceAttr.iPixels / 100; + for (int i = 0; i < iCount; i++) + { + dSum += dfTemp.usData[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) +{ + QByteArray qbExposureTime,qbRecv; + qbExposureTime.append(SET_INTEGRATION_TIME); + qbExposureTime.resize(3); + qbExposureTime[1] = iExposureTimeInMS >> 8; + qbExposureTime[2] = iExposureTimeInMS & 0xFF; + + SendCommand(qbExposureTime); + RecvData(qbRecv); + ParseData(qbRecv); + + 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; + SendCommand(qbSend); + RecvData(qbRecv); + ParseData(qbRecv); + 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; + SendCommand(qbSend); + RecvData(qbRecv); + ParseData(qbRecv); + + if ((ZZ_U8)qbRecv[0] != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:1"; + return 1; + } + else + { + int iDataSizeInPixel = (qbRecv.size() - 1) / 2; + memcpy(dfData.usData, qbRecv.data() + 1, iDataSizeInPixel * 2); + + } + + 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; + SendCommand(qbSend); + RecvData(qbRecv); + ParseData(qbRecv); + + if ((ZZ_U8)qbRecv[0] != 0) + { + qDebug() << "Err:SingleShot Failed.Exit Code:1"; + return 1; + } + 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) +{ + QByteArray qbSend, qbRecv; + qbSend.clear(); + qbRecv.clear(); + qbSend.append(GET_TEC_TEMP); + qbSend.resize(3); + qbSend[1] = 0x00; + qbSend[2] = 0x01; + SendCommand(qbSend); + RecvData(qbRecv); + ParseData(qbRecv); + 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/othersoft/shuttercali/source/FS/ATPControl_Serial_QT.h b/othersoft/shuttercali/source/FS/ATPControl_Serial_QT.h new file mode 100644 index 0000000..dbb6456 --- /dev/null +++ b/othersoft/shuttercali/source/FS/ATPControl_Serial_QT.h @@ -0,0 +1,84 @@ +////////////////////////////////////////////////////////////////////////// +//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(); + virtual ~ZZ_ATPControl_Serial_Qt(); + +public: + //设置波特率 + //int SetBaudRate(int iBaud); + //初始化设备 + int Initialize(bool bIsUSBMode, ZZ_U8 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; + + //////////////////////////////////////////////////////////////////////////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 SendCommand(QByteArray qbCommand); + int RecvData(QByteArray &qbData); + int ParseData(QByteArray &qbData); +//private slots : + //void ReadMessage(); +}; \ No newline at end of file diff --git a/othersoft/shuttercali/source/FS/ATPDataFileProcessor.cpp b/othersoft/shuttercali/source/FS/ATPDataFileProcessor.cpp new file mode 100644 index 0000000..e69de29 diff --git a/othersoft/shuttercali/source/FS/ATPDataFileProcessor.h b/othersoft/shuttercali/source/FS/ATPDataFileProcessor.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/othersoft/shuttercali/source/FS/ATPDataFileProcessor.h @@ -0,0 +1 @@ +#pragma once diff --git a/othersoft/shuttercali/source/FS/IrisFiberSpectrometerBase.h b/othersoft/shuttercali/source/FS/IrisFiberSpectrometerBase.h new file mode 100644 index 0000000..ebf17d7 --- /dev/null +++ b/othersoft/shuttercali/source/FS/IrisFiberSpectrometerBase.h @@ -0,0 +1,42 @@ +#include +#include "ZZ_Types.h" +#pragma once +using namespace ZZ_MISCDEF; +using namespace ZZ_MISCDEF::IRIS::FS; + +class CIrisFSBase +{ +public: + //CIrisFSBase(); + //virtual ~CIrisFSBase()= 0; +public: + //初始化设备 + //此处string为指明连接哪个ocean光谱仪的参数,可自行更换为其他c/c++标准类型 + //0为无错误,不同错误请返回不同值 + virtual int Initialize(bool bIsUSBMode,ZZ_U8 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/othersoft/shuttercali/source/FS/ZZ_Types.h b/othersoft/shuttercali/source/FS/ZZ_Types.h new file mode 100644 index 0000000..7ad1c54 --- /dev/null +++ b/othersoft/shuttercali/source/FS/ZZ_Types.h @@ -0,0 +1,297 @@ +////////////////////////////////////////////////////////////////////////// +//类型说明文件 +////////////////////////////////////////////////////////////////////////// +#pragma once +#include "pch.h" +#include +#define MAX_DEVICENUMBER_FS 2 +#define MAX_LINEARSHUTTER_POSITION 12 +namespace ZZ_MISCDEF +{ + typedef unsigned char ZZ_U8; + typedef unsigned short int ZZ_U16; + typedef unsigned long int ZZ_U32; + + + namespace IRIS + { + //Fiber Spectrometer + namespace FS + { + typedef struct tagDataFrame + { + ZZ_U16 usExposureTimeInMS; + ZZ_U16 usData[4096]; + float fTemperature; + 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; + } + + 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 tagFiberSpecContext + { + ZZ_U8 ucDeviceNumber; + ZZ_U8 ucDeviceModel[MAX_DEVICENUMBER_FS]; + int iInterface[MAX_DEVICENUMBER_FS]; + std::string strSN[MAX_DEVICENUMBER_FS]; + }FSContext; + + typedef struct tagLinearShutterContext + { + ZZ_U8 ucPort; + 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; + + }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; + } + +}; diff --git a/othersoft/shuttercali/source/LinearShutter/AbstractPort.h b/othersoft/shuttercali/source/LinearShutter/AbstractPort.h new file mode 100644 index 0000000..0c0118b --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/AbstractPort.h @@ -0,0 +1,16 @@ +#pragma once +#include "VSMD12XMiscDefines.h" +#include +class CAbstractPort +{ +public: + virtual void InitPort(PortInfo portinfo) = 0; + virtual bool SetPort() = 0; + virtual bool Open() = 0; + virtual void Close() = 0; + + virtual std::string ReadAll(int waite=5000) = 0; + virtual int Write(const std::string strSend) = 0; + +}; + diff --git a/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.cpp b/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.cpp new file mode 100644 index 0000000..4013b30 --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.cpp @@ -0,0 +1,1415 @@ +#include "pch.h" +#include "VSMD12XControl.h" +#include "ZZ_SeiralPort.h" +#include +#define sprintf_s snprintf +CVSMD12XControl::CVSMD12XControl() +{ + m_iProtocolType = 0; + m_iCID = 1; + m_bIsSyncMove = 0; + m_piPositionInPulses = NULL; + waitetime = 200; + waitetime = 200; +} + +CVSMD12XControl::~CVSMD12XControl() +{ + if (m_piPositionInPulses!=NULL) + { + delete[] m_piPositionInPulses; + } +} + +bool CVSMD12XControl::ILMES_InitializeComm(PortInfo portinfo, int iPortType /*= 1*/, int iCID /*= 1*/, bool bSyncMove /*= true*/) +{ + SetProtocolType(iPortType); + SetCID(iCID); + SetSyncMode(bSyncMove); + + return InitAndOpenPort(portinfo); +} +bool CVSMD12XControl::ILMES_InitializeComm(QString portName, int bandrate, int iPortType , int iCID , bool bSyncMove ) +{ + PortInfo pi; + pi.FullPortName = portName; + pi.iBaudRate = bandrate; + return ILMES_InitializeComm(pi, iPortType, iCID, bSyncMove); + + +} + +bool CVSMD12XControl::ILMES_InitializeParams(ControllerParams cpParams) +{ + bool bRes = false; + + bRes = CVSMD12XControl::SetBaudRate(cpParams.bdr); + if (!bRes) + { + qDebug() << "SetBaudRate Err"; + //return false; + } + + bRes = CVSMD12XControl::SetSpeed(cpParams.spd,cpParams.acc,cpParams.dec); + if (!bRes) + { + qDebug() << "SetSpeed Err"; + //return false; + } + + bRes = CVSMD12XControl::SetMicroSteps(cpParams.mcs); + if (!bRes) + { + qDebug() << "SetMicroSteps Err"; + //return false; + } + + bRes = CVSMD12XControl::SetCurrent(cpParams.cra,cpParams.crn,cpParams.crh); + if (!bRes) + { + qDebug() << "SetCurrent Err"; + //return false; + } + + bRes = CVSMD12XControl::SetZeroParams(cpParams.zmd,cpParams.osv, cpParams.snr,cpParams.zsd,cpParams.zsp); + if (!bRes) + { + qDebug() << "SetZeroParams Err"; + //return false; + } + return bRes; +} + +void CVSMD12XControl::ILMES_SetPosition(int *piPositionInPulse, size_t szSize) +{ + m_piPositionInPulses = new int[szSize]; + for (size_t i=0;i< szSize;i++) + { + m_piPositionInPulses[i] = piPositionInPulse[i]; + } +} + +bool CVSMD12XControl::ILMES_MoveToPos(int iPositionIndex) +{ + bool bRes = false; + bRes = CVSMD12XControl::StartBackZero(); + if (!bRes) + { + qDebug() << "StartBackZero Err"; + return false; + } + + bRes = CVSMD12XControl::MoveTo(m_piPositionInPulses[iPositionIndex]); + if (!bRes) + { + qDebug() << "MoveTo Err"; + return false; + } + + return bRes; +} + +void CVSMD12XControl::SetProtocolType(int iProtocolType /*= 0*/) +{ + m_iProtocolType = iProtocolType; +} + +void CVSMD12XControl::SetCID(int iID) +{ + m_iCID = iID; + + char cmd[64]; + sprintf_s(cmd, 64, "%d ", iID); + std::string strCID(cmd); + m_strCID = strCID; + return; +} + +void CVSMD12XControl::SetSyncMode(bool bSyncMove /*= false*/) +{ + m_bIsSyncMove = bSyncMove; +} + +bool CVSMD12XControl::InitAndOpenPort(PortInfo portinfo) +{ + bool bRes = false; + if (portinfo.iPortType==0) + { + m_pAbsPort = new CZZ_SeiralPort_QT; + } + + m_pAbsPort->InitPort(portinfo); + + bRes = m_pAbsPort->SetPort(); + if (!bRes) + { + return bRes; + } + bRes = m_pAbsPort->Open(); + return bRes; +} + +std::string CVSMD12XControl::ReadReceive() +{ + return m_pAbsPort->ReadAll(); +} + +int CVSMD12XControl::SendCommand(const std::string strSend) +{ + return m_pAbsPort->Write(strSend); +} + +bool CVSMD12XControl::InitController() +{ +// std::string strTest = "this is a test message."; +// +// char *pcTest = new char[strTest.length()]; +// strTest.copy(pcTest, strTest.length(),0); +// +// memcpy(pcTest, strTest.c_str(), 23); +// +// char *pcTest1 = (char*)strTest.c_str(); +// std::string test=m_pAbsPort->ReadAll(); + std::string strCMD = "dev\n"; + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + int iRet=m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + std::string strRecv = m_pAbsPort->ReadAll(); + ParseReturnedString(strRecv, 0); + std::string::size_type szPosition; + szPosition = strRecv.find("VSMD", 0); + if (szPosition != strRecv.npos) + { + return true; + } + return false; +} + +bool CVSMD12XControl::GetStatus(MSInfo &stuMotorParam) +{ + std::string strCMD = "cts\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + + //QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + ParseReturnedParam(strRecv); + + stuMotorParam = m_stuMSInfo; + return true; +} + +bool CVSMD12XControl::Move(int iRelPulse) +{ + using namespace ZZ_MISCDEF; + char cmd[64]; + sprintf_s(cmd, 64, "rmv %d\n", iRelPulse); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + QThread::msleep(200); + m_pAbsPort->ReadAll(); + if (m_bIsSyncMove) + { + if (iRet != 0) + { + return false; + } + + bool bFlagIsStopped=false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag==0x10 && m_stuMSInfo.fVelocity==0) + { + bFlagIsStopped = true; + } + } + return true; + } + else + { + if (iRet == 0) + { + return true; + } + return false; + } + +} + +bool CVSMD12XControl::Enable() +{ + std::string strCMD = "ena\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::Disable() +{ + std::string strCMD = "off\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); + +} + +bool CVSMD12XControl::MoveTo(int iAbsPulse) +{ + if (iAbsPulse > MAXDISTANCE) + { + //return false; + iAbsPulse = MAXDISTANCE; + } + + char cmd[64]; + sprintf_s(cmd, 64, "pos %d\n", iAbsPulse); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + + int iRet = m_pAbsPort->Write(strCMD); + if (waitetime!=0) + { + QThread::msleep(200); + } + + + m_pAbsPort->ReadAll(); + + if (m_bIsSyncMove) + { + if (iRet != 0) + { + return false; + } + + bool bFlagIsStopped = false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag == 0x10 && m_stuMSInfo.fVelocity == 0) + { + bFlagIsStopped = true; + } + } + return true; + } + else + { + if (iRet == 0) + { + return true; + } + return false; + } +// if (iRet == 0) +// { +// return true; +// } +// return false; +// std::string strTest; +// strTest.resize(7); +// char test[7]; +// //memcpy(test, strCMD.c_str(), 7); +// for (size_t i = 0; i < 7; i++) +// { +// strTest[i] = cmd[i]; +// } +} + +bool CVSMD12XControl::Move_NoSyn(int iRelPulse) +{ + bool a; + waitetime = 0; + m_bIsSyncMove = false; + a = Move(iRelPulse); + m_bIsSyncMove = true; + waitetime = 200; + return a; + +} + +bool CVSMD12XControl::MoveTo_NoSyn(int iAbsPulse) +{ + bool a; + waitetime = 0; + m_bIsSyncMove = false; + a = MoveTo(iAbsPulse); + m_bIsSyncMove = true; + waitetime =200; + return a; +} + +bool CVSMD12XControl::SetLogicZero() +{ + std::string strCMD = "org\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::StartBackZero() +{ + std::string strCMD = "zero start\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + + if (!ParseReturnedString(strRecv, -1)) + { + return false; + } + + bool bFlagIsStopped = false; + while (!bFlagIsStopped) + { + QThread::msleep(200); + GetStatus(m_stuMSInfo); + ZZ_U8 ucFlag = m_stuMSInfo.uiFlags & 0x000000FF; + ucFlag = ucFlag & 0x10; + if (ucFlag == 0x10 && m_stuMSInfo.fVelocity == 0) + { + bFlagIsStopped = true; + } + } + return true; +// return ParseReturnedString(strRecv, -1); + +} + +bool CVSMD12XControl::StopBackZero() +{ + std::string strCMD = "zero stop\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(200); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetBaudRate(int iBaudRate) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg bdr=%d\n", iBaudRate); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +int CVSMD12XControl::GetBaudRate() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes= ParseReturnedParam(strRecv); + if (bRes=false) + { + return -1; + } + else + { + return m_stuControllerParams.bdr; + } +} + +bool CVSMD12XControl::SetMicroSteps(int iMicroSteps) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg mcs=%d\n", iMicroSteps); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +int CVSMD12XControl::GetMicroSteps() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.mcs; + } +} + +bool CVSMD12XControl::SetAccSpeed(float fAccSpd) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg acc=%f\n", fAccSpd); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetAccSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.acc; + } +} + +bool CVSMD12XControl::SetRunSpeed(float fRunSpeed) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg spd=%f\n", fRunSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetRunSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.spd; + } +} + +bool CVSMD12XControl::SetDecSpeed(float fDecSpeed) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg dec=%f\n", fDecSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetDecSpeed() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.dec; + } +} + +bool CVSMD12XControl::SetSpeed(float fRunSpeed, float fAccSpd, float fDecSpeed) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg spd=%f acc=%f dec=%f\n", fRunSpeed, fAccSpd, fDecSpeed); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetHoldCurrent(float fHoldCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg crh=%f\n", fHoldCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetHoldCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.crh; + } +} + +bool CVSMD12XControl::SetAccCurrent(float fAccCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg cra=%f\n", fAccCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetAccCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.cra; + } +} + +bool CVSMD12XControl::SetRunCurrent(float fRunCurrent) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg crn=%f\n", fRunCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +float CVSMD12XControl::GetRunCurrent() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.crn; + } +} + +bool CVSMD12XControl::SetCurrent(float fAccCurrent, float fRunCurrent, float fHoldCurrent) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg cra=%f crn=%f crh=%f\n", fAccCurrent, fRunCurrent, fHoldCurrent); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +bool CVSMD12XControl::SetS1FETE(ZZ_U8 bS1FETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s1f=%d\n", bS1FETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS1FETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s1f; + } +} + +bool CVSMD12XControl::SetS1RETE(ZZ_U8 bS1RETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s1r=%d\n", bS1RETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS1RETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s1r; + } +} + +bool CVSMD12XControl::SetS2FETE(ZZ_U8 bS2FETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s2f=%d\n", bS2FETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS2FETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s2f; + } +} + +bool CVSMD12XControl::SetS2RETE(ZZ_U8 bS2RETE) +{ + char cmd[64]; + sprintf_s(cmd, 64, "cfg s2r=%d\n", bS2RETE); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetS2RETE() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.s2r; + } +} + +bool CVSMD12XControl::SetZeroParams(ZZ_U8 bZeroMode, ZZ_U8 bSwitchOpenVL, ZZ_U8 bZeroSensor, float fZeroVelocity, int iSafePosition) +{ + char cmd[128]; + sprintf_s(cmd, 128, "cfg zmd=%d osv=%d snr=%d zsd=%f zsp=%d\n", + (int)bZeroMode, (int)bSwitchOpenVL, (int)bZeroSensor, fZeroVelocity, iSafePosition); + std::string strCMD(cmd); + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(800); + + std::string strRecv = m_pAbsPort->ReadAll(); + + return ParseReturnedString(strRecv, -1); +} + +ZZ_U8 CVSMD12XControl::GetZeroMode() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zmd; + } +} + +ZZ_U8 CVSMD12XControl::GetSwitchOpenVoltageLevel() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.osv; + } +} + +ZZ_U8 CVSMD12XControl::GetZeroSensor() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.snr; + } +} + +int CVSMD12XControl::GetSafePosition() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zsp; + } +} + +float CVSMD12XControl::GetZeroVelocity() +{ + std::string strCMD = "cfg\n"; + + if (m_iProtocolType) + { + strCMD = m_strCID + strCMD; + } + + int iRet = m_pAbsPort->Write(strCMD); + + QThread::msleep(500); + + std::string strRecv = m_pAbsPort->ReadAll(); + bool bRes = ParseReturnedParam(strRecv); + if (bRes = false) + { + return -1; + } + else + { + return m_stuControllerParams.zsp; + } +} + +bool CVSMD12XControl::ParseReturnedString(std::string &strRecv, int iType) +{ + char cHead =(char) 0xFF; + if (iType == -1) + { + if (strRecv[0]== cHead) + { + return true; + } + return false; + } + else if (iType == 0) + { + if (strRecv.size()<3) + { + return false; + } + strRecv.erase(0, 3); + strRecv.erase(strRecv.size() - 3, 3); + return true; + } + else + { + return false; + } +} + +bool CVSMD12XControl::ParseReturnedParam(std::string &strRecv) +{ + + + + while (uchar( strRecv[0])!=0xff&&strRecv.size()>0) + { + //std::cout << strRecv.size() << endl; + strRecv.erase(strRecv.begin()); + //std::cout << strRecv.size() << endl; + + } + int ii = 0; + while (strRecv.size() < 2) + { + + std::string strRecv1 = m_pAbsPort->ReadAll(20); + if (strRecv1.size() == 0) + { + return false; + + } + strRecv = strRecv + strRecv1; + ii++; + if (ii == 2) + { + return false; + + } + } + if (strRecv[2]==0x2) + { + //strRecv.erase(0, 3); + //strRecv.erase(strRecv.size() - 3, 3); + int i = 0; + int izero = 0; + while (strRecv.size() != 21) + { + std::string strRecv1 = ""; + strRecv1 = m_pAbsPort->ReadAll(20); + if (strRecv1.size()==0) + { + return false; + + } + strRecv = strRecv + strRecv1; + i++; + if (i==5) + { + return false; + + } + if (strRecv.size() > 21) + { + return false; + } + //return false; + } + ZZ_U8 *pbRecv = (ZZ_U8*)strRecv.c_str(); + + VSMD_BitShift(&pbRecv[3], &m_unValue); + m_stuMSInfo.fVelocity = m_unValue.fValue; + VSMD_BitShift(&pbRecv[8], &m_unValue); + m_stuMSInfo.iPosition = m_unValue.i32Value; + VSMD_BitShift(&pbRecv[13], &m_unValue); + m_stuMSInfo.uiFlags = m_unValue.u32Value; + + //delete pbRecv; + return true; + } + else if (strRecv[2] == 0x3) + { + strRecv[strRecv.size() - 3] = 0; + char* pcParam = ((char*)strRecv.c_str())+3; + + while (pcParam) + { + char* pcNext = VSMD_Split(pcParam, ' '); + char* pcValueStr = VSMD_Split(pcParam, '='); + + // + if (pcValueStr) + { + if (strcmp(pcParam, "bdr") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.bdr = iValue; + } + else if (strcmp(pcParam, "mcs") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.mcs = iValue; + } + else if (strcmp(pcParam, "spd") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.spd = fValue; + } + else if (strcmp(pcParam, "acc") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.acc = fValue; + } + else if (strcmp(pcParam, "dec") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.dec = fValue; + } + else if (strcmp(pcParam, "cra") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.cra = fValue; + } + else if (strcmp(pcParam, "crn") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.crn = fValue; + } + else if (strcmp(pcParam, "crh") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.crh = fValue; + } + else if (strcmp(pcParam, "s1f") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s1f = iValue; + } + else if (strcmp(pcParam, "s1r") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s1r = iValue; + } + else if (strcmp(pcParam, "s2f") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s2f = iValue; + } + else if (strcmp(pcParam, "s2r") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.s2r = iValue; + } + else if (strcmp(pcParam, "zmd") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.zmd = iValue; + } + else if (strcmp(pcParam, "osv") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.osv = iValue; + } + else if (strcmp(pcParam, "snr") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.snr = iValue; + } + else if (strcmp(pcParam, "zsd") == 0) + { + float fValue = (float)atof(pcValueStr); + m_stuControllerParams.zsd = fValue; + } + else if (strcmp(pcParam, "zsp") == 0) + { + int iValue = atoi(pcValueStr); + m_stuControllerParams.zsp = iValue; + } + + } + pcParam = pcNext; + } + return true; + } + + return false; +} + +void CVSMD12XControl::VSMD_BitShift(ZZ_U8* src, unValue* dst) +{ + if (src) + { + dst->u32Value = src[0]; + + dst->u32Value <<= 7; + dst->u32Value |= src[1]; + + dst->u32Value <<= 7; + dst->u32Value |= src[2]; + + dst->u32Value <<= 7; + dst->u32Value |= src[3]; + + dst->u32Value <<= 7; + dst->u32Value |= src[4]; + } +} + +char* CVSMD12XControl::VSMD_Split(char* cStr, char cSplit) +{ + if (cStr) + { + for (char* cPtr = cStr; *cPtr; cPtr++) + { + if (*cPtr == cSplit) + { + *cPtr = '\0'; + cPtr++; + return cPtr; + } + } + } + + return NULL; +} + +// int CVSMD12XControl::add(int a, int b) +// { +// return a + b; +// } diff --git a/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.h b/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.h new file mode 100644 index 0000000..46e6a5f --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/VSMD12XControl.h @@ -0,0 +1,146 @@ +#pragma once +#include "pch.h" +#include "AbstractPort.h" +using namespace std; +// #ifdef IRIS_API_EXPORTS +// +// #ifdef __cplusplus +// #define IRIS_API_FUNC extern "C" __declspec(dllexport) +// #else +// #define IRIS_API_FUNC __declspec(dllexport) +// #endif +// +// #else +// +// #ifdef __cplusplus +// #define IRIS_API_FUNC extern "C" __declspec(dllimport) +// #else +// #define IRIS_API_FUNC __declspec(dllimport) +// #endif +// +// #endif +// +// +// #ifdef IRIS_API_EXPORTS +// #define IRIS_API_CLASS __declspec(dllexport) +// #else +// #define IRIS_API_CLASS __declspec(dllimport) +// #endif +#define MAXDISTANCE 1265000 +class /*IRIS_API_CLASS*/ CVSMD12XControl +{ +public: + CVSMD12XControl(); + ~CVSMD12XControl(); +private: + int *m_piPositionInPulses; + + CAbstractPort *m_pAbsPort; + unValue m_unValue; + MSInfo m_stuMSInfo; + ControllerParams m_stuControllerParams; + int m_iProtocolType; + int m_iCID; + std::string m_strCID; +public: + bool m_bIsSyncMove; + ////////////////////////////////////////////////////////////////////////// + //for IRIS Linear Motor - Electric Shutter + //Initialize communication setup iPortType(0:RS232 1:RS485) iCID(For RS485 device) bSyncMove(move mode) + bool ILMES_InitializeComm(QString portName,int bandrate=9600, int iPortType = 1, int iCID = 1, bool bSyncMove = true); + //Initialize communication setup iPortType(0:RS232 1:RS485) iCID(For RS485 device) bSyncMove(move mode) + bool ILMES_InitializeComm(PortInfo portinfo,int iPortType = 1,int iCID = 1, bool bSyncMove = true); + + //Initialize Controller params + bool ILMES_InitializeParams(ControllerParams cpParams); + + //Set the light hole position(pulses) + void ILMES_SetPosition(int *piPositionInPulse,size_t szSize); + + bool ILMES_MoveToPos(int iPositionIndex); + +public: + int waitetime; + ////init port + void SetProtocolType(int iProtocolType = 0);//0:RS232 1:RS485 call before send any command + void SetCID(int iID);//set device id when using RS485 protocol call before send any command + void SetSyncMode(bool bSyncMove = false); + bool InitAndOpenPort(PortInfo portinfo);//Init comport by PortInfo Struct + + //////////////////////////////////////////////////////////////////////////for debug or unsupported function + std::string ReadReceive(); + int SendCommand(const std::string strSend); // return indicates how many char has been sent + //////////////////////////////////////////////////////////////////////////motor control + ////init&misc + bool InitController(); //Init Motor controller hand shake + + bool Enable(); //enbale + bool Disable(); //disable + + bool GetStatus(MSInfo &stuMotorParam); //load motor status see MSInfo Struct + ////motion control + bool Move(int iRelPulse); // relative move mode,pulse (-2147483647~2147483647) + bool MoveTo(int iAbsPulse);//absolute mode,pulse (-2147483647~2147483647) + bool Move_NoSyn(int iRelPulse); // relative move mode,pulse (-2147483647~2147483647) + bool MoveTo_NoSyn(int iAbsPulse);//absolute mode,pulse (-2147483647~2147483647) + bool SetLogicZero(); //set logic zero + + bool StartBackZero();//back zero + bool StopBackZero();// stop back zero & reset register + ////Set&Get + bool SetBaudRate(int iBaudRate);//set controller baud rates,default B9600 (2400 ~ 921600) + int GetBaudRate(); // -1:should retry; + + bool SetMicroSteps(int iMicroSteps);//set micro steps (0~5)->(1/2/4/8/16/32) + int GetMicroSteps(); + + bool SetAccSpeed(float fAccSpd);//set acceleration speed in pulse (0 ~ 192000000) + float GetAccSpeed(); + + bool SetRunSpeed(float fRunSpeed);//set normal running speed in pulse (0 ~ 192000000) + float GetRunSpeed(); + + bool SetDecSpeed(float fDecSpeed);//set deceleration speed in pulse (0 ~ 192000000) + float GetDecSpeed(); + + bool SetSpeed(float fRunSpeed, float fAccSpd, float fDecSpeed);//see above three functions + + bool SetHoldCurrent(float fHoldCurrent);//set hold current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetHoldCurrent(); + + bool SetAccCurrent(float fAccCurrent);//set acceleration current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetAccCurrent(); + + bool SetRunCurrent(float fRunCurrent);//set normal running current ( 0 ~ 8.0 )Amp? pay attention to your motor specification. + float GetRunCurrent(); + + bool SetCurrent(float fAccCurrent, float fRunCurrent, float fHoldCurrent);//see above three functions + + bool SetS1FETE(ZZ_U8 bS1FETE);//S1 register falling edge trigger event,see enum + ZZ_U8 GetS1FETE(); + + bool SetS1RETE(ZZ_U8 bS1RETE);//S1 register rising edge trigger event + ZZ_U8 GetS1RETE(); + + bool SetS2FETE(ZZ_U8 bS2FETE);//S2 register falling edge trigger event + ZZ_U8 GetS2FETE(); + + bool SetS2RETE(ZZ_U8 bS2RETE);//S2 register rising edge trigger event + ZZ_U8 GetS2RETE(); + + //(ZeroMode 0:off 1:once 2:once + safe position 3:twice 4:twice + safe position) (OpenVoltageLevel 0:Low Level 1:High Level) + //(ZeroSensor 0:S1 1:S2 2:S3 3:S4 4:S5 5:S6)( ZeroVelocity (-192000) ~(192000)pulse)(SafePosition (-2147483647) ~(2147483647)) + bool SetZeroParams(ZZ_U8 bZeroMode, ZZ_U8 bSwitchOpenVL, ZZ_U8 bZeroSensor, float fZeroVelocity, int iSafePosition); + ZZ_U8 GetZeroMode(); + ZZ_U8 GetSwitchOpenVoltageLevel(); + ZZ_U8 GetZeroSensor(); + int GetSafePosition(); + float GetZeroVelocity(); + +private: + bool ParseReturnedString(std::string &strRecv,int iType); + bool ParseReturnedParam(std::string &strRecv); + void VSMD_BitShift(ZZ_U8* src, unValue* dst); + char* VSMD_Split(char* cStr, char cSplit); +}; + diff --git a/othersoft/shuttercali/source/LinearShutter/VSMD12XMiscDefines.h b/othersoft/shuttercali/source/LinearShutter/VSMD12XMiscDefines.h new file mode 100644 index 0000000..92e2ac2 --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/VSMD12XMiscDefines.h @@ -0,0 +1,108 @@ +#pragma once +#include "ZZ_Types.h" +#define MAXBUFFER 10240 +#include +using namespace ZZ_MISCDEF; + +typedef struct tagTransportLayerInfomation +{ + //Serial + int iPortType; + int iPortNumber; + int indexBaudRate; + int iBaudRate; + int indexParity, indexBytesize, indexStopBits; //Mode + bool Hw; + bool Sw; + bool Dtr, Rts; + QString FullPortName; + tagTransportLayerInfomation() { + iPortType = 0; + indexParity = 0; + iPortNumber = 8; + iBaudRate = 9600; + indexBytesize = 3; + indexStopBits = 0; + FullPortName = ""; + } + + //Bit + //Stop + //MODEM CONTROL setting + //MODEM LINE STATUS + + //TCP UDP + +}PortInfo; + +typedef struct tagMotorStatusInfo +{ + float fVelocity; + int iPosition; + ZZ_U32 uiFlags; +}MSInfo; + +typedef struct tagControllerParams +{ + int bdr; //baud + int mcs; //microsteps 0:full 1:half 2:4 3:8 4:16 5:32 6:64 7:128 8:256 + float spd; //velocity + float acc; //acceleration + float dec; //deceleration + float cra; //acc state current + float crn; //normal state current + float crh; //hold state current + ZZ_U8 s1f; + ZZ_U8 s1r; + ZZ_U8 s2f; + ZZ_U8 s2r; + ZZ_U8 zmd; //zero mode + ZZ_U8 osv; //open state sensor value + ZZ_U8 snr; //zero sensor + ZZ_U8 zsp; //zero safe position + float zsd; //zero velocity + tagControllerParams() { + bdr = 9600; + + cra = 0.8; + crh = 0.4; + crn = 0.6; + + acc = 100000; + dec = 100000; + spd = 64000; + + osv = 0; + snr = 0; + zmd = 3; + zsp = 20; + zsd = 50000; + + mcs = 6; + } +}ControllerParams; + +typedef union +{ + ZZ_U8 byteValue[4]; + short i16Value[2]; + ZZ_U16 u16Value[2]; + int i32Value; + float fValue; + ZZ_U32 u32Value; +}unValue; + +enum emVSMDTriggerEvent +{ + NoAction =0, //无动作(只有状态位 S1 变化通知) + ResetZeroPosition, //重新设置原点位置 + DecSpdStop, //减速停止 + DecSpdStopRZP, //减速停止,并在停止后重新设置原点位置 + Stop, //立刻停止 + StopRZP, //立刻停止,并在停止后重新设置原点位置 + RunningPosDirect, //正向连续运转(正速度) + RunningNegDirect, //反向连续运转(负速度) + OfflineModeOn, //离线模式启动 + OfflineModeOff //离线模式停止 +}; + diff --git a/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.cpp b/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.cpp new file mode 100644 index 0000000..d5767ad --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.cpp @@ -0,0 +1,147 @@ +#include "pch.h" +#include "ZZ_SeiralPort.h" + +CZZ_SeiralPort_QT::CZZ_SeiralPort_QT() +{ + m_pSerialPort = new QSerialPort(); +} + +CZZ_SeiralPort_QT::~CZZ_SeiralPort_QT() +{ + if (m_pSerialPort != NULL) + { + delete m_pSerialPort; + } +} + + void CZZ_SeiralPort_QT::InitPort(PortInfo portinfo) +{ + + m_piSettings = portinfo; + + +} + + bool CZZ_SeiralPort_QT::SetPort() + { + bool bRes = true; +// int iRes = sio_ioctl(m_piSettings.iPortNumber, m_piSettings.indexBaudRate, +// m_piSettings.indexParity | m_piSettings.indexBytesize | m_piSettings.indexStopBits); +// if (iRes != SIO_OK) +// { +// bRes = false; +// } + QString qstrPortName; + if (m_piSettings.FullPortName!="") + { + qstrPortName = m_piSettings.FullPortName; + qDebug() << m_piSettings.FullPortName; + } + else { + qstrPortName = QString("COM%1").arg(m_piSettings.iPortNumber); + } + // qstrPortName = "COM4"; + // QString qstrPortName = m_piSettings.FullPortName;//QString("COM%1").arg(m_piSettings.iPortNumber); + m_pSerialPort->setPortName(qstrPortName); + m_pSerialPort->setReadBufferSize(512); + bRes = m_pSerialPort->setBaudRate(m_piSettings.iBaudRate); + return bRes; + } + +bool CZZ_SeiralPort_QT::Open() +{ + bool bRes = true; +// int iRes = sio_open(m_piSettings.iPortNumber); +// if (iRes!=SIO_OK) +// { +// bRes = false; +// } + bRes = m_pSerialPort->open(QIODevice::ReadWrite); + if (!bRes) + { + qDebug() << "Err:open Failed.Exit Code:1"; + //std::cout << "Err.open Failed" << std::endl; + return bRes;; + } + return bRes; +} + +void CZZ_SeiralPort_QT::Close() +{ + m_pSerialPort->close(); +} + +std::string CZZ_SeiralPort_QT::ReadAll(int waite) +{ + if (!m_pSerialPort->waitForReadyRead(waite)) + { + return ""; + + } + if ( + m_pSerialPort->bytesAvailable() == 0 + ) + { + return ""; + } + + qbaRecv.clear(); + + qbaRecv = m_pSerialPort->readAll(); + + + std::string strRet(qbaRecv.constData(), qbaRecv.length()); + return strRet; + +// std::string strRet; +// char cBuf[MAXBUFFER]; +// int iRet = sio_read(m_piSettings.iPortNumber,cBuf, MAXBUFFER); +// if (iRet==0) +// { +// strRet = ""; +// +// } +// else +// { +// char *pRecv = new char[iRet]; +// memcpy(pRecv, cBuf, iRet); +// //std::string strRet(pRecv); +// //delete pRecv; +// //return strRet; +// +// strRet.resize(iRet); +// for (int i=0;iwrite(qbaTest); + m_pSerialPort->waitForBytesWritten(5000); + if (qi64Write != qbaTest.size()) + { + qDebug() << "Err:write Failed.Exit Code:1" << qi64Write; + return qi64Write; + } + + return 0; +// char* pcSend = (char*)strSend.c_str(); +// int iRet = sio_write(m_piSettings.iPortNumber, pcSend, (int)strSend.length()); +// +// //delete pcSend; +// if (iRet!= (int)strSend.length()) +// { +// return iRet; +// } +// else +// { +// return 0; +// } +// //sio_write(); +} diff --git a/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.h b/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.h new file mode 100644 index 0000000..5d7d0f4 --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/ZZ_SeiralPort.h @@ -0,0 +1,26 @@ +#pragma once +#include "VSMD12XMiscDefines.h" +#include "AbstractPort.h" +#include"qobject.h" +class CZZ_SeiralPort_QT :public CAbstractPort,QObject +{ + +private: + PortInfo m_piSettings; + QByteArray qbaSend, qbaRecv; + QSerialPort *m_pSerialPort; +public: + CZZ_SeiralPort_QT(); + virtual ~CZZ_SeiralPort_QT(); +public: + virtual void InitPort(PortInfo portinfo); + virtual bool SetPort(); + virtual bool Open(); + virtual void Close(); + + virtual std::string ReadAll(int waittime = 5000); + + virtual int Write(const std::string strSend); + +}; + diff --git a/othersoft/shuttercali/source/LinearShutter/pch.h b/othersoft/shuttercali/source/LinearShutter/pch.h new file mode 100644 index 0000000..d5ac3af --- /dev/null +++ b/othersoft/shuttercali/source/LinearShutter/pch.h @@ -0,0 +1,28 @@ +#pragma once +#include +////////////////////////////setings +#include +#include +////////////////////////////Basic +#include +#include +#include +#include +#include +////////////////////////////Thread +#include +#include +#include +////////////////////////////json +#include +#include +#include +#include +#include +////////////////////////////time +#include +#include +#include +////////////////////////////Serial I/O +#include +#include \ No newline at end of file diff --git a/othersoft/shuttercali/source/Logger/Logger.h b/othersoft/shuttercali/source/Logger/Logger.h new file mode 100644 index 0000000..cfbcf02 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/DLib/SeaBreeze.dll b/othersoft/shuttercali/source/OSIF/DLib/SeaBreeze.dll new file mode 100644 index 0000000000000000000000000000000000000000..66bc74c7275bdbbb154cba9fe216d8e8b13f5bd0 GIT binary patch literal 2670080 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
      9qc1yVLHuZQ!5 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
      ?GXIP@Gdnui*}?APZoHLr|H)M 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 Dcm#4H$)cUKRFyn6&n|9435ybw%q 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

      T`F08_aG}xDNe*} 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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/othersoft/shuttercali/source/OSIF/include/api/DllDecl.h b/othersoft/shuttercali/source/OSIF/include/api/DllDecl.h new file mode 100644 index 0000000..d141060 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/SeaBreezeWrapper.h b/othersoft/shuttercali/source/OSIF/include/api/SeaBreezeWrapper.h new file mode 100644 index 0000000..da6b94c --- /dev/null +++ b/othersoft/shuttercali/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鈥檚 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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/AcquisitionDelayFeatureAdapter.h new file mode 100644 index 0000000..4964256 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ContinuousStrobeFeatureAdapter.h new file mode 100644 index 0000000..23a106a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DataBufferFeatureAdapter.h new file mode 100644 index 0000000..af1d536 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/DeviceAdapter.h new file mode 100644 index 0000000..7931024 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/EEPROMFeatureAdapter.h new file mode 100644 index 0000000..f64e321 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterInterface.h new file mode 100644 index 0000000..41ad782 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureAdapterTemplate.h new file mode 100644 index 0000000..6bdc267 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/FeatureFamilies.h new file mode 100644 index 0000000..cd18080 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/IrradCalFeatureAdapter.h new file mode 100644 index 0000000..e6180c1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/LightSourceFeatureAdapter.h new file mode 100644 index 0000000..f55ffd4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/NonlinearityCoeffsFeatureAdapter.h new file mode 100644 index 0000000..33b046d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/OpticalBenchFeatureAdapter.h new file mode 100644 index 0000000..4f6eb53 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/PixelBinningFeatureAdapter.h new file mode 100644 index 0000000..7cba13f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ProtocolFamilies.h new file mode 100644 index 0000000..8e0dbd4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RawUSBBusAccessFeatureAdapter.h new file mode 100644 index 0000000..c4e841f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/RevisionFeatureAdapter.h new file mode 100644 index 0000000..d81040f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPI.h new file mode 100644 index 0000000..f0af007 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SeaBreezeAPIConstants.h new file mode 100644 index 0000000..f5abf42 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SerialNumberFeatureAdapter.h new file mode 100644 index 0000000..eb8d2c8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ShutterFeatureAdapter.h new file mode 100644 index 0000000..cf3a65d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrometerFeatureAdapter.h new file mode 100644 index 0000000..2ec42b4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/SpectrumProcessingFeatureAdapter.h new file mode 100644 index 0000000..6ed2264 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrayLightCoeffsFeatureAdapter.h new file mode 100644 index 0000000..54d208b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/StrobeLampFeatureAdapter.h new file mode 100644 index 0000000..e5bd4a0 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/TemperatureFeatureAdapter.h new file mode 100644 index 0000000..7ff3fd0 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h b/othersoft/shuttercali/source/OSIF/include/api/seabreezeapi/ThermoElectricCoolerFeatureAdapter.h new file mode 100644 index 0000000..46813e1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/ByteVector.h b/othersoft/shuttercali/source/OSIF/include/common/ByteVector.h new file mode 100644 index 0000000..8c168ca --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/Data.h b/othersoft/shuttercali/source/OSIF/include/common/Data.h new file mode 100644 index 0000000..ed23c67 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/DoubleVector.h b/othersoft/shuttercali/source/OSIF/include/common/DoubleVector.h new file mode 100644 index 0000000..50c6d35 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/FloatVector.h b/othersoft/shuttercali/source/OSIF/include/common/FloatVector.h new file mode 100644 index 0000000..69b6cb9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/Log.h b/othersoft/shuttercali/source/OSIF/include/common/Log.h new file mode 100644 index 0000000..242f8aa --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/SeaBreeze.h b/othersoft/shuttercali/source/OSIF/include/common/SeaBreeze.h new file mode 100644 index 0000000..aaa1c5e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/U32Vector.h b/othersoft/shuttercali/source/OSIF/include/common/U32Vector.h new file mode 100644 index 0000000..93785b4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/UShortVector.h b/othersoft/shuttercali/source/OSIF/include/common/UShortVector.h new file mode 100644 index 0000000..7606375 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/UnitDescriptor.h b/othersoft/shuttercali/source/OSIF/include/common/UnitDescriptor.h new file mode 100644 index 0000000..3a5c737 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/Bus.h b/othersoft/shuttercali/source/OSIF/include/common/buses/Bus.h new file mode 100644 index 0000000..491604c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/BusFamilies.h b/othersoft/shuttercali/source/OSIF/include/common/buses/BusFamilies.h new file mode 100644 index 0000000..7b77043 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/BusFamily.h b/othersoft/shuttercali/source/OSIF/include/common/buses/BusFamily.h new file mode 100644 index 0000000..d1dbb97 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocationProberInterface.h b/othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocationProberInterface.h new file mode 100644 index 0000000..3cf63e1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocatorInterface.h b/othersoft/shuttercali/source/OSIF/include/common/buses/DeviceLocatorInterface.h new file mode 100644 index 0000000..caccd5f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/TransferHelper.h b/othersoft/shuttercali/source/OSIF/include/common/buses/TransferHelper.h new file mode 100644 index 0000000..8d7988e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h b/othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4NetworkProtocol.h new file mode 100644 index 0000000..d07309d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h b/othersoft/shuttercali/source/OSIF/include/common/buses/network/IPv4SocketDeviceLocator.h new file mode 100644 index 0000000..056fc90 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h b/othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketBus.h new file mode 100644 index 0000000..47dee40 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/common/buses/network/TCPIPv4SocketTransferHelper.h new file mode 100644 index 0000000..d7e4b69 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h b/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232DeviceLocator.h new file mode 100644 index 0000000..1c8c20c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232Interface.h b/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232Interface.h new file mode 100644 index 0000000..fad0b1e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h b/othersoft/shuttercali/source/OSIF/include/common/buses/rs232/RS232TransferHelper.h new file mode 100644 index 0000000..e912f95 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBDeviceLocator.h b/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBDeviceLocator.h new file mode 100644 index 0000000..ea9f1d2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBInterface.h b/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBInterface.h new file mode 100644 index 0000000..0717e9f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/common/buses/usb/USBTransferHelper.h new file mode 100644 index 0000000..ffd0945 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/devices/Device.h b/othersoft/shuttercali/source/OSIF/include/common/devices/Device.h new file mode 100644 index 0000000..2c23100 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusConnectException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusConnectException.h new file mode 100644 index 0000000..134b32e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusException.h new file mode 100644 index 0000000..960ed53 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusTransferException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/BusTransferException.h new file mode 100644 index 0000000..a4be719 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureControlException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureControlException.h new file mode 100644 index 0000000..21b3014 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureException.h new file mode 100644 index 0000000..b0163d4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/FeatureProtocolNotFoundException.h new file mode 100644 index 0000000..654af22 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/IllegalArgumentException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/IllegalArgumentException.h new file mode 100644 index 0000000..aa457b5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/NumberFormatException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/NumberFormatException.h new file mode 100644 index 0000000..0489345 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolBusMismatchException.h new file mode 100644 index 0000000..e593994 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolException.h new file mode 100644 index 0000000..34dcb97 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolFormatException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolFormatException.h new file mode 100644 index 0000000..6067315 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolTransactionException.h b/othersoft/shuttercali/source/OSIF/include/common/exceptions/ProtocolTransactionException.h new file mode 100644 index 0000000..edde640 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/features/Feature.h b/othersoft/shuttercali/source/OSIF/include/common/features/Feature.h new file mode 100644 index 0000000..ad6163c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/features/FeatureFamily.h b/othersoft/shuttercali/source/OSIF/include/common/features/FeatureFamily.h new file mode 100644 index 0000000..66d814e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/features/FeatureImpl.h b/othersoft/shuttercali/source/OSIF/include/common/features/FeatureImpl.h new file mode 100644 index 0000000..8c9349a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/globals.h b/othersoft/shuttercali/source/OSIF/include/common/globals.h new file mode 100644 index 0000000..6195a3d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/Exchange.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/Exchange.h new file mode 100644 index 0000000..785a62c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/Protocol.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/Protocol.h new file mode 100644 index 0000000..a86fc53 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolFamily.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolFamily.h new file mode 100644 index 0000000..987092f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHelper.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHelper.h new file mode 100644 index 0000000..7e4a663 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHint.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/ProtocolHint.h new file mode 100644 index 0000000..5cc2c14 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/Transaction.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/Transaction.h new file mode 100644 index 0000000..f37a529 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/common/protocols/Transfer.h b/othersoft/shuttercali/source/OSIF/include/common/protocols/Transfer.h new file mode 100644 index 0000000..10e6b03 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/Inet4Address.h b/othersoft/shuttercali/source/OSIF/include/native/network/Inet4Address.h new file mode 100644 index 0000000..a52058a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/Socket.h b/othersoft/shuttercali/source/OSIF/include/native/network/Socket.h new file mode 100644 index 0000000..0446b79 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/SocketException.h b/othersoft/shuttercali/source/OSIF/include/native/network/SocketException.h new file mode 100644 index 0000000..f7ef56c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/SocketTimeoutException.h b/othersoft/shuttercali/source/OSIF/include/native/network/SocketTimeoutException.h new file mode 100644 index 0000000..d591778 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/UnknownHostException.h b/othersoft/shuttercali/source/OSIF/include/native/network/UnknownHostException.h new file mode 100644 index 0000000..261f80b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h b/othersoft/shuttercali/source/OSIF/include/native/network/posix/NativeSocketPOSIX.h new file mode 100644 index 0000000..d8715b5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/network/windows/NativeSocketWindows.h b/othersoft/shuttercali/source/OSIF/include/native/network/windows/NativeSocketWindows.h new file mode 100644 index 0000000..c19d0bf --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/rs232/NativeRS232.h b/othersoft/shuttercali/source/OSIF/include/native/rs232/NativeRS232.h new file mode 100644 index 0000000..974d06b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/rs232/RS232.h b/othersoft/shuttercali/source/OSIF/include/native/rs232/RS232.h new file mode 100644 index 0000000..d257efc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h b/othersoft/shuttercali/source/OSIF/include/native/rs232/windows/NativeRS232Windows.h new file mode 100644 index 0000000..75d0e9b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/system/NativeSystem.h b/othersoft/shuttercali/source/OSIF/include/native/system/NativeSystem.h new file mode 100644 index 0000000..b3e34b3 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/system/System.h b/othersoft/shuttercali/source/OSIF/include/native/system/System.h new file mode 100644 index 0000000..757a527 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/usb/NativeUSB.h b/othersoft/shuttercali/source/OSIF/include/native/usb/NativeUSB.h new file mode 100644 index 0000000..ce054c7 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/usb/USB.h b/othersoft/shuttercali/source/OSIF/include/native/usb/USB.h new file mode 100644 index 0000000..70a014f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/usb/USBDiscovery.h b/othersoft/shuttercali/source/OSIF/include/native/usb/USBDiscovery.h new file mode 100644 index 0000000..fda1c0d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/native/usb/winusb/WindowsGUID.h b/othersoft/shuttercali/source/OSIF/include/native/usb/winusb/WindowsGUID.h new file mode 100644 index 0000000..de3d140 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/BlazeTCPIPv4.h new file mode 100644 index 0000000..b1f33e5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/network/JazTCPIPv4.h new file mode 100644 index 0000000..2586c2f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/rs232/OOIRS232Interface.h new file mode 100644 index 0000000..885ba18 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/ApexUSB.h new file mode 100644 index 0000000..82ee675 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSB.h new file mode 100644 index 0000000..0c10e68 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/BlazeUSBTransferHelper.h new file mode 100644 index 0000000..8a915b6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/FlameNIRUSB.h new file mode 100644 index 0000000..1312f92 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000PlusUSB.h new file mode 100644 index 0000000..c52d326 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR2000USB.h new file mode 100644 index 0000000..d1642cf --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/HR4000USB.h new file mode 100644 index 0000000..78a8413 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/JazUSB.h new file mode 100644 index 0000000..db03827 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000ProUSB.h new file mode 100644 index 0000000..95195f6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/Maya2000USB.h new file mode 100644 index 0000000..2c3163f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/MayaLSLUSB.h new file mode 100644 index 0000000..bbeef85 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest256USB.h new file mode 100644 index 0000000..5aefeed --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/NIRQuest512USB.h new file mode 100644 index 0000000..c9b587f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSB4KSpectrumTransferHelper.h new file mode 100644 index 0000000..e7be862 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBControlTransferHelper.h new file mode 100644 index 0000000..9a9564c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBEndpointMaps.h new file mode 100644 index 0000000..a0b8290 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBInterface.h new file mode 100644 index 0000000..f6e84cc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBProductID.h new file mode 100644 index 0000000..996ad15 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBSpectrumTransferHelper.h new file mode 100644 index 0000000..ff08b12 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/OOIUSBTrivialTransferHelper.h new file mode 100644 index 0000000..cb9e897 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QE65000USB.h new file mode 100644 index 0000000..ef24f1f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/QEProUSB.h new file mode 100644 index 0000000..a15af3e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/STSUSB.h new file mode 100644 index 0000000..80cc82b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/SparkUSB.h new file mode 100644 index 0000000..be188b2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/TorusUSB.h new file mode 100644 index 0000000..90b63ef --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000PlusUSB.h new file mode 100644 index 0000000..c360985 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB2000USB.h new file mode 100644 index 0000000..396af57 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/USB4000USB.h new file mode 100644 index 0000000..09993a3 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/buses/usb/VentanaUSB.h new file mode 100644 index 0000000..a750f61 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Apex.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Apex.h new file mode 100644 index 0000000..eb3fa31 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Blaze.h new file mode 100644 index 0000000..20b08d4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/FlameNIR.h new file mode 100644 index 0000000..8e19baa --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000.h new file mode 100644 index 0000000..c614cc3 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR2000Plus.h new file mode 100644 index 0000000..85acf18 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/HR4000.h new file mode 100644 index 0000000..07d9902 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Jaz.h new file mode 100644 index 0000000..3cd3895 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000.h new file mode 100644 index 0000000..7024bc7 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Maya2000Pro.h new file mode 100644 index 0000000..45f29aa --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/MayaLSL.h new file mode 100644 index 0000000..24d57cc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest256.h new file mode 100644 index 0000000..ce6dd2c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/NIRQuest512.h new file mode 100644 index 0000000..8a62761 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QE65000.h new file mode 100644 index 0000000..ddd4c1e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/QEPro.h new file mode 100644 index 0000000..d8bef4d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/STS.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/STS.h new file mode 100644 index 0000000..fad5a7a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Spark.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Spark.h new file mode 100644 index 0000000..ebbf402 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Torus.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Torus.h new file mode 100644 index 0000000..76ace9f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000.h new file mode 100644 index 0000000..1791d44 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB2000Plus.h new file mode 100644 index 0000000..aab3a48 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/USB4000.h new file mode 100644 index 0000000..a9edddb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/devices/Ventana.h new file mode 100644 index 0000000..6bc250b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature.h new file mode 100644 index 0000000..e0bacf3 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeatureInterface.h new file mode 100644 index 0000000..bf7a90a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/AcquisitionDelayFeature_FPGA.h new file mode 100644 index 0000000..c637ee5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/acquisition_delay/STSAcquisitionDelayFeature.h new file mode 100644 index 0000000..c44368e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature.h new file mode 100644 index 0000000..8625b8a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeatureInterface.h new file mode 100644 index 0000000..755c3ca --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/continuous_strobe/ContinuousStrobeFeature_FPGA.h new file mode 100644 index 0000000..1bd3c0c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureBase.h new file mode 100644 index 0000000..928db97 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/DataBufferFeatureInterface.h new file mode 100644 index 0000000..2b086e4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/data_buffer/QEProDataBufferFeature.h new file mode 100644 index 0000000..c9ad005 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeature.h new file mode 100644 index 0000000..4de6785 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureBase.h new file mode 100644 index 0000000..9c274e1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/EEPROMSlotFeatureInterface.h new file mode 100644 index 0000000..7a5f3dc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/NonlinearityEEPROMSlotFeature.h new file mode 100644 index 0000000..db8e6be --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature.h new file mode 100644 index 0000000..5fa8fd6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeatureBase.h new file mode 100644 index 0000000..a56ab41 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_MayaPro.h new file mode 100644 index 0000000..5caf4c5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SaturationEEPROMSlotFeature_NIRQuest.h new file mode 100644 index 0000000..f13391d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/SerialNumberEEPROMSlotFeature.h new file mode 100644 index 0000000..3464d9d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/StrayLightEEPROMSlotFeature.h new file mode 100644 index 0000000..f9bfa70 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature.h new file mode 100644 index 0000000..a256bff --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/eeprom_slots/WavelengthEEPROMSlotFeature_QE65000.h new file mode 100644 index 0000000..a586359 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeature.h new file mode 100644 index 0000000..a29c8bc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/fpga_register/FPGARegisterFeatureInterface.h new file mode 100644 index 0000000..54fa0bc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeature.h new file mode 100644 index 0000000..b85a3c6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/irradcal/IrradCalFeatureInterface.h new file mode 100644 index 0000000..5805481 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureBase.h new file mode 100644 index 0000000..c114c34 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureImpl.h new file mode 100644 index 0000000..cc94855 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/LightSourceFeatureInterface.h new file mode 100644 index 0000000..4a96948 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeature.h new file mode 100644 index 0000000..7f3be9d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/StrobeLampFeatureInterface.h new file mode 100644 index 0000000..b2d7df5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/light_source/VentanaLightSourceFeature.h new file mode 100644 index 0000000..5f440b9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeature.h new file mode 100644 index 0000000..997f678 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/nonlinearity/NonlinearityCoeffsFeatureInterface.h new file mode 100644 index 0000000..c13f551 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeature.h new file mode 100644 index 0000000..4b1fd6f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/optical_bench/OpticalBenchFeatureInterface.h new file mode 100644 index 0000000..b42389a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/PixelBinningFeatureInterface.h new file mode 100644 index 0000000..81e96f6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/pixel_binning/STSPixelBinningFeature.h new file mode 100644 index 0000000..72fb1de --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeature.h new file mode 100644 index 0000000..2e5f91f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/raw_bus_access/RawUSBBusAccessFeatureInterface.h new file mode 100644 index 0000000..0814f81 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeature.h new file mode 100644 index 0000000..bbd3c39 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/revision/RevisionFeatureInterface.h new file mode 100644 index 0000000..28db95d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeature.h new file mode 100644 index 0000000..1b7adb6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/serial_number/SerialNumberFeatureInterface.h new file mode 100644 index 0000000..2597d48 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeature.h new file mode 100644 index 0000000..d0a1b88 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/shutter/ShutterFeatureInterface.h new file mode 100644 index 0000000..5eb35bb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ApexSpectrometerFeature.h new file mode 100644 index 0000000..661a266 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/BlazeSpectrometerFeature.h new file mode 100644 index 0000000..b51fd73 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/FlameNIRSpectrometerFeature.h new file mode 100644 index 0000000..64dda46 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/GainAdjustedSpectrometerFeature.h new file mode 100644 index 0000000..a38b63d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..8d591f1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR2000SpectrometerFeature.h new file mode 100644 index 0000000..c50692a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/HR4000SpectrometerFeature.h new file mode 100644 index 0000000..dad72b0 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/JazSpectrometerFeature.h new file mode 100644 index 0000000..be865fe --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000ProSpectrometerFeature.h new file mode 100644 index 0000000..792625a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/Maya2000SpectrometerFeature.h new file mode 100644 index 0000000..ff2da12 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/MayaLSLSpectrometerFeature.h new file mode 100644 index 0000000..5c73755 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest256SpectrometerFeature.h new file mode 100644 index 0000000..c550920 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuest512SpectrometerFeature.h new file mode 100644 index 0000000..9331054 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/NIRQuestSpectrometerFeature.h new file mode 100644 index 0000000..365a59d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeature.h new file mode 100644 index 0000000..ad2ceae --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/OOISpectrometerFeatureInterface.h new file mode 100644 index 0000000..8d896e7 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeature.h new file mode 100644 index 0000000..bb21810 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureBase.h new file mode 100644 index 0000000..762b7fa --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureImpl.h new file mode 100644 index 0000000..b54a333 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/ProgrammableSaturationFeatureInterface.h new file mode 100644 index 0000000..f4e9893 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QE65000SpectrometerFeature.h new file mode 100644 index 0000000..61f6113 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/QEProSpectrometerFeature.h new file mode 100644 index 0000000..2e4dde6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/STSSpectrometerFeature.h new file mode 100644 index 0000000..6c46dcb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SparkSpectrometerFeature.h new file mode 100644 index 0000000..9d26c0d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/SpectrometerTriggerMode.h new file mode 100644 index 0000000..3a4443c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000PlusSpectrometerFeature.h new file mode 100644 index 0000000..afe62e8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB2000SpectrometerFeature.h new file mode 100644 index 0000000..d470c37 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/USB4000SpectrometerFeature.h new file mode 100644 index 0000000..b43b6ef --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrometer/VentanaSpectrometerFeature.h new file mode 100644 index 0000000..ee24b9e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeature.h new file mode 100644 index 0000000..a41a265 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/spectrum_processing/SpectrumProcessingFeatureInterface.h new file mode 100644 index 0000000..95d1e63 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeature.h new file mode 100644 index 0000000..712c26f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/stray_light/StrayLightCoeffsFeatureInterface.h new file mode 100644 index 0000000..1fbe6d1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeature.h new file mode 100644 index 0000000..c28ac96 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/temperature/TemperatureFeatureInterface.h new file mode 100644 index 0000000..7c8ed22 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/QEProThermoElectricFeature.h new file mode 100644 index 0000000..e73c22d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureBase.h new file mode 100644 index 0000000..70fe887 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricFeatureInterface.h new file mode 100644 index 0000000..bf4771d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/ThermoElectricQEFeature.h new file mode 100644 index 0000000..3dd787c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/thermoelectric/VentanaThermoElectricFeature.h new file mode 100644 index 0000000..a1bf4eb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeature.h new file mode 100644 index 0000000..f2f1c32 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/features/wavecal/WaveCalFeatureInterface.h new file mode 100644 index 0000000..eb2daae --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/AcquisitionDelayProtocolInterface.h new file mode 100644 index 0000000..2ca2ca6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ContinuousStrobeProtocolInterface.h new file mode 100644 index 0000000..966cfc6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/DataBufferProtocolInterface.h new file mode 100644 index 0000000..8f73656 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/EEPROMProtocolInterface.h new file mode 100644 index 0000000..92add4a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/FPGARegisterProtocolInterface.h new file mode 100644 index 0000000..38b92fb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/IrradCalProtocolInterface.h new file mode 100644 index 0000000..d9bbdab --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/LightSourceProtocolInterface.h new file mode 100644 index 0000000..068765f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/NonlinearityCoeffsProtocolInterface.h new file mode 100644 index 0000000..9136e5a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/OpticalBenchProtocolInterface.h new file mode 100644 index 0000000..0ca98f8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/PixelBinningProtocolInterface.h new file mode 100644 index 0000000..19cebeb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ProgrammableSaturationProtocolInterface.h new file mode 100644 index 0000000..ff0d75b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/RevisionProtocolInterface.h new file mode 100644 index 0000000..c8fc925 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SerialNumberProtocolInterface.h new file mode 100644 index 0000000..8124705 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ShutterProtocolInterface.h new file mode 100644 index 0000000..47118c8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrometerProtocolInterface.h new file mode 100644 index 0000000..87c0a10 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/SpectrumProcessingProtocolInterface.h new file mode 100644 index 0000000..a31a93d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrayLightCoeffsProtocolInterface.h new file mode 100644 index 0000000..f5e4acb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/StrobeLampProtocolInterface.h new file mode 100644 index 0000000..d2e10c7 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/TemperatureProtocolInterface.h new file mode 100644 index 0000000..64adf98 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/ThermoElectricProtocolInterface.h new file mode 100644 index 0000000..66e4737 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/interfaces/WaveCalProtocolInterface.h new file mode 100644 index 0000000..47af129 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/constants/OBPMessageTypes.h new file mode 100644 index 0000000..ac5275d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPCommand.h new file mode 100644 index 0000000..bf143c6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobeEnableExchange.h new file mode 100644 index 0000000..ef968bd --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPContinuousStrobePeriodExchange.h new file mode 100644 index 0000000..4a9fcb6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPDataBufferClearExchange.h new file mode 100644 index 0000000..e4dd76c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetAllTemperaturesExchange.h new file mode 100644 index 0000000..5a7b4c2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetBoxcarWidthExchange.h new file mode 100644 index 0000000..c586f7f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferCapacityExchange.h new file mode 100644 index 0000000..006e4d6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferElementCountExchange.h new file mode 100644 index 0000000..7bf4ceb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDataBufferMaximumCapacityExchange.h new file mode 100644 index 0000000..f1bebfc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..0726a85 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetFirmwareRevisionExchange.h new file mode 100644 index 0000000..73ddbcf --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetHardwareRevisionExchange.h new file mode 100644 index 0000000..f24b906 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCalExchange.h new file mode 100644 index 0000000..af9b3ea --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..b8e03c9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetMaxPixelBinningExchange.h new file mode 100644 index 0000000..dd19e5b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffExchange.h new file mode 100644 index 0000000..77f5840 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetNonlinearityCoeffsCountExchange.h new file mode 100644 index 0000000..315e673 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchCoatingExchange.h new file mode 100644 index 0000000..e6964d4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFiberDiameterMicronsExchange.h new file mode 100644 index 0000000..268a2ee --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchFilterExchange.h new file mode 100644 index 0000000..c314138 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchGratingExchange.h new file mode 100644 index 0000000..1bb9b07 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchIDExchange.h new file mode 100644 index 0000000..725430d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSerialNumberExchange.h new file mode 100644 index 0000000..75b862c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetOpticalBenchSlitWidthMicronsExchange.h new file mode 100644 index 0000000..87aa8d6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetPixelBinningExchange.h new file mode 100644 index 0000000..bc1c40b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSaturationExchange.h new file mode 100644 index 0000000..0b7d015 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetScansToAverageExchange.h new file mode 100644 index 0000000..184b91e --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberExchange.h new file mode 100644 index 0000000..62e82e1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetSerialNumberMaximumLengthExchange.h new file mode 100644 index 0000000..25aaa52 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffExchange.h new file mode 100644 index 0000000..d301f3c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetStrayLightCoeffsCountExchange.h new file mode 100644 index 0000000..71d4edf --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureCountExchange.h new file mode 100644 index 0000000..b2aa762 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetTemperatureExchange.h new file mode 100644 index 0000000..8008932 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetThermoElectricTemperatureExchange.h new file mode 100644 index 0000000..dc287ff --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPGetWaveCalExchange.h new file mode 100644 index 0000000..b317dfc --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPIntegrationTimeExchange.h new file mode 100644 index 0000000..d83ab16 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLampEnableCommand.h new file mode 100644 index 0000000..9c376d1 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnableCommand.h new file mode 100644 index 0000000..245109f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceEnabledQuery.h new file mode 100644 index 0000000..82d618c --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityCommand.h new file mode 100644 index 0000000..07eb3e7 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPLightSourceIntensityQuery.h new file mode 100644 index 0000000..e53a3bd --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPMessage.h new file mode 100644 index 0000000..fc6d557 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPQuery.h new file mode 100644 index 0000000..679a860 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..bca0170 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadRawSpectrumExchange.h new file mode 100644 index 0000000..ebc0304 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..c7dc738 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumExchange.h new file mode 100644 index 0000000..cbc564b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPReadSpectrumWithGainExchange.h new file mode 100644 index 0000000..c8488a0 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestBufferedSpectrum32AndMetadataExchange.h new file mode 100644 index 0000000..d5c5992 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestRawSpectrumExchange.h new file mode 100644 index 0000000..596b461 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPRequestSpectrumExchange.h new file mode 100644 index 0000000..6c6fef0 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetAcquisitionDelayExchange.h new file mode 100644 index 0000000..d7aa956 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetBoxcarWidthExchange.h new file mode 100644 index 0000000..5d01977 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDataBufferCapacityExchange.h new file mode 100644 index 0000000..f991292 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetDefaultPixelBinningExchange.h new file mode 100644 index 0000000..95934da --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCalExchange.h new file mode 100644 index 0000000..2bd55db --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetIrradCollectionAreaExchange.h new file mode 100644 index 0000000..289e2f6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetPixelBinningExchange.h new file mode 100644 index 0000000..0f2d6fb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetScansToAverageExchange.h new file mode 100644 index 0000000..d07fd74 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricEnableExchange.h new file mode 100644 index 0000000..f848bed --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPSetThermoElectricSetpointExchange.h new file mode 100644 index 0000000..bef32d9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPShutterExchange.h new file mode 100644 index 0000000..7c56fcf --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTransaction.h new file mode 100644 index 0000000..8238eae --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/exchanges/OBPTriggerModeExchange.h new file mode 100644 index 0000000..620f2db --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPControlHint.h new file mode 100644 index 0000000..81e91c4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/hints/OBPSpectrumHint.h new file mode 100644 index 0000000..34c149f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPAcquisitionDelayProtocol.h new file mode 100644 index 0000000..b26c0e6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPContinuousStrobeProtocol.h new file mode 100644 index 0000000..b0db171 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPDataBufferProtocol.h new file mode 100644 index 0000000..918434b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPIrradCalProtocol.h new file mode 100644 index 0000000..417f63d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol.h new file mode 100644 index 0000000..57c9f44 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPLightSourceProtocol_Ventana.h new file mode 100644 index 0000000..ec8727d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPNonlinearityCoeffsProtocol.h new file mode 100644 index 0000000..eb10f75 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPOpticalBenchProtocol.h new file mode 100644 index 0000000..fa273e8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPPixelBinningProtocol.h new file mode 100644 index 0000000..e890fe6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPProgrammableSaturationProtocol.h new file mode 100644 index 0000000..01525f9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPRevisionProtocol.h new file mode 100644 index 0000000..7f05484 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSerialNumberProtocol.h new file mode 100644 index 0000000..de9dcd6 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPShutterProtocol.h new file mode 100644 index 0000000..2b1a4b2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrometerProtocol.h new file mode 100644 index 0000000..69697d8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPSpectrumProcessingProtocol.h new file mode 100644 index 0000000..e953db4 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrayLightCoeffsProtocol.h new file mode 100644 index 0000000..1ea14c9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPStrobeLampProtocol.h new file mode 100644 index 0000000..9401c99 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPTemperatureProtocol.h new file mode 100644 index 0000000..24b5682 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPThermoElectricProtocol.h new file mode 100644 index 0000000..e5379ac --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OBPWaveCalProtocol.h new file mode 100644 index 0000000..06f7aa5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/obp/impls/OceanBinaryProtocol.h new file mode 100644 index 0000000..294010a --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/FPGARegisterCodes.h new file mode 100644 index 0000000..182890d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/OpCodes.h new file mode 100644 index 0000000..f35331d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/constants/QETECConstants.h new file mode 100644 index 0000000..1be1f3d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterReadExchange.h new file mode 100644 index 0000000..6c26a45 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGARegisterWriteExchange.h new file mode 100644 index 0000000..9cb0ddb --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FPGASpectrumExchange.h new file mode 100644 index 0000000..9baa85b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/FlameNIRSpectrumExchange.h new file mode 100644 index 0000000..2471b7f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/HRFPGASpectrumExchange.h new file mode 100644 index 0000000..e872d76 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/IntegrationTimeExchange.h new file mode 100644 index 0000000..f388edd --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/JazSpectrumExchange.h new file mode 100644 index 0000000..40c83ef --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/MayaProSpectrumExchange.h new file mode 100644 index 0000000..675b77b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/NIRQuestSpectrumExchange.h new file mode 100644 index 0000000..e5af731 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOI2KSpectrumExchange.h new file mode 100644 index 0000000..a6f3c2d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIIrradCalExchange.h new file mode 100644 index 0000000..971aaaa --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIReadIrradCalExchange.h new file mode 100644 index 0000000..c1898e2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/OOIWriteIrradCalExchange.h new file mode 100644 index 0000000..e22e788 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/QESpectrumExchange.h new file mode 100644 index 0000000..5c67535 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadEEPROMSlotExchange.h new file mode 100644 index 0000000..8856a18 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadSpectrumExchange.h new file mode 100644 index 0000000..d711cf9 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECQETemperatureExchange.h new file mode 100644 index 0000000..b36ac61 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/ReadTECTemperatureExchange.h new file mode 100644 index 0000000..0d5aa72 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/RequestSpectrumExchange.h new file mode 100644 index 0000000..c48231f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/StrobeEnableExchange.h new file mode 100644 index 0000000..1e2cc6f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECEnableExchange.h new file mode 100644 index 0000000..09009ae --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TECQEEnableExchange.h new file mode 100644 index 0000000..1267a98 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/TriggerModeExchange.h new file mode 100644 index 0000000..00de06b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/USBFPGASpectrumExchange.h new file mode 100644 index 0000000..ffb9b11 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteEEPROMSlotExchange.h new file mode 100644 index 0000000..3c9d3a8 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECQESetPointExchange.h new file mode 100644 index 0000000..4670365 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/exchanges/WriteTECSetPointExchange.h new file mode 100644 index 0000000..82e077f --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/ControlHint.h new file mode 100644 index 0000000..0123724 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/hints/SpectrumHint.h new file mode 100644 index 0000000..f24c4f5 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/FPGARegisterProtocol.h new file mode 100644 index 0000000..8f9a667 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIEEPROMProtocol.h new file mode 100644 index 0000000..a409a1d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIIrradCalProtocol.h new file mode 100644 index 0000000..012abb2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIProtocol.h new file mode 100644 index 0000000..cac8845 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOISpectrometerProtocol.h new file mode 100644 index 0000000..5b2a30d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOIStrobeLampProtocol.h new file mode 100644 index 0000000..edf1df2 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/protocols/ooi/impls/OOITECProtocol.h new file mode 100644 index 0000000..89e930d --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h b/othersoft/shuttercali/source/OSIF/include/vendors/OceanOptics/utils/Polynomial.h new file mode 100644 index 0000000..5d1ff15 --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/Settings/SystemConfigger.cpp b/othersoft/shuttercali/source/Settings/SystemConfigger.cpp new file mode 100644 index 0000000..46e8800 --- /dev/null +++ b/othersoft/shuttercali/source/Settings/SystemConfigger.cpp @@ -0,0 +1,191 @@ +#include "SystemConfigger.h" + + + ZZ_SysConfigger::ZZ_SysConfigger(QObject *parent /*= nullptr*/) + { +#ifdef _DEBUG + m_qstrDeviceConfigFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/config/DeviceSettings.ini"; + m_qstrJSONConfigFilePath = "E:/WorkSpace/TowerOptoSifAndSpectral/config/config.json"; +#else + m_qstrJSONConfigFilePath = ("/home/data/Setting/config.json"); +#endif // DEBUG + + m_qsDeviceConfig = NULL; + } + + ZZ_SysConfigger::~ZZ_SysConfigger() + { + if (qfJConfig.isOpen()) + { + qfJConfig.close(); + } + } + + int ZZ_SysConfigger::Initialize() + { + //////////////////////////////////////////////////////////////////////////load device settings + using namespace ZZ_MISCDEF; + QMetaEnum enumDeviceModel = QMetaEnum::fromType(); + + if (m_qsDeviceConfig!=NULL) + { + delete m_qsDeviceConfig; + } + m_qsDeviceConfig = new QSettings(m_qstrDeviceConfigFilePath, QSettings::IniFormat); + m_struDeviceContext.ucDeviceNumber = m_qsDeviceConfig->value(QString("DEVICE INFO/TotalSpectrometer"),-1).toInt(); + if (m_struDeviceContext.ucDeviceNumber == -1) + { + qDebug() << "DEVICE INFO TotalSpectrometer Value Err."; + return 3; + } + for (ZZ_U8 i=0;i< m_struDeviceContext.ucDeviceNumber;i++) + { + QString qstrTemp= m_qsDeviceConfig->value(QString("FS%1/Model").arg(i+1), "Null").toString(); + m_struDeviceContext.ucDeviceModel[i]= enumDeviceModel.keysToValue(qstrTemp.toLatin1().data()); + + int iInterface= m_qsDeviceConfig->value(QString("FS%1/Port").arg(i + 1), -2).toInt(); + m_struDeviceContext.iInterface[i] = iInterface; + + qstrTemp = m_qsDeviceConfig->value(QString("FS%1/UID").arg(i + 1), "Null").toString(); + m_struDeviceContext.strSN[i] = qstrTemp.toStdString(); + } + + m_struAcqPosition.iTotalPosition = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/TotalPosition"), -1).toInt(); + if (m_struAcqPosition.iTotalPosition == -1) + { + qDebug() << "LINEAR SHUTTER TotalPosition Value Err."; + return 4; + } + + for (ZZ_U8 i = 0; i < m_struAcqPosition.iTotalPosition; i++) + { + int iPosition = m_qsDeviceConfig->value(QString("LINEAR SHUTTER/Position%1").arg(i), -2).toInt(); + m_struAcqPosition.iPosition[i] = iPosition; + } + + + + //////////////////////////////////////////////////////////////////////////load json settings + qfJConfig.setFileName(m_qstrJSONConfigFilePath); + bool bRes = qfJConfig.open(QIODevice::ReadOnly); + if (!bRes) + { + qDebug() << "QFile open config file Err."; + return 1; + } + + m_qbaJData = qfJConfig.readAll(); + m_qjdJDoc= QJsonDocument::fromJson(m_qbaJData, &m_qjpeJErr); + if (m_qjpeJErr.error != QJsonParseError::NoError) + { + qDebug() << m_qjpeJErr.errorString(); + return 2; + } + m_qjoJObj = m_qjdJDoc.object(); + return 0; + } + + int ZZ_SysConfigger::GetGrabberRunParams(RunTimeGrabberParams &struGrabberRTParams) + { + struGrabberRTParams.atsParams = m_struAcqTime; + struGrabberRTParams.fscParams = m_struDeviceContext; + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_IS1() + { + m_struIS1Info.qstrCalFile_U0 = m_qjoJObj.value("IS1UpCalFile").toString(); + m_struIS1Info.qstrCalFile_D1 = m_qjoJObj.value("IS1DownCalFile1").toString(); + m_struIS1Info.qstrCalFile_D2 = m_qjoJObj.value("IS1DownCalFile2").toString(); + m_struIS1Info.qstrCalFile_D3 = m_qjoJObj.value("IS1DownCalFile3").toString(); + + + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_iSIF() + { + m_struISIFInfo.qstrCalFile_U0 = m_qjoJObj.value("SIFUpCalFile").toString(); + m_struISIFInfo.qstrCalFile_D1 = m_qjoJObj.value("SIFDownCalFile1").toString(); + m_struISIFInfo.qstrCalFile_D2 = m_qjoJObj.value("SIFDownCalFile2").toString(); + m_struISIFInfo.qstrCalFile_D3 = m_qjoJObj.value("SIFDownCalFile3").toString(); + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_System() + { + // QString qstr = m_qjoJObj.value("IntervalTime").toString(); + m_struAcqTime.qtStartTime=QTime::fromString(m_qjoJObj.value("BeginTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStartTime.isValid()) + { + qDebug() << "Invalid BeginTime"; + return 1; + } + +#ifdef _DEBUG + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "ss"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid IntervalTime"; + return 1; + } +#else + m_struAcqTime.qtInterval = QTime::fromString(m_qjoJObj.value("IntervalTime").toString(), "mm"); + if (!m_struAcqTime.qtInterval.isValid()) + { + qDebug() << "Invalid IntervalTime"; + return 1; + } +#endif + + m_struAcqTime.qtStopTime = QTime::fromString(m_qjoJObj.value("EndTime").toString(), "hh:mm"); + if (!m_struAcqTime.qtStopTime.isValid()) + { + qDebug() << "Invalid EndTime"; + return 1; + } + + return 0; + } + + int ZZ_SysConfigger::LoadSettingsFromFile_MISC() + { + m_struEC.qstrLocation = m_qjoJObj.value("Location").toString(); + m_struEC.qstrGPS_Altitude = m_qjoJObj.value("GPS_Altitude").toString(); + m_struEC.qstrGPS_Latitude = m_qjoJObj.value("GPS_Latitude").toString(); + m_struEC.qstrGPS_Longtitude = m_qjoJObj.value("GPS_Longtitude").toString(); + m_struEC.qstrGPS_North = m_qjoJObj.value("GPS_North").toString(); + + m_struMEC.qstrInstallationTime = m_qjoJObj.value("InstallationTime").toString(); + m_struMEC.qstrISIFCalibrationTime = m_qjoJObj.value("ISIFCalibrationTime").toString(); + m_struMEC.qstrIS1CalibrationTime = m_qjoJObj.value("IS1CalibrationTime").toString(); + m_struMEC.qstrNameOfMaintenanceStaff = m_qjoJObj.value("NameOfMaintenanceStaff").toString(); + m_struMEC.qstrPhoneNumberOfMaintenanceStaff = m_qjoJObj.value("PhoneNumberOfMaintenanceStaff").toString(); + m_struMEC.qstrDownloadUserID = m_qjoJObj.value("DownloadUserID").toString(); + m_struMEC.qstrDownlaodAddress = m_qjoJObj.value("DownlaodAddress").toString(); + + + + return 0; + } + + int ZZ_SysConfigger::LoadSettings_Test() + { + QFile qfTest(m_qstrJSONConfigFilePath); + + qfTest.open(QFile::ReadOnly); + + QByteArray qbJData = qfTest.readAll(); + + QJsonParseError jerr; + QJsonDocument jdoc(QJsonDocument::fromJson(qbJData, &jerr)); + if (jerr.error!= QJsonParseError::NoError) + { + qDebug() << jerr.errorString(); + } + + QJsonObject rootobj = jdoc.object(); + QStringList key = rootobj.keys(); + QString qtest1 = rootobj.value(rootobj.keys().at(15)).toString(); + return 0; + } diff --git a/othersoft/shuttercali/source/Settings/SystemConfigger.h b/othersoft/shuttercali/source/Settings/SystemConfigger.h new file mode 100644 index 0000000..6f237a2 --- /dev/null +++ b/othersoft/shuttercali/source/Settings/SystemConfigger.h @@ -0,0 +1,57 @@ +#pragma once +#include "pch.h" +#include "ZZ_Types.h" +using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; +using namespace ZZ_MISCDEF::ZZ_DATAFILE; + +class ZZ_SysConfigger :public QObject +{ + Q_OBJECT + +public: + ZZ_SysConfigger(QObject *parent = nullptr); + virtual ~ZZ_SysConfigger(); +public: + int Initialize(); + int GetGrabberRunParams(RunTimeGrabberParams &struGrabberRTParams); + + int LoadSettingsFromFile_IS1(); + int LoadSettingsFromFile_iSIF(); + int LoadSettingsFromFile_System(); + int LoadSettingsFromFile_MISC(); + int LoadSettings_Test(); +public: + enum ConfiggerDeviceModel + { + OSIFAlpha = 0, + OSIFBeta, + ISIF, + IS1, + IS2, + Null + }; + Q_ENUM(ConfiggerDeviceModel); + //////////////////////////////////////////////////////////////////////////run-time settings + AcqTimeSettings m_struAcqTime; + FSContext m_struDeviceContext; + AcqPosSettings m_struAcqPosition; + ////////////////////////////////////////////////////////////////////////// + EContext m_struEC; + MEContext m_struMEC; + IS1Info m_struIS1Info; + ISIFInfo m_struISIFInfo; + +private: + QString m_qstrDeviceConfigFilePath; + QString m_qstrJSONConfigFilePath; + QFile qfJConfig/*,qfDeviceConfig*/; + QSettings *m_qsDeviceConfig; + + QByteArray m_qbaJData; + QJsonParseError m_qjpeJErr; + QJsonObject m_qjoJObj; + QJsonDocument m_qjdJDoc; + + + +}; \ No newline at end of file diff --git a/othersoft/shuttercali/source/Thread/AbstractFSController.cpp b/othersoft/shuttercali/source/Thread/AbstractFSController.cpp new file mode 100644 index 0000000..8aebeed --- /dev/null +++ b/othersoft/shuttercali/source/Thread/AbstractFSController.cpp @@ -0,0 +1,74 @@ +#include "AbstractFSController.h" +CAbstractFSController::CAbstractFSController(QObject* parent /*= nullptr*/) +{ + m_pFSCtrl = NULL; + m_iThreadID = -1; +} + +CAbstractFSController::~CAbstractFSController() +{ + if (m_pFSCtrl!= 0 ) + { + delete m_pFSCtrl; + } +} + +int CAbstractFSController::SetRunParas(int iThreadID, FSInfo fsInfo) +{ + m_iThreadID = iThreadID; + m_fsInfo = fsInfo; + return 0; +} + + + +int CAbstractFSController::InitializeFSControl() +{ + using namespace ZZ_MISCDEF::IRIS; + if (m_iThreadID == -1/*|| m_iDeviceType == -1*/) + { + qDebug() << "Params Err. Call SetRunParas first"; + return 1; + } + switch (m_fsInfo.ucDeviceModel) + { + case DeviceModel::OSIFAlpha: + + break; + case DeviceModel::OSIFBeta: + break; + case DeviceModel::ISIF: + m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; + m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + break; + case DeviceModel::IS1: + m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; + m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + break; + case DeviceModel::IS2: + m_pFSCtrl = new ZZ_ATPControl_Serial_Qt; + m_pFSCtrl->Initialize(false, m_fsInfo.iInterface, NULL); + break; + default: + break; + } + return 0; +} + +int CAbstractFSController::StartAcquisition() +{ + // + qDebug() << "Starting acq" << " Thread ID:" << m_iThreadID; + QThread::msleep(5000); + qDebug() << "Stop acq" << " Thread ID:" << m_iThreadID; + emit SignalAcqFinished(m_iThreadID, 1); + return 0; +} + +int CAbstractFSController::StopAcquisition() +{ + + return 0; +} + + diff --git a/othersoft/shuttercali/source/Thread/AbstractFSController.h b/othersoft/shuttercali/source/Thread/AbstractFSController.h new file mode 100644 index 0000000..0788356 --- /dev/null +++ b/othersoft/shuttercali/source/Thread/AbstractFSController.h @@ -0,0 +1,38 @@ +#pragma once +#include "pch.h" +#include "ATPControl_Serial_QT.h" +#include + +typedef struct tagFSInfo +{ + ZZ_U8 ucDeviceModel; + int iInterface; + std::string strSN; +}FSInfo; + +class CAbstractFSController :public QObject +{ + Q_OBJECT +public: + CAbstractFSController(QObject* parent = nullptr); + virtual ~CAbstractFSController(); +public: + //call first + virtual int SetRunParas(int iThreadID, FSInfo fsInfo); + + //create derived class from base class + virtual int InitializeFSControl(); + +private: + CIrisFSBase *m_pFSCtrl; + int m_iThreadID; + FSInfo m_fsInfo; + +public slots: + virtual int StartAcquisition(); + virtual int StopAcquisition(); + +signals: + void SignalAcqStarted(); + void SignalAcqFinished(int iThreadID, int iFlagStatus); +}; \ No newline at end of file diff --git a/othersoft/shuttercali/source/Thread/MainDataGrabber.cpp b/othersoft/shuttercali/source/Thread/MainDataGrabber.cpp new file mode 100644 index 0000000..21e77ee --- /dev/null +++ b/othersoft/shuttercali/source/Thread/MainDataGrabber.cpp @@ -0,0 +1,140 @@ +#include "MainDataGrabber.h" + +CMainDataGrabber::CMainDataGrabber(QObject* parent /*= nullptr*/) +{ + m_piFlagCaptureThreadStatus = NULL; +} + +CMainDataGrabber::~CMainDataGrabber() +{ + if (m_pControlThread.size() != 0) + { + for (int i=0;i< m_pControlThread.size();i++) + { + delete m_pControlThread[i]; + } + } + m_pControlThread.clear(); + + if (m_piFlagCaptureThreadStatus!=NULL) + { + delete m_piFlagCaptureThreadStatus; + } +} + +int CMainDataGrabber::SetGrabberParams(RunTimeGrabberParams struGrabberRTParams) +{ + m_struAcqTime = struGrabberRTParams.atsParams; + m_struDeviceContext = struGrabberRTParams.fscParams; + m_iTotalThreads = m_struDeviceContext.ucDeviceNumber; + return 0; +} + +int CMainDataGrabber::InitThreadStatus() +{ + if (m_piFlagCaptureThreadStatus!=NULL) + { + delete m_piFlagCaptureThreadStatus; + } + m_piFlagCaptureThreadStatus = new int[m_iTotalThreads]; + for (int i = 0; i < m_iTotalThreads; i++) + { + m_piFlagCaptureThreadStatus[i] = 0; + } + return 0; +} + +int CMainDataGrabber::InitializeWorkers() +{ + for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) + { + m_piFlagCaptureThreadStatus[i] = 0; + + FSInfo fsInfo; + fsInfo.iInterface = m_struDeviceContext.iInterface[i]; + fsInfo.ucDeviceModel = m_struDeviceContext.ucDeviceModel[i]; + fsInfo.strSN = m_struDeviceContext.strSN[i]; + + CAbstractFSController* m_pWorkThread = new CAbstractFSController; + m_pWorkThread->SetRunParas(i, fsInfo); + //m_pWorkThread->InitializeFSControl(); + m_pControlThread.push_back(m_pWorkThread); + } + return 0; +} + +int CMainDataGrabber::StartWorkers() +{ + + for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) + { + QThread *pWorkThreadHolder = new QThread(); + m_pControlThread[i]->moveToThread(pWorkThreadHolder); + pWorkThreadHolder->start(); + } + + return 0; +} + +int CMainDataGrabber::SetupMsgPipelines() +{ + //connect(this, &CMainDataGrabber::SignalStartGrabOnce, this, &CMainDataGrabber::StartGrab); + + for (ZZ_U8 i = 0; i < m_struDeviceContext.ucDeviceNumber; i++) + { + connect(this, &CMainDataGrabber::SignalStartGrabOnce, m_pControlThread[i], &CAbstractFSController::StartAcquisition); + connect(m_pControlThread[i], &CAbstractFSController::SignalAcqFinished, this, &CMainDataGrabber::HandleThreadEvent); + } + + connect(this, &CMainDataGrabber::SignalGrabOnceFinished, this, &CMainDataGrabber::GrabFinished); + + return 0; +} + +int CMainDataGrabber::HandleThreadEvent(int iThreadID, int iFlagStatus) +{ + m_piFlagCaptureThreadStatus[iThreadID] = iFlagStatus; + + bool bFinished = true; + for (int i = 0; i < m_iTotalThreads; i++) + { + if (m_piFlagCaptureThreadStatus[i] != 1) + { + bFinished = false; + break; + } + } + + if (bFinished) + { + emit SignalGrabOnceFinished(); + } + return 0; +} + +int CMainDataGrabber::StartGrab() +{ + m_iFlagIsCapturing = true; + emit SignalStartGrabOnce(); + while (m_iFlagIsCapturing) + { + QThread::msleep(1000); + } + + m_iFlagIsCapturing = true; + InitThreadStatus(); + emit SignalStartGrabOnce(); + while (m_iFlagIsCapturing) + { + QThread::msleep(1000); + } + qDebug() << "Allgrab stopped" << " Thread ID:" <<2; + return 0; +} + +int CMainDataGrabber::GrabFinished() +{ + m_iFlagIsCapturing = false; + return 0; +} + diff --git a/othersoft/shuttercali/source/Thread/MainDataGrabber.h b/othersoft/shuttercali/source/Thread/MainDataGrabber.h new file mode 100644 index 0000000..3d3abb2 --- /dev/null +++ b/othersoft/shuttercali/source/Thread/MainDataGrabber.h @@ -0,0 +1,48 @@ +#pragma once +#include"pch.h" +#include +#include "AbstractFSController.h" + +using namespace std; +using namespace ZZ_MISCDEF::ZZ_RUNPARAMS; + +class CMainDataGrabber :public QObject +{ + Q_OBJECT +public: + CMainDataGrabber(QObject* parent = nullptr); + ~CMainDataGrabber(); + +private: + vector m_pControlThread; + vector m_pqThreadHolder; + + int *m_piFlagCaptureThreadStatus; + int m_iTotalThreads; + + int m_iFlagIsCapturing; + + AcqTimeSettings m_struAcqTime; + FSContext m_struDeviceContext; + +public: + //Call this first + int SetGrabberParams(RunTimeGrabberParams struGrabberRTParams); + + int InitThreadStatus(); + int InitializeWorkers(); + int StartWorkers(); + + int SetupMsgPipelines(); + +public slots: + int HandleThreadEvent(int iThreadID, int iFlagStatus); + int StartGrab(); + int GrabFinished(); + +signals: + void SignalStartGrabOnce(); + void SignalStopGrab(); + void SignalGrabOnceFinished(); + void SignalStartGrab(); +}; \ No newline at end of file diff --git a/othersoft/shuttercali/source/ZZ_SDK/ZZ_Math_HDRONLY.h b/othersoft/shuttercali/source/ZZ_SDK/ZZ_Math_HDRONLY.h new file mode 100644 index 0000000..d57693b --- /dev/null +++ b/othersoft/shuttercali/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/othersoft/shuttercali/source/pch.h b/othersoft/shuttercali/source/pch.h new file mode 100644 index 0000000..d5ac3af --- /dev/null +++ b/othersoft/shuttercali/source/pch.h @@ -0,0 +1,28 @@ +#pragma once +#include +////////////////////////////setings +#include +#include +////////////////////////////Basic +#include +#include +#include +#include +#include +////////////////////////////Thread +#include +#include +#include +////////////////////////////json +#include +#include +#include +#include +#include +////////////////////////////time +#include +#include +#include +////////////////////////////Serial I/O +#include +#include \ No newline at end of file diff --git a/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.cpp b/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.cpp new file mode 100644 index 0000000..58069ad --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.cpp @@ -0,0 +1,82 @@ +#include "OptoSkyManager.h" + +OptoSkyManager::OptoSkyManager(QObject *parent) + : QObject(parent) +{ +} + +OptoSkyManager::~OptoSkyManager() +{ +} + +void OptoSkyManager::optall() +{ + +} + +void OptoSkyManager::getdata() +{ + +} + +void OptoSkyManager::readconnect() +{ + +} + +void OptoSkyManager::loadtcp() +{ + +} + +bool OptoSkyManager::readbutdonothing(int size) +{ + return true; +} + +bool OptoSkyManager::reloadtcp() +{ + return true; +} + +void OptoSkyManager::ChangeArrEnding(float *data, int lenth) +{ + +} + +void OptoSkyManager::conecet() +{ + +} + +void OptoSkyManager::sendMessage() +{ + +} + +void OptoSkyManager::onReciveData() +{ + +} + +void OptoSkyManager::sendgotdata() +{ + +} + +void OptoSkyManager::ComFromUI(QString commom) +{ + +} + +void OptoSkyManager::ondisconnect() +{ + +} + +void OptoSkyManager::ReadError(QAbstractSocket::SocketError) +{ + +} + + diff --git a/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.h b/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.h new file mode 100644 index 0000000..f2cafed --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/OptoSkyManager.h @@ -0,0 +1,50 @@ +#pragma once + +#include +#include "QtEndian" +#include "QTimer" +#include "QTcpSocket" +class OptoSkyManager : public QObject +{ + Q_OBJECT + +public: + OptoSkyManager(QObject *parent); + ~OptoSkyManager(); + void optall(); + void getdata(); + void readconnect(); + QString actionmod; + QTimer *timer; + int waittime; + int temp1, temp2; + void loadtcp(); + bool isreadtogotdata; + bool readbutdonothing(int size); + bool reloadtcp(); + float darkarry[2151]; + int flatwite; + int flatdark; + QString processstr; + QString IP_Address; + int SampleAverage; + int WhiteReferenceAverage; + int DarkCurrentAverage; + +private: + void ChangeArrEnding(float *data, int lenth); +public slots: + void conecet(); + void sendMessage(); + void onReciveData(); + void sendgotdata(); + void ComFromUI(QString commom); + /* void gotdata();*/ + void ondisconnect(); + void ReadError(QAbstractSocket::SocketError); + + +signals: + void Senddatatoui(QString datatype, QByteArray data); + void UpdataProcessBar(QString str, int val); +}; diff --git a/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.cpp b/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.cpp new file mode 100644 index 0000000..e41b7bc --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.cpp @@ -0,0 +1,204 @@ +#include "OptoSkyType.h" +#include +#include +#include "QTime" +#include "logout.h" +QSerialPort *optoskyserial = nullptr; +bool IsOptoskyinit = false; +#include"qdebug.h" +void OptoSky::SetPortName(QString comname, qint32 bandrate) +{ + + QSerialPortInfo info; + QList infos = QSerialPortInfo::availablePorts(); + int i = 0; + qDebug() << comname; + foreach(info, infos) { + if (info.portName() == comname) break; + qDebug() << info.portName(); + i++; + } + if (i != infos.size()) + { + if (optoskyserial == nullptr) + { + optoskyserial = new QSerialPort; + } + optoskyserial->close(); + optoskyserial->setPort(info); + optoskyserial->open(QIODevice::ReadWrite); + qint32 b = bandrate; + optoskyserial->setBaudRate(b); + } + else + { + IsOptoskyinit = false; + return; + } + IsOptoskyinit = true; + +} + +void OptoSky::closeport() +{ + if (optoskyserial!=nullptr) + { + delete optoskyserial; + optoskyserial = nullptr; + } +} + +void OptoSky::SendComment(QByteArray Comment) +{ + unsigned short lenth = Comment.size() + 3; + QByteArray header; + header.resize(4); + header[0] = 0xaa; + header[1] = 0x55; + header[2] = lenth / 256; + header[3] = lenth % 256; + header.append(Comment); + int sum = 0; + for (int i = 0; i < lenth-1; i++) + { + sum = sum +header[i+2]; + } + header.append(sum % 256); + if (IsOptoskyinit) + { + optoskyserial->readAll(); + optoskyserial->write(header); + optoskyserial->waitForBytesWritten(200); + + } + //char *a = header.data(); + //int c=sizeof(header); + +} + +bool OptoSky::GetReturn(char id, QByteArray &data) +{ + QByteArray b; + b.append(id); + return GetReturn(b, data); +} + +bool OptoSky::GetReturn(QByteArray &data) +{ + data.clear(); + + data = optoskyserial->readAll(); + QTime time; + time.start(); +lable1: + while (data.size() < 5) + { + optoskyserial->waitForReadyRead(50); + QByteArray tempbuf = optoskyserial->readAll(); + data.append(tempbuf); + + if (time.elapsed() > 50000) + { + logout::out("long time no data retrun "); + return false; + + } + } + if ((unsigned char)data[0] != 0xaa || (unsigned char)data[1] != 0x55) + { + data.remove(0, 1); + goto lable1; + } + + int datalenth = data[2] * 256 + data[3] + 2; + + while (data.size() < datalenth) + { + optoskyserial->waitForReadyRead(50); + data.append(optoskyserial->readAll()); + + if (time.elapsed() > 50000) + { + logout::out("long time no data retrun " ); + return false; + + } + } + + if (data.size() > datalenth) + { + data.remove(datalenth - 1, data.size() - datalenth); + } + int checkleth = datalenth - 3; + unsigned int checknum = 0; + for (size_t i = 0; i < checkleth; i++) + { + + checknum = checknum + data.at(i + 2); + } + checknum = checknum % 256; + if (checknum != (unsigned char)data[data.size() - 1]) + { + logout::out("checkerro " ); + data.clear(); + return false; + } + return true; + +} + +bool OptoSky::GetReturn(QByteArray id, QByteArray &data) +{ + if (!GetReturn(data)) + { + return false; + } + + if (data[4]!=id[0]) + { + logout::out("retrun is not correct with ComId:" + QString::number(id[0], 16)); + return false;//如果返回不是需要的则返回错误 + } + + RemoveHeaderandEnd(data); + return true; + +} + +void OptoSky::SendComment(char comid, QByteArray Data) +{ + QByteArray tem; + tem.append(comid); + tem.append(Data); + SendComment(tem); +} + +void OptoSky::SendComment(char com) +{ + QByteArray temp; + temp.append(com); + SendComment(temp); +} + +bool OptoSky::isSensorInit() +{ + return IsOptoskyinit; +} + +void OptoSky::RemoveHeaderandEnd(QByteArray &buf) +{ + if (buf.size() < 6) + { + return; + } + buf.remove(0, 5); + buf.remove(buf.size() - 1, 1); +} + +void OptoSky::SendComment(QByteArray Comment, QByteArray Data) +{ + Comment.append(Data); + SendComment(Comment); +} + + diff --git a/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.h b/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.h new file mode 100644 index 0000000..b71044a --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/OptoSkyType.h @@ -0,0 +1,77 @@ +#pragma once +/****************************************************** +* 文件名 : OptoSkyType.h +* 类名 : +* 作用 : +* 作者 : xin +* 邮箱 : renlixin@iris-rs.cn +* 日期 : 2021-2-22 +******************************************************** +* * +* _ooOoo_ * +* o8888888o * +* 88" . "88 * +* (| -_- |) * +* O\ = /O * +* ____/`---'\____ * +* .' \\| |// `. * +* / \\||| : |||// \ * +* / _||||| -:- |||||- \ * +* | | \\\ - /// | | * +* | \_| ''\---/'' | | * +* \ .-\__ `-` ___/-. / * +* ___`. .' /--.--\ `. . __ * +* ."" '< `.___\_<|>_/___.' >'"". * +* | | : `- \`.;`\ _ /`;.`/ - ` : | | * +* \ \ `-. \_ __\ /__ _/ .-` / / * +* ======`-.____`-.___\_____/___.-`____.-'====== * +* `=---=' * +* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * +* 佛祖保佑 长发永存 * +* * +********************************************************/ + + + +#include "QByteArray" +#include"QString" +#define GET_MODEBOARD_TEMP 0x01 +#define GET_PN_NUMBER 0x03 +#define GET_SN_NUMBER 0x04 +#define GET_MANUFACTURE_DATA 0x06 +#define GET_MANUFACTOR_INFO 0x09 +#define GET_PIXEL_LENGTH 0x0a +#define GET_TEC_TEMP 0x13 +#define SET_TEC_TEMP 0x12 +#define GET_OPTICFLAT_TEMP 0x35 +#define GET_CIRCUIT_BOARD_TEMP 0x36 +#define SET_INTEGRAL_TIME 0x14 +#define GET_INTEGRAL_TIME 0x41 +#define GET_MAX_INTEGRAL_TIME 0x42 +#define GET_MIN_INTEGRAL_TIME 0x43 +#define ASYNCHRONOUS_COLLECT_DARK 0x23 +#define ASYNCHRONOUS_START_COLLECTION 0x16 +#define ASYNCHRONOUS_READ_DATA 0x17 +#define SET_AVERAGE_NUMBER 0x28 +#define SYNCHRONIZATION_GET_DATA 0x1e +#define SYNCHRONIZATION_GET_DARK 0x2f +#define EXTERNAL_TRIGGER_ENABLE 0x1f +#define SET_XENON_LAMP_DELAY_TIME 0x24 +#define GET_WAVELENGTH_CALIBRATION_COFF 0x55 +#define GET_STAT_OF_LAMPOUT 0x60 +#define SET_GPIO 0x61 +namespace OptoSky +{ + +void SetPortName(QString comname, qint32 bandrate=115200); +void closeport(); +void SendComment(QByteArray Comment); +void SendComment(char comid); +void SendComment(QByteArray Comment, QByteArray Data); +bool GetReturn(QByteArray id, QByteArray &data); +bool GetReturn(char id, QByteArray &data); +bool GetReturn(QByteArray &data); +void SendComment(char comid, QByteArray Data); +bool isSensorInit(); +void RemoveHeaderandEnd(QByteArray &buf); +} \ No newline at end of file diff --git a/othersoft/shuttercali/source_rlx/sensor/OptoskyCommunicater.cpp b/othersoft/shuttercali/source_rlx/sensor/OptoskyCommunicater.cpp new file mode 100644 index 0000000..e69de29 diff --git a/othersoft/shuttercali/source_rlx/sensor/SeaBreeze.dll b/othersoft/shuttercali/source_rlx/sensor/SeaBreeze.dll new file mode 100644 index 0000000000000000000000000000000000000000..607b18d19fa7c2ef50fbd0401da3e872baf2df73 GIT binary patch literal 2671104 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 Fq4=rb!*-ozmDg$iOP6L8 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

          (%+@KPpdaJyjKAeV8xZkD<*6_1gGG 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

          *uthciNlrM!ntm+vmL)Z&?@t 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 literal 0 HcmV?d00001 diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorBase.cpp b/othersoft/shuttercali/source_rlx/sensor/SensorBase.cpp new file mode 100644 index 0000000..92f3143 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorBase.cpp @@ -0,0 +1,14 @@ + +#include "SensorBase.h" + + + +SensorBase::SensorBase() + +{ + SensorInfo.isSensorInit = false; +} + +SensorBase::~SensorBase() +{ +} diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorBase.h b/othersoft/shuttercali/source_rlx/sensor/SensorBase.h new file mode 100644 index 0000000..6c89081 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorBase.h @@ -0,0 +1,132 @@ +#pragma once + +#include +/****************************************************** +* 文件名 : SensorBase.cpp +* 类名 : 设备基类 +* 作用 : +* 作者 : xin +* 邮箱 : renlixin@iris-rs.cn +* 日期 : 2021-1-15 +******************************************************** +* * +* _ooOoo_ * +* o8888888o * +* 88" . "88 * +* (| -_- |) * +* O\ = /O * +* ____/`---'\____ * +* .' \\| |// `. * +* / \\||| : |||// \ * +* / _||||| -:- |||||- \ * +* | | \\\ - /// | | * +* | \_| ''\---/'' | | * +* \ .-\__ `-` ___/-. / * +* ___`. .' /--.--\ `. . __ * +* ."" '< `.___\_<|>_/___.' >'"". * +* | | : `- \`.;`\ _ /`;.`/ - ` : | | * +* \ \ `-. \_ __\ /__ _/ .-` / / * +* ======`-.____`-.___\_____/___.-`____.-'====== * +* `=---=' * +* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * +* 佛祖保佑 长发永存 * +* * +********************************************************/ +///一组数据 可以delete +enum emDataType +{ + DNVALUE=1, + REFVALUE=2, + DARKNESS=3 +}; +struct STROnePlot +{ + long BandNum; + float *Plot; + bool isInit; + float temp; + float shutter; + QStringList wavelenthlist; + long maxDNvalue; + bool hasDarkCorrect; + emDataType DataType; + STROnePlot() { + BandNum = 0; + isInit = false; + hasDarkCorrect = false; + Plot = nullptr; + DataType = DNVALUE; + } + ~STROnePlot() { + if (!isInit) + { + delete[] Plot; + isInit = false; + } + + } + +}; +struct STRSensorInfo +{ + QString SensorName; + long maxValue; + long BandNum; + QString WavelenthStr; + QStringList wavelenthlist; + //double *wavelenth; + bool isSensorInit; + QString serialnumber; + +}; + +class SensorBase : public QObject +{ + Q_OBJECT + +public: + SensorBase(); + virtual ~SensorBase(); + //************************************ + // Method: 初始化传感器 + // FullName: SensorBase::initSensor + // Access: virtual public + // Returns: void + // Qualifier: + //************************************ + virtual bool initSensor(int id=0)=0; + //************************************ + // Method: Settingshuttertime 设置积分时间 + // FullName: SensorBase::Settingshuttertime + // Access: virtual public + // Returns: void + // Qualifier: + // Parameter: int msc + //************************************ + virtual void Settingshuttertime(float msc)=0; + //************************************ + // Method: SettingTemprature 设置温度 + // FullName: SensorBase::SettingTemprature + // Access: virtual public + // Returns: void + // Qualifier: + // Parameter: float temp + //************************************ + virtual void SettingTemprature(float temp)=0; + virtual float GettingTempratrue() = 0; + virtual STRSensorInfo GetSensorInfo()=0; + virtual void SettingShutterOpen(bool isopen)=0; + virtual void SettingSwitchShutter(bool isright)=0; + virtual void GetOnePlot(STROnePlot &OnePlot,bool Dark=false)=0; + virtual void CloseSensor()=0; + + virtual void GetOneDark(STROnePlot &darkplot) = 0; + + + + QString SensorType; + int Sensorid; + STRSensorInfo SensorInfo; + STROnePlot DarkNess; + +}; diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorMannager.cpp b/othersoft/shuttercali/source_rlx/sensor/SensorMannager.cpp new file mode 100644 index 0000000..5da4026 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorMannager.cpp @@ -0,0 +1,238 @@ +#include "SensorMannager.h" +#include "SensorQExPRO.h" +#include +#include "logout.h" +#include "QDateTime" +#include "QLocale" +#include"SensorOptoSky.h" +int maxtime = 30000; +SensorMannager::SensorMannager(QObject *parent ) + : QObject(parent) +{ + + Numberofscan = 5; + //Sensor = new SensorQExPRO(QEPRO_QE); + Sensor = new SensorOptoSky(ATP6500,"COM12"); + Sensor->initSensor(); +} + +SensorMannager::~SensorMannager() +{ + delete Sensor; + logout::out("退出",1); + +} + +void SensorMannager::opensensor() +{ + Sensor->initSensor(); +} + +void SensorMannager::CloseSensor() +{ + Sensor->CloseSensor(); +} + +long SensorMannager::SensorOpt(int persent) +{ + long maxvalue = Sensor->SensorInfo.maxValue*1.0*persent / 100; + STROnePlot plot; + long maxvaluenow = 0; + float shutternow = 10; + if (Sensor->SensorType=="USB2000PLUS") + { + // shutternow = 1; + } + + Sensor->Settingshuttertime(shutternow); + + Sensor->GetOnePlot(plot); + if (!plot.isInit) + { + return -1; + } + maxvaluenow = Getmaxvalue(plot.Plot,4, plot.BandNum-4); + logout::out("自动曝光为: " + QString::number(shutternow) + " 毫秒 最大值为" + QString::number(maxvaluenow),1); + //QThread::msleep(1000); + int numberoftry = 0; + while (maxvaluenowmaxvalue) + { + + if (maxvaluenow > maxvalue) + { + shutternow = shutternow *0.9; + } + else + { + shutternow = maxvalue * 0.98 / (maxvaluenow * 1.0)*shutternow + 1; + } + if (shutternow>maxtime) + { + shutternow = maxtime; + } + //QThread::msleep(100); + Sensor->Settingshuttertime(shutternow); + Sensor->GetOnePlot(plot); + if (plot.isInit) + { + maxvaluenow = Getmaxvalue(plot.Plot, 4, plot.BandNum - 4); + + } + + + numberoftry++; + + logout::out("自动曝光为: " + QString::number(shutternow) + " 毫秒 最大值为"+QString::number(maxvaluenow),1); + if (numberoftry>200) + { + logout::out("曝光尝试次数过多 曝光失败",3); + return -1; + + } + if (shutternow == maxtime) + { + logout::out("曝光时间达到最大允许时间",3); + return -1*maxtime; + } + + } + logout::out("曝光成功 曝光时间为: "+QString::number(shutternow)+" 毫秒",1); + return shutternow; + +} + +long SensorMannager::Getmaxvalue(float *arr, int start, int lenth) +{ + long val = -1; + for (size_t i = start; i < lenth; i++) + { + if (val <= arr[i]) + { + val = arr[i]; + } + + } + return val; +} + +void SensorMannager::SetnumbertoGot(int nscan) +{ + Numberofscan = nscan; +} + +void SensorMannager::GetSifData(QString outfilepath, bool isskyfirs /*= true*/) +{ + + Sensor->SettingShutterOpen(true);//确保shutter打开 + QThread::msleep(50); + Sensor->SettingSwitchShutter(true);//切换为sky + logout::out("Switch 切换至SKY",1); + QThread::msleep(50); + //////////////////////////优化定标//////////////////////////////////////////////// + float skyshutter=SensorOpt(); + for (size_t i = 0; i < 3; i++) + { + + if (skyshutter!=-1) + { + break; + } + skyshutter = SensorOpt(); + + } + ///////////////////////////////////////////// + if (skyshutter==-1)//opt三次后仍未-1 说明错误 + { + logout::out("错误 结束程序",3); + return; + } + skyshutter = abs(skyshutter); + Sensor->SettingSwitchShutter(false);//切换为VEG + logout::out("Switch 切换至VEG",1); + QThread::msleep(50); + //////////////////////////veg//////////////////////////////////////////////// + float vegshutter = SensorOpt(); + for (size_t i = 0; i < 3; i++) + { + if (vegshutter ==-1 ) + { + break; + } + vegshutter = SensorOpt(); + + } + if (vegshutter == -1) + { + logout::out("错误 结束程序",3); + return; + } + vegshutter = abs(vegshutter); + //////////////////////////模块分割//////////////////////////////////////////////// + + //////////////////////////打开带输出文件//////////////////////////////////////////////// + FILE *fp = fopen(outfilepath.toStdString().c_str(), "w"); + if (fp==NULL) + { + logout::out("打开文件" + outfilepath + "失败!!", 3); + return; + } + //fprintf(fp, "%s) + STROnePlot oneplot; + float tempp = Sensor->GettingTempratrue(); + WriteTitletoCSV(fp, Sensor->SensorInfo.SensorName,Numberofscan, tempp, Sensor->SensorInfo.WavelenthStr, skyshutter, vegshutter); + logout::setoutlevel(10); + Sensor->SettingSwitchShutter(true);//切换至sky + Sensor->Settingshuttertime(skyshutter); + for (size_t i = 0; i < Numberofscan; i++) + { + logout::out("开始采集第"+QString::number(i+1)+"次Sky 数据"); + Sensor->GetOnePlot(oneplot,true); + writeonedatatoCSV(fp, oneplot); + } + + Sensor->SettingSwitchShutter(false);//切换为VEG + Sensor->Settingshuttertime(vegshutter); + for (size_t i = 0; i < Numberofscan; i++) + { + logout::out("开始采集第" + QString::number(i+1) + "次Veg 数据"); + Sensor->GetOnePlot(oneplot,true); + writeonedatatoCSV(fp, oneplot); + } + fflush(fp); + fclose(fp); + logout::out("采集完成",1); + logout::setoutlevel(); + +} + +void SensorMannager::writeonedatatoCSV(FILE *fp, STROnePlot plot) +{ + //.fprintf(fp, "%s,%s,%s\n", xvaluetoWrite.at(i).toStdString().c_str() + size_t lenth = plot.BandNum; + size_t i; + for (i = 0; i < lenth-1; i++) + { + fprintf(fp, "%s,", QString::number(plot.Plot[i], 'f', 1).toStdString().c_str()); + + } + fprintf(fp, "%s\n", QString::number(plot.Plot[i], 'f', 1).toStdString().c_str()); +} + +void SensorMannager::WriteTitletoCSV(FILE *fp, QString sensname, int NmberofScan, float temp, QString wavestring, float skyshutter, float vegshutter) +{ + if (fp == NULL) + { + return; + } + QDateTime datetime = QDateTime::currentDateTime(); + QLocale locale = QLocale::English; + QString datestr = locale.toString(datetime, "ddd MMM dd hh:mm:ss yyyy"); + fprintf(fp, "observation date and time: %s\n", datestr.toStdString().c_str()); + fprintf(fp, "numberofscan: %s\n", QString::number(Numberofscan).toStdString().c_str()); + fprintf(fp, "spectrometer: %s\n", sensname.toStdString().c_str()); + fprintf(fp, "ambient temperature: %s\n", QString::number(temp,'f',2).toStdString().c_str()); + fprintf(fp, "%s\n", wavestring.toStdString().c_str()); + fprintf(fp, "integration time 1: %s\n", QString::number(skyshutter, 'f', 2).toStdString().c_str()); + fprintf(fp, "integration time 2: %s\n", QString::number(vegshutter, 'f', 2).toStdString().c_str()); +} + diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorMannager.h b/othersoft/shuttercali/source_rlx/sensor/SensorMannager.h new file mode 100644 index 0000000..10d4bd7 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorMannager.h @@ -0,0 +1,78 @@ +#pragma once +/****************************************************** +* 文件名 : SensorMannager.h +* 类名 : +* 作用 : +* 作者 : xin +* 邮箱 : renlixin@iris-rs.cn +* 日期 : 2021-2-22 +******************************************************** +* * +* _ooOoo_ * +* o8888888o * +* 88" . "88 * +* (| -_- |) * +* O\ = /O * +* ____/`---'\____ * +* .' \\| |// `. * +* / \\||| : |||// \ * +* / _||||| -:- |||||- \ * +* | | \\\ - /// | | * +* | \_| ''\---/'' | | * +* \ .-\__ `-` ___/-. / * +* ___`. .' /--.--\ `. . __ * +* ."" '< `.___\_<|>_/___.' >'"". * +* | | : `- \`.;`\ _ /`;.`/ - ` : | | * +* \ \ `-. \_ __\ /__ _/ .-` / / * +* ======`-.____`-.___\_____/___.-`____.-'====== * +* `=---=' * +* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * +* 佛祖保佑 长发永存 * +* * +********************************************************/ + + + +#include +#include "SensorBase.h" +enum SensorType +{ + QESENSOR = 1, + + +}; + + + + +class SensorMannager : public QObject +{ + Q_OBJECT + +public: + SensorMannager(QObject *parent=0 ); + ~SensorMannager(); + SensorBase *Sensor; + //************************************ + // Method: SensorOpt 自动优化 其中persent为默认优化到的目标 0到100 默认是100 + // FullName: SensorMannager::SensorOpt + // Access: public + // Returns: void + // Qualifier: + // Parameter: int persent + //************************************ + void opensensor(); + void CloseSensor(); + long SensorOpt(int persent=100); + + long Getmaxvalue(float *arr, int start, int lenth); + void SetnumbertoGot(int nscan); + void GetSifData(QString outfilepath,bool isskyfirs = true); +private: + int Numberofscan; + void writeonedatatoCSV(FILE *fp, STROnePlot plot); + void WriteTitletoCSV(FILE *fp,QString sensname, int NmberofScan, float temp, QString wavestring, float skyshutter, float vegshutter); +}; + + + diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp b/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp new file mode 100644 index 0000000..0258871 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorOptoSky.cpp @@ -0,0 +1,306 @@ +#include "SensorOptoSky.h" +#include "OptoSkyType.h" +#include "logout.h" +#include "QtEndian" +using namespace OptoSky; +SensorOptoSky::SensorOptoSky(OPTOSENSORTYPE type, QString comname, qint32 bandrate) + +{ + sensortype = type; + SensorType = "opt"; + SensorInfo.SensorName = "opotsky"; + COMname = comname; + BandRate = bandrate; + shutter.resize(2); + + //SendComment(comi); +} + +SensorOptoSky::SensorOptoSky(OPTOSENSORTYPE type, QString comname) +{ + + sensortype = type; + SensorType = "opt"; + SensorInfo.SensorName = "opotsky"; + COMname = comname; + BandRate = 115200; + shutter.resize(2); +} + +bool SensorOptoSky::initSensor(int id /*= 0*/) +{ + + + OptoSky::SetPortName(COMname, BandRate); + if (!OptoSky::isSensorInit()) + { + return false; + } + + SensorInfo = GetSensorInfo(); + float a = GettingTempratrue(); + //SendComment() + return true; +} + +void SensorOptoSky::Settingshuttertime(float msc) +{ + if (!OptoSky::isSensorInit()) + { + return; + } + shuttertime = (int)msc; + shutter[0] = (int)msc / 256; + shutter[1] = (int)msc % 256; + QByteArray temp; + SendComment(SET_INTEGRAL_TIME,shutter); + GetReturn(SET_INTEGRAL_TIME,temp); +} + +void SensorOptoSky::SettingTemprature(float temp) +{ + QByteArray buf; + buf.resize(2); + + if (temp<0) + { + buf[0] = 0xff; + } + else + { + buf[1] = 0x00; + + } + buf[1] = (int)abs(temp); + SendComment(SET_TEC_TEMP, buf); + GetReturn(SET_TEC_TEMP, buf); + +} + +float SensorOptoSky::GettingTempratrue() +{ + if (!OptoSky::isSensorInit()) + { + return 0; + } + QByteArray buf; + SendComment(GET_TEC_TEMP); + GetReturn(GET_TEC_TEMP, buf); + QString str; + str.append(buf); + float ret = str.toFloat(); + return ret; +} + +STRSensorInfo SensorOptoSky::GetSensorInfo() +{ + STRSensorInfo setem; + if (!OptoSky::isSensorInit()) + { + return setem; + } + STRSensorInfo se; + QByteArray buf; + SendComment(GET_PN_NUMBER); + GetReturn(GET_PN_NUMBER, buf); + QString str; + str.append(buf); + se.SensorName = str; + logout::out("设备型号为:" + str); + SendComment(GET_SN_NUMBER); + GetReturn(GET_SN_NUMBER, buf); + str.clear(); + str.append(buf); + logout::out("序列号为:" + str); + SendComment(GET_PIXEL_LENGTH); + GetReturn(GET_PIXEL_LENGTH, buf); + se.BandNum = buf[0] * 256 + buf[1]; + //////////////////////////模块分割//////////////////////////////////////////////// + Settingshuttertime(6); + SendComment(SYNCHRONIZATION_GET_DATA); + GetReturn(SYNCHRONIZATION_GET_DATA, buf); + se.BandNum = (buf.size() - 1)/2; + //////////////////////////模块分割//////////////////////////////////////////////// + getwavelenthlist(se); + //波长获取仍无法获取 最大值仍未获取 + //////////////////////////模块分割//////////////////////////////////////////////// + QByteArray bbb; + bbb.resize(2); + bbb[0] = 0x00; + bbb[1] = 0x01; + SendComment(SET_AVERAGE_NUMBER, bbb); + GetReturn(SET_AVERAGE_NUMBER, bbb); + se.maxValue = 65535; + return se; +} + +void SensorOptoSky::SettingShutterOpen(bool isopen) +{ + +} + +void SensorOptoSky::SettingSwitchShutter(bool isright) +{ + +} + +void SensorOptoSky::GetOnePlot(STROnePlot &OnePlot, bool Dark) +{ + OnePlot.temp = GettingTempratrue(); + + SendComment(SYNCHRONIZATION_GET_DATA,shutter); + OnePlot.shutter = shuttertime; + QByteArray buf; + if (!GetReturn(SYNCHRONIZATION_GET_DATA, buf)) + { + OnePlot.isInit = false; + return; + } + + + if ((unsigned char )buf[0]==0x00) + { + //OnePlot.isInit = true; + } + else + { + OnePlot.isInit = false; + } + int bandsumnwo = SensorInfo.BandNum; + unsigned short *arr = new unsigned short[bandsumnwo]; + memcpy(arr, buf.data() + 1, bandsumnwo*2); + if (!OnePlot.isInit) + { + OnePlot.Plot = new float[bandsumnwo]; + OnePlot.isInit = true; + } + + for (size_t i = 0; i < bandsumnwo; i++) + { + OnePlot.Plot[i] = qToBigEndian(arr[i]); + } + delete[] arr; + OnePlot.BandNum = bandsumnwo; + OnePlot.maxDNvalue = SensorInfo.maxValue; + OnePlot.wavelenthlist = SensorInfo.wavelenthlist; + if (Dark) + { + if (DarkNess.isInit) + { + if (DarkNess.shutter != shuttertime) + { + GetOneDark(DarkNess); + } + + } + else + { + GetOneDark(DarkNess); + } + + for (size_t i = 0; i < bandsumnwo; i++) + { + OnePlot.Plot[i] = OnePlot.Plot[i] - DarkNess.Plot[i]; + } + } + +} + +void SensorOptoSky::CloseSensor() +{ + closeport(); +} + +void SensorOptoSky::GetOneDark(STROnePlot &darkplot) +{ + STROnePlot &OnePlot = darkplot; + OnePlot.temp = GettingTempratrue(); + OnePlot.shutter = shuttertime; + SendComment(SYNCHRONIZATION_GET_DARK, shutter); + QByteArray buf; + if (!GetReturn(SYNCHRONIZATION_GET_DARK, buf)) + { + OnePlot.isInit = false; + return; + } + + + if ((unsigned char)buf[0] == 0x00) + { + //OnePlot.isInit = true; + } + else + { + OnePlot.isInit = false; + } + int bandsumnwo = SensorInfo.BandNum; + unsigned short *arr = new unsigned short[bandsumnwo]; + memcpy(arr, buf.data() + 1, bandsumnwo * 2); + if (!OnePlot.isInit) + { + OnePlot.Plot = new float[bandsumnwo]; + OnePlot.isInit = true; + } + for (size_t i = 0; i < bandsumnwo; i++) + { + OnePlot.Plot[i] = qToBigEndian(arr[i]); + + + } + delete[] arr; + OnePlot.BandNum = bandsumnwo; + OnePlot.maxDNvalue = SensorInfo.maxValue; + OnePlot.wavelenthlist = SensorInfo.wavelenthlist; + OnePlot.DataType = DARKNESS; + +} + +SensorOptoSky::~SensorOptoSky() +{ + CloseSensor(); +} + +void SensorOptoSky::RemoveHeaderandEnd(QByteArray &buf) +{ + if (buf.size()<6) + { + return; + } + buf.remove(0, 5); + buf.remove(buf.size() - 1,1); + +} + +void SensorOptoSky::getwavelenthlist(STRSensorInfo &se) +{ + if (!OptoSky::isSensorInit()) + { + return ; + } + QByteArray bufin; + bufin.resize(2); + bufin[0] = 0x00; + bufin[1] = 0x01; + QByteArray buf; + SendComment(GET_WAVELENGTH_CALIBRATION_COFF,bufin); + GetReturn(GET_WAVELENGTH_CALIBRATION_COFF, buf); + float a[4]; + memcpy(a, buf.data() + 16, 4 * 4); + int bandsss = se.BandNum; + QStringList strlist; + QString str=""; + int i = 0; + for ( i = 0; i _/___.' >'"". * +* | | : `- \`.;`\ _ /`;.`/ - ` : | | * +* \ \ `-. \_ __\ /__ _/ .-` / / * +* ======`-.____`-.___\_____/___.-`____.-'====== * +* `=---=' * +* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * +* 佛祖保佑 长发永存 * +* * +********************************************************/ + + + +#include +enum OPTOSENSORTYPE +{ + ATP6500 = 1 +}; +class SensorOptoSky : public SensorBase +{ + Q_OBJECT + +public: + SensorOptoSky(OPTOSENSORTYPE type, QString comname); + SensorOptoSky(OPTOSENSORTYPE type, QString comname, qint32 bandrate); + bool initSensor(int id = 0); + void Settingshuttertime(float msc) ; + //************************************ + // Method: SettingTemprature 设置温度 + // FullName: SensorBase::SettingTemprature + // Access: virtual public + // Returns: void + // Qualifier: + // Parameter: float temp + //************************************ + void SettingTemprature(float temp); + float GettingTempratrue() ; + STRSensorInfo GetSensorInfo(); + void SettingShutterOpen(bool isopen); + void SettingSwitchShutter(bool isright); + void GetOnePlot(STROnePlot &OnePlot, bool Dark=false) ; + void CloseSensor() ; + + void GetOneDark(STROnePlot &darkplot); + + + + OPTOSENSORTYPE sensortype; + QString COMname; + qint32 BandRate; + ~SensorOptoSky(); +private: + void RemoveHeaderandEnd(QByteArray &buf); + void getwavelenthlist( STRSensorInfo &se); + QByteArray shutter; + int shuttertime; + +}; diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.cpp b/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.cpp new file mode 100644 index 0000000..1b5a363 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.cpp @@ -0,0 +1,327 @@ +#include "SensorQExPRO.h" +#include "QDebug" +#include "api/seabreezeapi/SeaBreezeAPI.h" +#include "logout.h" +#include "QMetaEnum" +#include "QThread" +SensorQExPRO::SensorQExPRO(EMQEType qetype) + +{ + QEType = qetype; + if (qetype==QEPRO_QE) + { + + } + else if(qetype == USB2000PLUS_QE) + { + + } + else + { + OutputMod = nullptr; + Shuteroffcom = nullptr; + Shuteroncom = nullptr; + } + +} + +SensorQExPRO::~SensorQExPRO() +{ + if (SensorInfo.isSensorInit) + { + sbapi_shutdown(); + } + + +} + +bool SensorQExPRO::initSensor(int id) +{ + sbapi_shutdown(); + sbapi_initialize(); + sbapi_probe_devices(); + int number_of_QE = sbapi_get_number_of_device_ids(); + logout::out("找到 " + QString::number(number_of_QE) + "个设备",2); + if (number_of_QE <= id) + { + return false; + } + Device_ids=new long[number_of_QE](); + sbapi_get_device_ids(Device_ids, number_of_QE); + logout::out("设备id为:" + QString::number(Device_ids[id]),2); + DeviceId = Device_ids[id]; + + char namearr[100]; + //获取名称 + FLAG= sbapi_get_device_type(DeviceId, &ERR, namearr, 99); + if (FLAG!=0) + { + QString sensorname = QString(namearr); + QEType = getEMUbyQstring(sensorname); + SensorType = sensorname; + SensorInfo.SensorName = sensorname; + logout::out("设备型号:" + sensorname,2); + } + Sensorid = DeviceId; + //打开设备 + FLAG= sbapi_open_device(DeviceId, &ERR); + logout::out("设备打开:" + QString(sbapi_get_error_string(ERR)),2); + if (FLAG!=0) + { + //如果失败 返回false + return false; + } + SensorInfo.isSensorInit = true; + int maxf=sbapi_get_number_of_shutter_features(DeviceId, &ERR);; + long fff; +// sbapi_get_shutter_features(DeviceId, &ERR, &fff,maxf); +// sbapi_shutter_set_shutter_open(DeviceId, fff,&ERR, 0); +// logout::out("设备打开:" + QString(sbapi_get_error_string(ERR))); +// qDebug() << "hello"; + SensorInfo=GetSensorInfo(); + + + //为温度二设置的 + Numberoftempratrue= sbapi_get_number_of_thermo_electric_features(DeviceId, &ERR); + TemPratrueId=new long[Numberoftempratrue](); + Numberoftempratrue=sbapi_get_thermo_electric_features(DeviceId, &ERR, TemPratrueId, Numberoftempratrue); + sbapi_tec_set_enable(DeviceId, TemPratrueId[0], &ERR, 1); + return true; +} + +void SensorQExPRO::Settingshuttertime(float msc) +{ + if (!SensorInfo.isSensorInit) + { + return; + } + shuttertime = msc; + sbapi_spectrometer_set_integration_time_micros(DeviceId, SpecMetersId[0], &ERR, msc*1000); + //logout::out("设置曝光时间:" + QString(sbapi_get_error_string(ERR)),2); +} + +void SensorQExPRO::SettingTemprature(float temp) +{ + sbapi_tec_set_temperature_setpoint_degrees_C(DeviceId, TemPratrueId[0], &ERR,temp); + QThread::msleep(100); +} + +STRSensorInfo SensorQExPRO::GetSensorInfo() +{ + STRSensorInfo sensorinof; + //return sensorinof; + if (!SensorInfo.isSensorInit) + { + return sensorinof; + } + int ERR=0; + + sensorinof.isSensorInit = true; + sensorinof.BandNum= sbapi_get_number_of_spectrometer_features(DeviceId, &ERR); + SpecMetersId = new long[sensorinof.BandNum](); + int numm= sbapi_get_spectrometer_features(DeviceId, &ERR, SpecMetersId, sensorinof.BandNum); + sensorinof.BandNum = sbapi_spectrometer_get_formatted_spectrum_length(DeviceId, SpecMetersId[0], &ERR); + double *wavelenth = new double[sensorinof.BandNum](); + sbapi_spectrometer_get_wavelengths(DeviceId, SpecMetersId[0], &ERR,wavelenth, sensorinof.BandNum); + sensorinof.wavelenthlist.clear(); + sensorinof.WavelenthStr = ""; + int i = 0; + for (i = 0; i < sensorinof.BandNum-1; i++) + { + sensorinof.WavelenthStr = sensorinof.WavelenthStr + QString::number(wavelenth[i], 'f', 4)+","; + sensorinof.wavelenthlist.append(QString::number(wavelenth[i], 'f', 4)); + + } + sensorinof.WavelenthStr = sensorinof.WavelenthStr + QString::number(wavelenth[i], 'f', 4); + sensorinof.wavelenthlist.append(QString::number(wavelenth[i], 'f', 4)); + sensorinof.maxValue = sbapi_spectrometer_get_maximum_intensity(DeviceId, SpecMetersId[0], &ERR); + char namearr[100]; + //获取名称 + FLAG = sbapi_get_device_type(DeviceId, &ERR, namearr, 99); + if (FLAG != 0) + { + QString sensorname = QString(namearr); + QEType = getEMUbyQstring(sensorname); + SensorType = sensorname; + sensorinof.SensorName = sensorname; + logout::out("设备型号:" + sensorname, 2); + } + return sensorinof; +} + +void SensorQExPRO::SettingShutterOpen(bool isopen) +{ + //树莓派 4针脚 + system("gpio mode 4 output"); + if (isopen) + { + system("gpio write 4 1"); + logout::out("打开 Shutter gpio",2); + } + else + { + system("gpio write 4 0"); + logout::out("关闭 Shutter gpio",2); + } + if (QEType==QEPRO_QE) + { + + SetQEProShutter(isopen); + } + QThread::msleep(100); + +} + +void SensorQExPRO::SettingSwitchShutter(bool isright) +{ + system("gpio mode 5 output"); + if (isright) + { + system("gpio write 5 1"); + logout::out("切换至SKY",2); + } + else + { + system("gpio write 5 0"); + logout::out("切换至VEG",2); + } + +} + +void SensorQExPRO::GetOnePlot(STROnePlot &OnePlot, bool Dark) +{ + if (!SensorInfo.isSensorInit) + { + return; + } + if (!OnePlot.isInit || OnePlot.BandNum != SensorInfo.BandNum) + { + if (OnePlot.isInit) + { + + delete[] OnePlot.Plot; + } + OnePlot.Plot = new float[SensorInfo.BandNum]; + OnePlot.BandNum = SensorInfo.BandNum; + + } + if (!SensorInfo.isSensorInit) + { + return; + + } + double *tempvalue = new double[SensorInfo.BandNum]; + OnePlot.shutter = shuttertime; + sbapi_spectrometer_get_formatted_spectrum(DeviceId,SpecMetersId[0], &ERR, tempvalue, SensorInfo.BandNum); + logout::out("获取数据:" + QString(sbapi_get_error_string(ERR)),5); + if (QEType != USB2000PLUS_QE) + { + OnePlot.temp = GettingTempratrue(); + logout::out("获取温度:" + QString(sbapi_get_error_string(ERR)) + " 温度为:" + QString::number(OnePlot.temp, 'f', 2) + "℃",2); + } + + + for (size_t i = 0; i < SensorInfo.BandNum; i++) + { + OnePlot.Plot[i] = tempvalue[i]; + + } + OnePlot.isInit = true; + delete[] tempvalue; +} + +float SensorQExPRO::GettingTempratrue() +{ + if (!SensorInfo.isSensorInit) + { + return -1000; + } + float temperature = (float)sbapi_tec_read_temperature_degrees_C(DeviceId, TemPratrueId[0], &ERR); + logout::out("当前温度为:"+QString::number(temperature,'f',2),2); + return temperature; +} + +void SensorQExPRO::CloseSensor() +{ + if (SensorInfo.isSensorInit) + { + sbapi_shutdown(); + SensorInfo.isSensorInit = false; + } +} + +void SensorQExPRO::GetOneDark(STROnePlot &darkplot) +{ + +} + +EMQEType SensorQExPRO::getEMUbyQstring(QString str) +{ + if (str=="USB2000PLUS") + { + return USB2000PLUS_QE; + } + if (str == "QE65PRO") + { + return QE65PRO_QE; + } + if (str == "QE-PRO") + { + return QEPRO_QE; + } + if (str == "QE65000") + { + return QE65000_QE; + } + return NONQE; +} + +void SensorQExPRO::SetQEProShutter( bool isopen) +{ + unsigned char GPIO4output[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2 + }; + unsigned char GPIO4on[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2 + }; + unsigned char GPIO4_off[64] = { 0xc1, 0xc0, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc5, 0xc4, 0xc3, 0xc2 + }; + + long FNid; + int FN = sbapi_get_number_of_raw_usb_bus_access_features(DeviceId, &ERR); + FN = sbapi_get_raw_usb_bus_access_features(DeviceId, &ERR, &FNid, FN); + QThread::msleep(100); + int lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4output, 64, 0x01); + logout::out("设置shutter 为gpio",2); + if (isopen) + { + lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4on, 64, 0x01); + logout::out("打开内部Shutter",2); + } + else + { + lenth = sbapi_raw_usb_bus_access_write(DeviceId, FNid, &ERR, GPIO4_off, 64, 0x01); + logout::out("关闭内部Shutter",2); + } + + +} diff --git a/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.h b/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.h new file mode 100644 index 0000000..88e11d7 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/SensorQExPRO.h @@ -0,0 +1,63 @@ +#pragma once +#pragma execution_character_set("utf-8") +#include "SensorBase.h" +enum EMQEType +{ + QEPRO_QE=1, + QE65PRO_QE=2, + USB2000PLUS_QE =3, + QE65000_QE = 4, + NONQE=-1 +}; +class SensorQExPRO : public SensorBase +{ + Q_OBJECT + +public: + SensorQExPRO(EMQEType qetype); + ~SensorQExPRO(); + bool initSensor(int id=0); + void Settingshuttertime(float msc); + //************************************ + // Method: SettingTemprature 设置温度 + // FullName: SensorBase::SettingTemprature + // Access: virtual public + // Returns: void + // Qualifier: + // Parameter: float temp + //************************************ + void SettingTemprature(float temp); + STRSensorInfo GetSensorInfo() ; + void SettingShutterOpen(bool isopen); + //************************************ + // Method: SettingSwitchShutter sky为right + // FullName: SensorQExPRO::SettingSwitchShutter + // Access: public + // Returns: void + // Qualifier: + // Parameter: bool isright sky为right + //************************************ + void SettingSwitchShutter(bool isright); + void GetOnePlot(STROnePlot &OnePlot, bool Dark=false); + float GettingTempratrue(); + void CloseSensor(); + void GetOneDark(STROnePlot &darkplot); + EMQEType QEType; +private: + + long *Device_ids; + long DeviceId; + int ERR = 0; + int FLAG = 0; + unsigned char *OutputMod, *Shuteroncom, *Shuteroffcom; + long Numberoftempratrue; + long *TemPratrueId; + long *SpecMetersId; + EMQEType getEMUbyQstring(QString str); + + void SetQEProShutter(bool isopen); + float shuttertime; +; + + +}; diff --git a/othersoft/shuttercali/source_rlx/sensor/TCPServer.h b/othersoft/shuttercali/source_rlx/sensor/TCPServer.h new file mode 100644 index 0000000..548fdc1 --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/TCPServer.h @@ -0,0 +1,301 @@ + +#ifndef _TCPSERVER_H_ +#define _TCPSERVER_H_ +// +// Return Header values. +// +#define H_NO_ERROR (100) +#define H_COLLECT_ERROR (200) +#define H_COLLECT_NOT_LOADED (300) +#define H_INIT_ERROR (400) +#define H_FLASH_ERROR (500) +#define H_RESET_ERROR (600) +#define H_INTERPOLATE_ERROR (700) +#define H_OPTIMIZE_ERROR (800) +#define H_INSTRUMENT_CONTROL_ERROR (900) +// +// Return error codes. +// +#define NO_ERROR_ (0) +#define NOT_READY (-1) +#define NO_INDEX_MARKS (-2) +#define TOO_MANY_ZEROS (-3) +#define SCANSIZE_ERROR (-4) +// -5 unused +#define COMMAND_ERROR (-6) +#define INI_FULL (-7) +#define MISSING_PARAMETER (-8) +// -9 unused - now -20, -21, -22 +#define VNIR_TIMEOUT (-10) +#define SWIR_TIMEOUT (-11) +#define VNIR_NOT_READY (-12) +#define SWIR1_NOT_READY (-13) +#define SWIR2_NOT_READY (-14) +#define VNIR_OPT_ERROR (-15) +#define SWIR1_OPT_ERROR (-16) +#define SWIR2_OPT_ERROR (-17) +#define ABORT_ERROR (-18) +#define PARAM_ERROR (-19) +#define VNIR_INTERP_ERROR (-20) +#define SWIR1_INTERP_ERROR (-21) +#define SWIR2_INTERP_ERROR (-22) +// +// +// +#define MAX_PARAMETERS (200) +// +// Detector Index Value +// +#define SWIR1 (0) +#define SWIR2 (1) +#define VNIR (2) +// +// Instrument Type values +// +#define V_INSTRUMENT_TYPE (1) // VNIR Only +#define DUAL_VNIR_INSTRUMENT_TYPE (2) // Dual VNIR +#define S1_INSTRUMENT_TYPE (4) // SWIR1 Only +#define VS1_INSTRUMENT_TYPE (5) // VNIR and SWIR1 +#define S2_INSTRUMENT_TYPE (8) // SWIR2 ONly +#define VS2_INSTRUMENT_TYPE (9) // VNIR and SWIR2 +#define S1S2_INSTRUMENT_TYPE (12) // SWIR1 and SWIR2 +#define FR_INSTRUMENT_TYPE (13) // VNIR and SWIR1 and SWIR2 +// +// Instrument Control values +// +#define IC_IT (0) +#define IC_GAIN (1) +#define IC_OFFSET (2) +#define IC_SHUTTER (3) +#define IC_TRIGGER (4) +// +// Union used to swap word to make double value +// +union dv +{ + double d; + unsigned long l[sizeof(double) / sizeof(long)]; + unsigned char c[sizeof(double)]; +}; +// +// Vnir Header section +// +struct Vnir_Header +{ + int IT; + int scans; + int max_channel; + int min_channel; + int saturation; + int shutter; + int drift; + int dark_subtracted; + int reserved[8]; +}; +// +// Swir Header section +// +struct Swir_Header +{ + int tec_status; + int tec_current; + int max_channel; + int min_channel; + int saturation; + int A_Scans; + int B_Scans; + int dark_current; + int gain; + int offset; + int scansize1; + int scansize2; + int dark_subtracted; + int reserved[3]; +}; +// +// return Spectrum Header +// +struct SpectrumHeader +{ + int Header; + int errbyte; + int sample_count; + int trigger; + int voltage; + int current; + int temperature; + int motor_current; + int instrument_hours; + int instrument_minutes; + int instrument_type; + int AB; + int reserved[4]; + Vnir_Header v_header; + Swir_Header s1_header; + Swir_Header s2_header; +}; +// +// Acquire structure to return for Full Range Spectrometers +// +struct FRSpecStruct +{ + SpectrumHeader FRHeader; + union + { + float f; + int i; + }SpecBuffer[2151]; +}; + +// +// Acquire structure to return for Vnir Spectrometers +// +struct VSpecStruct +{ + SpectrumHeader VHeader; + union + { + float f; + int i; + }SpecBuffer[701]; +}; +// +// Acquire structure to return for Swir1 Swir2 Spectrometers +// +struct S1S2SpecStruct +{ + SpectrumHeader S1S2Header; + union + { + float f; + int i; + }SpecBuffer[1502]; +}; +// +// Acquire structure to return for Swir1 Spectrometers +// +struct S1SpecStruct +{ + SpectrumHeader S1SpectrumHeader; + union + { + float f; + int i; + }SpecBuffer[801]; +}; +// +// Acquire structure to return for Swir2 Spectrometers +// +struct S2SpecStruct +{ + SpectrumHeader S2Header; + union + { + float f; + int i; + }SpecBuffer[701]; +}; +// +// Acquire structure to return for Vnir/Swir1 Spectrometers +// +struct VS1SpecStruct +{ + SpectrumHeader VS1Header; + union + { + float f; + int i; + }SpecBuffer[1502]; +}; +// +// Acquire structure to return for Vnir/Swir2 Spectrometers +// +struct VS2SpecStruct +{ + SpectrumHeader VS2Header; + union + { + float f; + int i; + }SpecBuffer[1402]; +}; +// +// Ini struct for the flash +// +struct InitStruct +{ + int Header; //header type used in TCP transfer. + int errbyte; //error code + char name[MAX_PARAMETERS][30]; //space for 200 entries with 30 character names + double value[MAX_PARAMETERS]; //corresponding data values for the 200 entries + int count; //The number of used entries + int verify; //the checksum +}; +// +// Version structure for V Command +// +struct VersionStruct +{ + int Header; //header type used in TCP transfer. + int errbyte; //error code + char version[30]; //30 character version string + double value; //version value + int type; // Type of instrument 1-Vnir, 4-Swir1, 5-Vnir/Swir1 +}; // 8-Siwr2, 9-Vnir/Swir2 +// 12-Swir1/Swir2, 13-Vnir/Swir1/Swir2 +// +// Optimize structure for OPT command +// +struct OptimizeStruct +{ + int Header; //header type used in TCP transfer. + int errbyte; //error code + int itime; //optimized integration time + int gain[2]; //optimized gain for 2 SWIRs + int offset[2]; //optimized offset for 2 SWIRs +}; +// +// Param structure for INIT command +// +struct ParamStruct +{ + int Header; //header type used in TCP transfer. + int errbyte; //error code + char name[30]; //30 character name + double value; //corresponding data values + int count; //number of entries used +}; +// +// Instrument Control Structure for IC command +// +struct InstrumentControlStruct +{ + int Header; //header type used in TCP transfer. + int errbyte; //error code + int detector; //detector value - IC_IT,IC_GAIN,IC_OFFSET,IC_SHUTTER + int cmdType; //detector command + int value; //command value +}; +// +// Header Struct for Restore Command +// +struct HeaderStruct +{ + int Header; // Header value used in TCP transfer + int errbyte; // error code +}; + + + + +struct FRInterpSpecStruct +{ + + SpectrumHeader FRSpectrumHeader; //256 bytes (64 words) + //int arr[761]; + float SpecBuffer[2151]; +}; + + + +#endif diff --git a/othersoft/shuttercali/source_rlx/sensor/logout.cpp b/othersoft/shuttercali/source_rlx/sensor/logout.cpp new file mode 100644 index 0000000..17e444d --- /dev/null +++ b/othersoft/shuttercali/source_rlx/sensor/logout.cpp @@ -0,0 +1,63 @@ +#include "logout.h" +#include "QDebug" +#include "QTextCodec" +QString colorcode = "\033["; +int outputlevel = 4; +logout::logout(QObject *parent) + : QObject(parent) +{ +} + +logout::~logout() +{ +} + +void logout::out(QString str,int level) +{ + if (level>outputlevel) + { + return; + } + QTextCodec *codec = QTextCodec::codecForName("GBK");//修改这两行 + int colorint; + switch (level) + { + case 0: + { + + + break; + } + case 1: + { + + qDebug() << "\033[32m";//绿色 + break; + } + case 2: + { + + qDebug() << "\033[35m";//绿色 + break; + } + case 3: + { + + qDebug() << "\033[31m";//红色 + break; + } + default: + { + break; + } + } + //str=codec->toUnicode(str.toStdString().c_str()); + qDebug() < + +class logout : public QObject +{ + Q_OBJECT + + + +public: + logout(QObject *parent); + ~logout(); + static void out(QString str, int level=0); + static void setoutlevel(int level = 4); +};

          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