diff --git a/DeviceAdapters/89NorthLDI/89North_LDI.vcxproj b/DeviceAdapters/89NorthLDI/89North_LDI.vcxproj
index 23fe9b2e1..580efffec 100644
--- a/DeviceAdapters/89NorthLDI/89North_LDI.vcxproj
+++ b/DeviceAdapters/89NorthLDI/89North_LDI.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/AAAOTF/AAAOTF.vcxproj b/DeviceAdapters/AAAOTF/AAAOTF.vcxproj
index 94a8c28a2..9369a217a 100644
--- a/DeviceAdapters/AAAOTF/AAAOTF.vcxproj
+++ b/DeviceAdapters/AAAOTF/AAAOTF.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ABS/ABSCamera.vcxproj b/DeviceAdapters/ABS/ABSCamera.vcxproj
index 3de213e3a..ddd620d75 100644
--- a/DeviceAdapters/ABS/ABSCamera.vcxproj
+++ b/DeviceAdapters/ABS/ABSCamera.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/AOTF/AOTF.vcxproj b/DeviceAdapters/AOTF/AOTF.vcxproj
index 4cc840963..32fda92f8 100644
--- a/DeviceAdapters/AOTF/AOTF.vcxproj
+++ b/DeviceAdapters/AOTF/AOTF.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ASIFW1000/ASIFW1000.vcxproj b/DeviceAdapters/ASIFW1000/ASIFW1000.vcxproj
index 5c01acc5f..28dc0280b 100644
--- a/DeviceAdapters/ASIFW1000/ASIFW1000.vcxproj
+++ b/DeviceAdapters/ASIFW1000/ASIFW1000.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ASIStage/ASIStage.vcxproj b/DeviceAdapters/ASIStage/ASIStage.vcxproj
index 5e316356d..91a9f4401 100644
--- a/DeviceAdapters/ASIStage/ASIStage.vcxproj
+++ b/DeviceAdapters/ASIStage/ASIStage.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
@@ -124,4 +124,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/ASITiger/ASITiger.vcxproj b/DeviceAdapters/ASITiger/ASITiger.vcxproj
index d6f9b5dee..727d67e90 100644
--- a/DeviceAdapters/ASITiger/ASITiger.vcxproj
+++ b/DeviceAdapters/ASITiger/ASITiger.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
@@ -136,4 +136,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/ASIWPTR/ASIwptr.vcxproj b/DeviceAdapters/ASIWPTR/ASIwptr.vcxproj
index b4974caf5..b0355d1ed 100644
--- a/DeviceAdapters/ASIWPTR/ASIwptr.vcxproj
+++ b/DeviceAdapters/ASIWPTR/ASIwptr.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/AgilentLaserCombiner/AgilentLaserCombiner.vcxproj b/DeviceAdapters/AgilentLaserCombiner/AgilentLaserCombiner.vcxproj
index 8366720b3..7785dcafc 100644
--- a/DeviceAdapters/AgilentLaserCombiner/AgilentLaserCombiner.vcxproj
+++ b/DeviceAdapters/AgilentLaserCombiner/AgilentLaserCombiner.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Aladdin/Aladdin.vcxproj b/DeviceAdapters/Aladdin/Aladdin.vcxproj
index 99f316a12..c7b0e62cf 100644
--- a/DeviceAdapters/Aladdin/Aladdin.vcxproj
+++ b/DeviceAdapters/Aladdin/Aladdin.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.vcxproj b/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.vcxproj
index 1aa16787b..2de89f15f 100644
--- a/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.vcxproj
+++ b/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.vcxproj
@@ -39,13 +39,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/AmScope/AmScope.vcxproj b/DeviceAdapters/AmScope/AmScope.vcxproj
index 49ed05569..e89ccad9f 100644
--- a/DeviceAdapters/AmScope/AmScope.vcxproj
+++ b/DeviceAdapters/AmScope/AmScope.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
false
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/Andor/Andor.vcxproj b/DeviceAdapters/Andor/Andor.vcxproj
index f2b158b08..d854e4663 100644
--- a/DeviceAdapters/Andor/Andor.vcxproj
+++ b/DeviceAdapters/Andor/Andor.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/AndorLaserCombiner/AndorLaserCombiner.vcxproj b/DeviceAdapters/AndorLaserCombiner/AndorLaserCombiner.vcxproj
index 0f40d9fa5..5077bdd78 100644
--- a/DeviceAdapters/AndorLaserCombiner/AndorLaserCombiner.vcxproj
+++ b/DeviceAdapters/AndorLaserCombiner/AndorLaserCombiner.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/AndorSDK3/AndorSDK3.vcxproj b/DeviceAdapters/AndorSDK3/AndorSDK3.vcxproj
index 6b0b25608..38237c1e5 100644
--- a/DeviceAdapters/AndorSDK3/AndorSDK3.vcxproj
+++ b/DeviceAdapters/AndorSDK3/AndorSDK3.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/AndorShamrock/AndorShamrock.vcxproj b/DeviceAdapters/AndorShamrock/AndorShamrock.vcxproj
index 4f7dd0d60..35b56121b 100755
--- a/DeviceAdapters/AndorShamrock/AndorShamrock.vcxproj
+++ b/DeviceAdapters/AndorShamrock/AndorShamrock.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Aquinas/Aquinas.vcxproj b/DeviceAdapters/Aquinas/Aquinas.vcxproj
index 87969e1d4..85374042c 100644
--- a/DeviceAdapters/Aquinas/Aquinas.vcxproj
+++ b/DeviceAdapters/Aquinas/Aquinas.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/Arduino/Arduino.vcxproj b/DeviceAdapters/Arduino/Arduino.vcxproj
index 4cd4566bc..26f80dcf3 100644
--- a/DeviceAdapters/Arduino/Arduino.vcxproj
+++ b/DeviceAdapters/Arduino/Arduino.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Arduino32bitBoards/Arduino32bitBoards.vcxproj b/DeviceAdapters/Arduino32bitBoards/Arduino32bitBoards.vcxproj
index efb53fdf6..77e21c6df 100644
--- a/DeviceAdapters/Arduino32bitBoards/Arduino32bitBoards.vcxproj
+++ b/DeviceAdapters/Arduino32bitBoards/Arduino32bitBoards.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Atik/AtikCamera.vcxproj b/DeviceAdapters/Atik/AtikCamera.vcxproj
index c53fc01ef..f32a11373 100644
--- a/DeviceAdapters/Atik/AtikCamera.vcxproj
+++ b/DeviceAdapters/Atik/AtikCamera.vcxproj
@@ -22,13 +22,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/BDPathway/BDPathway.vcxproj b/DeviceAdapters/BDPathway/BDPathway.vcxproj
index 48e2b735d..869bd9b6b 100644
--- a/DeviceAdapters/BDPathway/BDPathway.vcxproj
+++ b/DeviceAdapters/BDPathway/BDPathway.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/BH_DCC_DCU/BH_DCC_DCU.vcxproj b/DeviceAdapters/BH_DCC_DCU/BH_DCC_DCU.vcxproj
index 778cd1b5d..c74c11cd2 100644
--- a/DeviceAdapters/BH_DCC_DCU/BH_DCC_DCU.vcxproj
+++ b/DeviceAdapters/BH_DCC_DCU/BH_DCC_DCU.vcxproj
@@ -36,13 +36,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Basler/BaslerPylon.vcxproj b/DeviceAdapters/Basler/BaslerPylon.vcxproj
index 6887a2011..39c790ba3 100644
--- a/DeviceAdapters/Basler/BaslerPylon.vcxproj
+++ b/DeviceAdapters/Basler/BaslerPylon.vcxproj
@@ -22,13 +22,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/BaumerOptronic/BaumerOptronic.vcxproj b/DeviceAdapters/BaumerOptronic/BaumerOptronic.vcxproj
index 1c2f9a3f5..623a2e07c 100644
--- a/DeviceAdapters/BaumerOptronic/BaumerOptronic.vcxproj
+++ b/DeviceAdapters/BaumerOptronic/BaumerOptronic.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/BlueboxOptics_niji/BlueboxOptics_niji.vcxproj b/DeviceAdapters/BlueboxOptics_niji/BlueboxOptics_niji.vcxproj
index cf046bc20..dde4878bf 100644
--- a/DeviceAdapters/BlueboxOptics_niji/BlueboxOptics_niji.vcxproj
+++ b/DeviceAdapters/BlueboxOptics_niji/BlueboxOptics_niji.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/CARVII/CARVII.vcxproj b/DeviceAdapters/CARVII/CARVII.vcxproj
index 22f15d7be..d8ecdc3ea 100644
--- a/DeviceAdapters/CARVII/CARVII.vcxproj
+++ b/DeviceAdapters/CARVII/CARVII.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/CNCMicroscope/ArduinoNeoPixelShutter/ArduinoNeoPixel.vcxproj b/DeviceAdapters/CNCMicroscope/ArduinoNeoPixelShutter/ArduinoNeoPixel.vcxproj
index 14d037163..5379b8636 100644
--- a/DeviceAdapters/CNCMicroscope/ArduinoNeoPixelShutter/ArduinoNeoPixel.vcxproj
+++ b/DeviceAdapters/CNCMicroscope/ArduinoNeoPixelShutter/ArduinoNeoPixel.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/CNCMicroscope/RAMPSStage/RAMPS.vcxproj b/DeviceAdapters/CNCMicroscope/RAMPSStage/RAMPS.vcxproj
index 1ae6fe210..b6e8bede3 100644
--- a/DeviceAdapters/CNCMicroscope/RAMPSStage/RAMPS.vcxproj
+++ b/DeviceAdapters/CNCMicroscope/RAMPSStage/RAMPS.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/CSUW1/CSUW1.vcxproj b/DeviceAdapters/CSUW1/CSUW1.vcxproj
index 126183015..cc1771a64 100644
--- a/DeviceAdapters/CSUW1/CSUW1.vcxproj
+++ b/DeviceAdapters/CSUW1/CSUW1.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ChuoSeiki_MD5000/ChuoSeiki_MD5000.vcxproj b/DeviceAdapters/ChuoSeiki_MD5000/ChuoSeiki_MD5000.vcxproj
index 74e893589..443903f01 100644
--- a/DeviceAdapters/ChuoSeiki_MD5000/ChuoSeiki_MD5000.vcxproj
+++ b/DeviceAdapters/ChuoSeiki_MD5000/ChuoSeiki_MD5000.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
false
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/ChuoSeiki_QT/ChuoSeiki_QT.vcxproj b/DeviceAdapters/ChuoSeiki_QT/ChuoSeiki_QT.vcxproj
index 1aad1c44a..d1178a235 100644
--- a/DeviceAdapters/ChuoSeiki_QT/ChuoSeiki_QT.vcxproj
+++ b/DeviceAdapters/ChuoSeiki_QT/ChuoSeiki_QT.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Cobolt/Cobolt.vcxproj b/DeviceAdapters/Cobolt/Cobolt.vcxproj
index ed40fb2bf..7eb308896 100644
--- a/DeviceAdapters/Cobolt/Cobolt.vcxproj
+++ b/DeviceAdapters/Cobolt/Cobolt.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
NotSet
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/CoboltOfficial/CoboltOfficial.vcxproj b/DeviceAdapters/CoboltOfficial/CoboltOfficial.vcxproj
index c72d40364..3360f6e6b 100644
--- a/DeviceAdapters/CoboltOfficial/CoboltOfficial.vcxproj
+++ b/DeviceAdapters/CoboltOfficial/CoboltOfficial.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/CoherentCube/CoherentCube.vcxproj b/DeviceAdapters/CoherentCube/CoherentCube.vcxproj
index b12fd7fc7..99ec1f286 100644
--- a/DeviceAdapters/CoherentCube/CoherentCube.vcxproj
+++ b/DeviceAdapters/CoherentCube/CoherentCube.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/CoherentOBIS/CoherentOBIS.vcxproj b/DeviceAdapters/CoherentOBIS/CoherentOBIS.vcxproj
index dcd8a6e52..abc737923 100644
--- a/DeviceAdapters/CoherentOBIS/CoherentOBIS.vcxproj
+++ b/DeviceAdapters/CoherentOBIS/CoherentOBIS.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/CoherentScientificRemote/CoherentScientificRemote.vcxproj b/DeviceAdapters/CoherentScientificRemote/CoherentScientificRemote.vcxproj
index 1778fe481..8b1c814ae 100644
--- a/DeviceAdapters/CoherentScientificRemote/CoherentScientificRemote.vcxproj
+++ b/DeviceAdapters/CoherentScientificRemote/CoherentScientificRemote.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Conix/Conix.vcxproj b/DeviceAdapters/Conix/Conix.vcxproj
index c12d473c2..9e697d01d 100644
--- a/DeviceAdapters/Conix/Conix.vcxproj
+++ b/DeviceAdapters/Conix/Conix.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/CoolLEDpE300/pE300.vcxproj b/DeviceAdapters/CoolLEDpE300/pE300.vcxproj
index ee1ac8388..5a240a7a1 100644
--- a/DeviceAdapters/CoolLEDpE300/pE300.vcxproj
+++ b/DeviceAdapters/CoolLEDpE300/pE300.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/CoolLEDpE4000/pE4000.vcxproj b/DeviceAdapters/CoolLEDpE4000/pE4000.vcxproj
index 3eae4bafa..2b4015b07 100644
--- a/DeviceAdapters/CoolLEDpE4000/pE4000.vcxproj
+++ b/DeviceAdapters/CoolLEDpE4000/pE4000.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Corvus/Corvus.vcxproj b/DeviceAdapters/Corvus/Corvus.vcxproj
index eba0ee6b9..a395a0479 100644
--- a/DeviceAdapters/Corvus/Corvus.vcxproj
+++ b/DeviceAdapters/Corvus/Corvus.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/DTOpenLayer/DTOpenLayer.vcxproj b/DeviceAdapters/DTOpenLayer/DTOpenLayer.vcxproj
index 6e3e9e09b..db94da919 100644
--- a/DeviceAdapters/DTOpenLayer/DTOpenLayer.vcxproj
+++ b/DeviceAdapters/DTOpenLayer/DTOpenLayer.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/DirectElectron/vsprojects/DECamera.vcxproj b/DeviceAdapters/DirectElectron/vsprojects/DECamera.vcxproj
index ffd6e9b6b..bc8b63b77 100644
--- a/DeviceAdapters/DirectElectron/vsprojects/DECamera.vcxproj
+++ b/DeviceAdapters/DirectElectron/vsprojects/DECamera.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/DirectElectron/vsprojects/DEClientLib.vcxproj b/DeviceAdapters/DirectElectron/vsprojects/DEClientLib.vcxproj
index 2efd13095..3aa7bb6d6 100644
--- a/DeviceAdapters/DirectElectron/vsprojects/DEClientLib.vcxproj
+++ b/DeviceAdapters/DirectElectron/vsprojects/DEClientLib.vcxproj
@@ -20,13 +20,13 @@
StaticLibrary
Unicode
- v142
+ v143
false
StaticLibrary
Unicode
- v142
+ v143
true
@@ -97,4 +97,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/DirectElectron/vsprojects/DEMessaging.vcxproj b/DeviceAdapters/DirectElectron/vsprojects/DEMessaging.vcxproj
index 20bfd106c..6efb50877 100644
--- a/DeviceAdapters/DirectElectron/vsprojects/DEMessaging.vcxproj
+++ b/DeviceAdapters/DirectElectron/vsprojects/DEMessaging.vcxproj
@@ -20,13 +20,13 @@
StaticLibrary
Unicode
- v142
+ v143
false
StaticLibrary
Unicode
- v142
+ v143
true
@@ -106,4 +106,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/Diskovery/Diskovery.vcxproj b/DeviceAdapters/Diskovery/Diskovery.vcxproj
index 9d537e7db..26a62bb34 100644
--- a/DeviceAdapters/Diskovery/Diskovery.vcxproj
+++ b/DeviceAdapters/Diskovery/Diskovery.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Dragonfly/Dragonfly.vcxproj b/DeviceAdapters/Dragonfly/Dragonfly.vcxproj
index 94dea928e..f07e24ad2 100644
--- a/DeviceAdapters/Dragonfly/Dragonfly.vcxproj
+++ b/DeviceAdapters/Dragonfly/Dragonfly.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ESP32/ESP32.vcxproj b/DeviceAdapters/ESP32/ESP32.vcxproj
index cfbd67cdd..de65f1311 100644
--- a/DeviceAdapters/ESP32/ESP32.vcxproj
+++ b/DeviceAdapters/ESP32/ESP32.vcxproj
@@ -32,13 +32,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/ETL/ETL.vcxproj b/DeviceAdapters/ETL/ETL.vcxproj
index 0a8350c0f..824dc4ee7 100644
--- a/DeviceAdapters/ETL/ETL.vcxproj
+++ b/DeviceAdapters/ETL/ETL.vcxproj
@@ -32,13 +32,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/FLICamera/FLICamera.vcxproj b/DeviceAdapters/FLICamera/FLICamera.vcxproj
index ab3d95c9f..52641a83e 100644
--- a/DeviceAdapters/FLICamera/FLICamera.vcxproj
+++ b/DeviceAdapters/FLICamera/FLICamera.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/FakeCamera/FakeCamera.vcxproj b/DeviceAdapters/FakeCamera/FakeCamera.vcxproj
index 5f17ae5a0..f86688b60 100644
--- a/DeviceAdapters/FakeCamera/FakeCamera.vcxproj
+++ b/DeviceAdapters/FakeCamera/FakeCamera.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Fli/FirstLightImagingCameras.vcxproj b/DeviceAdapters/Fli/FirstLightImagingCameras.vcxproj
index 97d40631b..b54e4d9b7 100644
--- a/DeviceAdapters/Fli/FirstLightImagingCameras.vcxproj
+++ b/DeviceAdapters/Fli/FirstLightImagingCameras.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/FreeSerialPort/FreeSerialPort.vcxproj b/DeviceAdapters/FreeSerialPort/FreeSerialPort.vcxproj
index 895843efb..1bebbbc19 100644
--- a/DeviceAdapters/FreeSerialPort/FreeSerialPort.vcxproj
+++ b/DeviceAdapters/FreeSerialPort/FreeSerialPort.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/GenericSLM/GenericSLM.vcxproj b/DeviceAdapters/GenericSLM/GenericSLM.vcxproj
index 25c64c9d9..7d5e256c5 100644
--- a/DeviceAdapters/GenericSLM/GenericSLM.vcxproj
+++ b/DeviceAdapters/GenericSLM/GenericSLM.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/GigECamera/GigECamera.vcxproj b/DeviceAdapters/GigECamera/GigECamera.vcxproj
index 292d8ccc0..7f7b8d4b1 100644
--- a/DeviceAdapters/GigECamera/GigECamera.vcxproj
+++ b/DeviceAdapters/GigECamera/GigECamera.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/HIDManager/HIDManager.vcxproj b/DeviceAdapters/HIDManager/HIDManager.vcxproj
index c7619795b..7b6cf3a8c 100644
--- a/DeviceAdapters/HIDManager/HIDManager.vcxproj
+++ b/DeviceAdapters/HIDManager/HIDManager.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/HamiltonMVP/HamiltonMVP.vcxproj b/DeviceAdapters/HamiltonMVP/HamiltonMVP.vcxproj
index 321c9c0b6..ae7e5c341 100644
--- a/DeviceAdapters/HamiltonMVP/HamiltonMVP.vcxproj
+++ b/DeviceAdapters/HamiltonMVP/HamiltonMVP.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/HydraLMT200/Hydra.vcxproj b/DeviceAdapters/HydraLMT200/Hydra.vcxproj
index d1bd18c01..66854c804 100644
--- a/DeviceAdapters/HydraLMT200/Hydra.vcxproj
+++ b/DeviceAdapters/HydraLMT200/Hydra.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/IDSPeak/IDSPeak.vcxproj b/DeviceAdapters/IDSPeak/IDSPeak.vcxproj
index 95c7f99e3..431e2f805 100644
--- a/DeviceAdapters/IDSPeak/IDSPeak.vcxproj
+++ b/DeviceAdapters/IDSPeak/IDSPeak.vcxproj
@@ -35,13 +35,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/IDS_uEye/IDS_uEye.vcxproj b/DeviceAdapters/IDS_uEye/IDS_uEye.vcxproj
index bb8eaf744..9e459879a 100644
--- a/DeviceAdapters/IDS_uEye/IDS_uEye.vcxproj
+++ b/DeviceAdapters/IDS_uEye/IDS_uEye.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
@@ -102,4 +102,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/IIDC/IIDC.vcxproj b/DeviceAdapters/IIDC/IIDC.vcxproj
index aaf3284c3..19eb2265b 100644
--- a/DeviceAdapters/IIDC/IIDC.vcxproj
+++ b/DeviceAdapters/IIDC/IIDC.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/IlluminateLEDArray/LEDArray.vcxproj b/DeviceAdapters/IlluminateLEDArray/LEDArray.vcxproj
index 4c49f2a70..5471bccf6 100644
--- a/DeviceAdapters/IlluminateLEDArray/LEDArray.vcxproj
+++ b/DeviceAdapters/IlluminateLEDArray/LEDArray.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ImageProcessorChain/ImageProcessorChain.vcxproj b/DeviceAdapters/ImageProcessorChain/ImageProcessorChain.vcxproj
index e97daa27c..6d7b879c1 100644
--- a/DeviceAdapters/ImageProcessorChain/ImageProcessorChain.vcxproj
+++ b/DeviceAdapters/ImageProcessorChain/ImageProcessorChain.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/IntegratedLaserEngine/IntegratedLaserEngine.vcxproj b/DeviceAdapters/IntegratedLaserEngine/IntegratedLaserEngine.vcxproj
index a021d2ebb..b2fb25807 100644
--- a/DeviceAdapters/IntegratedLaserEngine/IntegratedLaserEngine.vcxproj
+++ b/DeviceAdapters/IntegratedLaserEngine/IntegratedLaserEngine.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/IsmatecMCP/IsmatecMCP.vcxproj b/DeviceAdapters/IsmatecMCP/IsmatecMCP.vcxproj
index cd3180593..a0bf24f24 100644
--- a/DeviceAdapters/IsmatecMCP/IsmatecMCP.vcxproj
+++ b/DeviceAdapters/IsmatecMCP/IsmatecMCP.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/JAI/JAI.vcxproj b/DeviceAdapters/JAI/JAI.vcxproj
index 999abf8b5..2bb018861 100644
--- a/DeviceAdapters/JAI/JAI.vcxproj
+++ b/DeviceAdapters/JAI/JAI.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/K8055/K8055.vcxproj b/DeviceAdapters/K8055/K8055.vcxproj
index fe862a340..d572c5a7e 100644
--- a/DeviceAdapters/K8055/K8055.vcxproj
+++ b/DeviceAdapters/K8055/K8055.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
NotSet
true
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/K8061/K8061.vcxproj b/DeviceAdapters/K8061/K8061.vcxproj
index 34ade99ff..605ec644c 100644
--- a/DeviceAdapters/K8061/K8061.vcxproj
+++ b/DeviceAdapters/K8061/K8061.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/KuriosLCTF/KuriosLCTF.vcxproj b/DeviceAdapters/KuriosLCTF/KuriosLCTF.vcxproj
index 1b134e9c9..832ae4d4b 100644
--- a/DeviceAdapters/KuriosLCTF/KuriosLCTF.vcxproj
+++ b/DeviceAdapters/KuriosLCTF/KuriosLCTF.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/LaserQuantumLaser/LaserQuantumLaser.vcxproj b/DeviceAdapters/LaserQuantumLaser/LaserQuantumLaser.vcxproj
index 043ae77b1..c857bbe23 100644
--- a/DeviceAdapters/LaserQuantumLaser/LaserQuantumLaser.vcxproj
+++ b/DeviceAdapters/LaserQuantumLaser/LaserQuantumLaser.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LeicaDMI/LeicaDMI.vcxproj b/DeviceAdapters/LeicaDMI/LeicaDMI.vcxproj
index 887b9b6f2..8d768ad4d 100644
--- a/DeviceAdapters/LeicaDMI/LeicaDMI.vcxproj
+++ b/DeviceAdapters/LeicaDMI/LeicaDMI.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LeicaDMR/LeicaDMR.vcxproj b/DeviceAdapters/LeicaDMR/LeicaDMR.vcxproj
index af4c61796..58d6fcc53 100644
--- a/DeviceAdapters/LeicaDMR/LeicaDMR.vcxproj
+++ b/DeviceAdapters/LeicaDMR/LeicaDMR.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LeicaDMSTC/LeicaDMSTC.vcxproj b/DeviceAdapters/LeicaDMSTC/LeicaDMSTC.vcxproj
index e3b42ae2d..8188da47b 100644
--- a/DeviceAdapters/LeicaDMSTC/LeicaDMSTC.vcxproj
+++ b/DeviceAdapters/LeicaDMSTC/LeicaDMSTC.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LightSheetManager/LightSheetManager.vcxproj b/DeviceAdapters/LightSheetManager/LightSheetManager.vcxproj
index 0ad3ea46b..f826188e4 100644
--- a/DeviceAdapters/LightSheetManager/LightSheetManager.vcxproj
+++ b/DeviceAdapters/LightSheetManager/LightSheetManager.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Ludl/Ludl.vcxproj b/DeviceAdapters/Ludl/Ludl.vcxproj
index 0d5690b51..b94fdf0c4 100644
--- a/DeviceAdapters/Ludl/Ludl.vcxproj
+++ b/DeviceAdapters/Ludl/Ludl.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LudlLow/LudlLow.vcxproj b/DeviceAdapters/LudlLow/LudlLow.vcxproj
index 28c8b1955..893776672 100644
--- a/DeviceAdapters/LudlLow/LudlLow.vcxproj
+++ b/DeviceAdapters/LudlLow/LudlLow.vcxproj
@@ -19,13 +19,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Lumencor/Lumencor.vcxproj b/DeviceAdapters/Lumencor/Lumencor.vcxproj
index 9c65d2d99..0d3a50abc 100644
--- a/DeviceAdapters/Lumencor/Lumencor.vcxproj
+++ b/DeviceAdapters/Lumencor/Lumencor.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LumencorCIA/LumencorCIA.vcxproj b/DeviceAdapters/LumencorCIA/LumencorCIA.vcxproj
index d01624337..4fec1ee4f 100644
--- a/DeviceAdapters/LumencorCIA/LumencorCIA.vcxproj
+++ b/DeviceAdapters/LumencorCIA/LumencorCIA.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/LumencorSpectra/LumencorSpectra.vcxproj b/DeviceAdapters/LumencorSpectra/LumencorSpectra.vcxproj
index f5a0adb18..8bfdf9eb2 100644
--- a/DeviceAdapters/LumencorSpectra/LumencorSpectra.vcxproj
+++ b/DeviceAdapters/LumencorSpectra/LumencorSpectra.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Lumenera/Lumenera.vcxproj b/DeviceAdapters/Lumenera/Lumenera.vcxproj
index dea13c7f1..186af0299 100644
--- a/DeviceAdapters/Lumenera/Lumenera.vcxproj
+++ b/DeviceAdapters/Lumenera/Lumenera.vcxproj
@@ -34,13 +34,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/MCCDAQ/MCCDAQ.vcxproj b/DeviceAdapters/MCCDAQ/MCCDAQ.vcxproj
index 57d213f8a..69e2a6e8a 100644
--- a/DeviceAdapters/MCCDAQ/MCCDAQ.vcxproj
+++ b/DeviceAdapters/MCCDAQ/MCCDAQ.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MCL_MicroDrive/MCL_MicroDrive.vcxproj b/DeviceAdapters/MCL_MicroDrive/MCL_MicroDrive.vcxproj
index c2b0d4359..1544ba826 100644
--- a/DeviceAdapters/MCL_MicroDrive/MCL_MicroDrive.vcxproj
+++ b/DeviceAdapters/MCL_MicroDrive/MCL_MicroDrive.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MCL_NanoDrive/MCL_NanoDrive.vcxproj b/DeviceAdapters/MCL_NanoDrive/MCL_NanoDrive.vcxproj
index 3bb8f546f..826aecffc 100644
--- a/DeviceAdapters/MCL_NanoDrive/MCL_NanoDrive.vcxproj
+++ b/DeviceAdapters/MCL_NanoDrive/MCL_NanoDrive.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MP285/MP285.vcxproj b/DeviceAdapters/MP285/MP285.vcxproj
index 3bfd70041..96a34e905 100644
--- a/DeviceAdapters/MP285/MP285.vcxproj
+++ b/DeviceAdapters/MP285/MP285.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
MultiByte
false
- v142
+ v143
false
DynamicLibrary
MultiByte
false
- v142
+ v143
true
diff --git a/DeviceAdapters/MPBLaser/MPBLaser.vcxproj b/DeviceAdapters/MPBLaser/MPBLaser.vcxproj
index 8dda7965e..7a8af85ae 100644
--- a/DeviceAdapters/MPBLaser/MPBLaser.vcxproj
+++ b/DeviceAdapters/MPBLaser/MPBLaser.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/MT20/MT20.vcxproj b/DeviceAdapters/MT20/MT20.vcxproj
index 191021525..0de543e6e 100644
--- a/DeviceAdapters/MT20/MT20.vcxproj
+++ b/DeviceAdapters/MT20/MT20.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MaestroServo/MaestroServo.vcxproj b/DeviceAdapters/MaestroServo/MaestroServo.vcxproj
index 902cb3cfe..64bb221bb 100644
--- a/DeviceAdapters/MaestroServo/MaestroServo.vcxproj
+++ b/DeviceAdapters/MaestroServo/MaestroServo.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Marzhauser-LStep/MarzhauserLStep.vcxproj b/DeviceAdapters/Marzhauser-LStep/MarzhauserLStep.vcxproj
index fa2e03ee6..b1c64d771 100644
--- a/DeviceAdapters/Marzhauser-LStep/MarzhauserLStep.vcxproj
+++ b/DeviceAdapters/Marzhauser-LStep/MarzhauserLStep.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Marzhauser/Marzhauser.vcxproj b/DeviceAdapters/Marzhauser/Marzhauser.vcxproj
index fcb356a89..20e312f55 100644
--- a/DeviceAdapters/Marzhauser/Marzhauser.vcxproj
+++ b/DeviceAdapters/Marzhauser/Marzhauser.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MarzhauserLStepOld/MarzhauserLStepOld.vcxproj b/DeviceAdapters/MarzhauserLStepOld/MarzhauserLStepOld.vcxproj
index 370749962..6dce28e8b 100644
--- a/DeviceAdapters/MarzhauserLStepOld/MarzhauserLStepOld.vcxproj
+++ b/DeviceAdapters/MarzhauserLStepOld/MarzhauserLStepOld.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/MatrixVision/MatrixVision.vcxproj b/DeviceAdapters/MatrixVision/MatrixVision.vcxproj
index aa1dcc218..b943002dd 100644
--- a/DeviceAdapters/MatrixVision/MatrixVision.vcxproj
+++ b/DeviceAdapters/MatrixVision/MatrixVision.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/MeadowlarkLC/MeadowlarkLC.vcxproj b/DeviceAdapters/MeadowlarkLC/MeadowlarkLC.vcxproj
index f8ac1f3fc..b5ccf14ff 100644
--- a/DeviceAdapters/MeadowlarkLC/MeadowlarkLC.vcxproj
+++ b/DeviceAdapters/MeadowlarkLC/MeadowlarkLC.vcxproj
@@ -35,13 +35,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/MicroFPGA/MicroFPGA.vcxproj b/DeviceAdapters/MicroFPGA/MicroFPGA.vcxproj
index 169a838af..597536cfe 100644
--- a/DeviceAdapters/MicroFPGA/MicroFPGA.vcxproj
+++ b/DeviceAdapters/MicroFPGA/MicroFPGA.vcxproj
@@ -34,13 +34,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MicroPoint/MicroPoint.vcxproj b/DeviceAdapters/MicroPoint/MicroPoint.vcxproj
index be9ab365e..ca33d0384 100644
--- a/DeviceAdapters/MicroPoint/MicroPoint.vcxproj
+++ b/DeviceAdapters/MicroPoint/MicroPoint.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Mightex/Mightex.vcxproj b/DeviceAdapters/Mightex/Mightex.vcxproj
index bf3db316d..a5e06df46 100644
--- a/DeviceAdapters/Mightex/Mightex.vcxproj
+++ b/DeviceAdapters/Mightex/Mightex.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Mightex_BLS/Mightex_BLS.vcxproj b/DeviceAdapters/Mightex_BLS/Mightex_BLS.vcxproj
index 2bdba5ef4..ab884c39a 100644
--- a/DeviceAdapters/Mightex_BLS/Mightex_BLS.vcxproj
+++ b/DeviceAdapters/Mightex_BLS/Mightex_BLS.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Mightex_C_Cam/Mightex_C_Cam.vcxproj b/DeviceAdapters/Mightex_C_Cam/Mightex_C_Cam.vcxproj
index 4c779091b..626e76b92 100644
--- a/DeviceAdapters/Mightex_C_Cam/Mightex_C_Cam.vcxproj
+++ b/DeviceAdapters/Mightex_C_Cam/Mightex_C_Cam.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
MultiByte
- v142
+ v143
DynamicLibrary
false
true
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/Modbus/Modbus.vcxproj b/DeviceAdapters/Modbus/Modbus.vcxproj
index 8d71ba351..3548e1c98 100644
--- a/DeviceAdapters/Modbus/Modbus.vcxproj
+++ b/DeviceAdapters/Modbus/Modbus.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Motic/MoticCamera.vcxproj b/DeviceAdapters/Motic/MoticCamera.vcxproj
index ec6d8c87a..6195ad8ff 100644
--- a/DeviceAdapters/Motic/MoticCamera.vcxproj
+++ b/DeviceAdapters/Motic/MoticCamera.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/MoticMicroscope/MoticMicroscope.vcxproj b/DeviceAdapters/MoticMicroscope/MoticMicroscope.vcxproj
index 5e1b34bb9..1cfa2dbcc 100644
--- a/DeviceAdapters/MoticMicroscope/MoticMicroscope.vcxproj
+++ b/DeviceAdapters/MoticMicroscope/MoticMicroscope.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/NI100X/NI100X.vcxproj b/DeviceAdapters/NI100X/NI100X.vcxproj
index 1029f9b95..d649e74f7 100644
--- a/DeviceAdapters/NI100X/NI100X.vcxproj
+++ b/DeviceAdapters/NI100X/NI100X.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/NIDAQ/NIDAQ.vcxproj b/DeviceAdapters/NIDAQ/NIDAQ.vcxproj
index 587636144..8dbbf87a2 100644
--- a/DeviceAdapters/NIDAQ/NIDAQ.vcxproj
+++ b/DeviceAdapters/NIDAQ/NIDAQ.vcxproj
@@ -22,13 +22,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/NIMultiAnalog/NIMultiAnalog.vcxproj b/DeviceAdapters/NIMultiAnalog/NIMultiAnalog.vcxproj
index 2e6d5f48c..d75fd12ba 100644
--- a/DeviceAdapters/NIMultiAnalog/NIMultiAnalog.vcxproj
+++ b/DeviceAdapters/NIMultiAnalog/NIMultiAnalog.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/NKTSuperK/NKTSuperK.vcxproj b/DeviceAdapters/NKTSuperK/NKTSuperK.vcxproj
index 9f037cd74..83016b815 100644
--- a/DeviceAdapters/NKTSuperK/NKTSuperK.vcxproj
+++ b/DeviceAdapters/NKTSuperK/NKTSuperK.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
MultiByte
- v142
+ v143
DynamicLibrary
false
true
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/Neos/Neos.vcxproj b/DeviceAdapters/Neos/Neos.vcxproj
index dd81d71f2..3f434d5ca 100644
--- a/DeviceAdapters/Neos/Neos.vcxproj
+++ b/DeviceAdapters/Neos/Neos.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/NewportCONEX/NewportCONEX.vcxproj b/DeviceAdapters/NewportCONEX/NewportCONEX.vcxproj
index ea48364a7..897e3b968 100644
--- a/DeviceAdapters/NewportCONEX/NewportCONEX.vcxproj
+++ b/DeviceAdapters/NewportCONEX/NewportCONEX.vcxproj
@@ -21,12 +21,12 @@
DynamicLibrary
MultiByte
- v142
+ v143
DynamicLibrary
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/NewportSMC/NewportSMC.vcxproj b/DeviceAdapters/NewportSMC/NewportSMC.vcxproj
index 66e5e0f54..93eb74427 100644
--- a/DeviceAdapters/NewportSMC/NewportSMC.vcxproj
+++ b/DeviceAdapters/NewportSMC/NewportSMC.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Nikon/Nikon.vcxproj b/DeviceAdapters/Nikon/Nikon.vcxproj
index c2707f621..56fb737f3 100644
--- a/DeviceAdapters/Nikon/Nikon.vcxproj
+++ b/DeviceAdapters/Nikon/Nikon.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/NikonTE2000/NikonTE2000.vcxproj b/DeviceAdapters/NikonTE2000/NikonTE2000.vcxproj
index 2a5ab7212..b71882b3c 100644
--- a/DeviceAdapters/NikonTE2000/NikonTE2000.vcxproj
+++ b/DeviceAdapters/NikonTE2000/NikonTE2000.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/NotificationTester/NotificationTester.vcxproj b/DeviceAdapters/NotificationTester/NotificationTester.vcxproj
index 56a5b3dfc..60218fdd5 100644
--- a/DeviceAdapters/NotificationTester/NotificationTester.vcxproj
+++ b/DeviceAdapters/NotificationTester/NotificationTester.vcxproj
@@ -33,13 +33,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/OVP_ECS2/OVP_ECS2.vcxproj b/DeviceAdapters/OVP_ECS2/OVP_ECS2.vcxproj
index 5817996fa..0c6432cfb 100644
--- a/DeviceAdapters/OVP_ECS2/OVP_ECS2.vcxproj
+++ b/DeviceAdapters/OVP_ECS2/OVP_ECS2.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ObjectiveImaging/ObjectiveImaging.vcxproj b/DeviceAdapters/ObjectiveImaging/ObjectiveImaging.vcxproj
index d871fbf04..f5e1a30a7 100644
--- a/DeviceAdapters/ObjectiveImaging/ObjectiveImaging.vcxproj
+++ b/DeviceAdapters/ObjectiveImaging/ObjectiveImaging.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
Unicode
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/Okolab/Okolab.vcxproj b/DeviceAdapters/Okolab/Okolab.vcxproj
index 1b0361b4a..3dc6c36aa 100644
--- a/DeviceAdapters/Okolab/Okolab.vcxproj
+++ b/DeviceAdapters/Okolab/Okolab.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Omicron/Omicron.vcxproj b/DeviceAdapters/Omicron/Omicron.vcxproj
index cf0b93787..b2570f5fc 100644
--- a/DeviceAdapters/Omicron/Omicron.vcxproj
+++ b/DeviceAdapters/Omicron/Omicron.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/OpenCVgrabber/OpenCVgrabber.vcxproj b/DeviceAdapters/OpenCVgrabber/OpenCVgrabber.vcxproj
index fe45fe03f..394c5b5a9 100644
--- a/DeviceAdapters/OpenCVgrabber/OpenCVgrabber.vcxproj
+++ b/DeviceAdapters/OpenCVgrabber/OpenCVgrabber.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
NotSet
true
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/Oxxius/Oxxius.vcxproj b/DeviceAdapters/Oxxius/Oxxius.vcxproj
index 42bb6e1be..b888e78e3 100644
--- a/DeviceAdapters/Oxxius/Oxxius.vcxproj
+++ b/DeviceAdapters/Oxxius/Oxxius.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/OxxiusCombiner/OxxiusCombiner.vcxproj b/DeviceAdapters/OxxiusCombiner/OxxiusCombiner.vcxproj
index 16a36d06e..b3111bca7 100644
--- a/DeviceAdapters/OxxiusCombiner/OxxiusCombiner.vcxproj
+++ b/DeviceAdapters/OxxiusCombiner/OxxiusCombiner.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PCO_Generic/PCO_Camera.vcxproj b/DeviceAdapters/PCO_Generic/PCO_Camera.vcxproj
index 88a88e36b..81361d9f1 100644
--- a/DeviceAdapters/PCO_Generic/PCO_Camera.vcxproj
+++ b/DeviceAdapters/PCO_Generic/PCO_Camera.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PI/PI.vcxproj b/DeviceAdapters/PI/PI.vcxproj
index 8b8ee970b..56964287b 100644
--- a/DeviceAdapters/PI/PI.vcxproj
+++ b/DeviceAdapters/PI/PI.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PICAM/PICAM.vcxproj b/DeviceAdapters/PICAM/PICAM.vcxproj
index b6e8592a0..599ad7b71 100644
--- a/DeviceAdapters/PICAM/PICAM.vcxproj
+++ b/DeviceAdapters/PICAM/PICAM.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PIEZOCONCEPT/PIEZOCONCEPT.vcxproj b/DeviceAdapters/PIEZOCONCEPT/PIEZOCONCEPT.vcxproj
index 63d3e2653..9f41d1f0b 100644
--- a/DeviceAdapters/PIEZOCONCEPT/PIEZOCONCEPT.vcxproj
+++ b/DeviceAdapters/PIEZOCONCEPT/PIEZOCONCEPT.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/PI_GCS/PI_GCS.vcxproj b/DeviceAdapters/PI_GCS/PI_GCS.vcxproj
index 105bb7da1..3a1d6b893 100644
--- a/DeviceAdapters/PI_GCS/PI_GCS.vcxproj
+++ b/DeviceAdapters/PI_GCS/PI_GCS.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj b/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj
index da62c13af..d627f3a42 100644
--- a/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj
+++ b/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj.filters b/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj.filters
index a70291a09..359f88259 100644
--- a/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj.filters
+++ b/DeviceAdapters/PI_GCS_2/PI_GCS_2.vcxproj.filters
@@ -64,5 +64,8 @@
Header Files
+
+ Header Files
+
\ No newline at end of file
diff --git a/DeviceAdapters/PVCAM/PVCAM.vcxproj b/DeviceAdapters/PVCAM/PVCAM.vcxproj
index 7641d2817..87cdf848d 100644
--- a/DeviceAdapters/PVCAM/PVCAM.vcxproj
+++ b/DeviceAdapters/PVCAM/PVCAM.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ParallelPort/ParallelPort.vcxproj b/DeviceAdapters/ParallelPort/ParallelPort.vcxproj
index fad743c48..1d9ee12b2 100644
--- a/DeviceAdapters/ParallelPort/ParallelPort.vcxproj
+++ b/DeviceAdapters/ParallelPort/ParallelPort.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PeCon2000/PeCon2000.vcxproj b/DeviceAdapters/PeCon2000/PeCon2000.vcxproj
index e259db56b..34797dd4d 100644
--- a/DeviceAdapters/PeCon2000/PeCon2000.vcxproj
+++ b/DeviceAdapters/PeCon2000/PeCon2000.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
MultiByte
- v142
+ v143
DynamicLibrary
false
true
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/Pecon/Pecon.vcxproj b/DeviceAdapters/Pecon/Pecon.vcxproj
index 5947142f6..0d5203605 100644
--- a/DeviceAdapters/Pecon/Pecon.vcxproj
+++ b/DeviceAdapters/Pecon/Pecon.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PicardStage/PicardStage.vcxproj b/DeviceAdapters/PicardStage/PicardStage.vcxproj
index 61ddf8d9f..f58ed1dc0 100644
--- a/DeviceAdapters/PicardStage/PicardStage.vcxproj
+++ b/DeviceAdapters/PicardStage/PicardStage.vcxproj
@@ -20,12 +20,12 @@
DynamicLibrary
MultiByte
- v142
+ v143
DynamicLibrary
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/Piezosystem_30DV50/Piezosystem_30DV50.vcxproj b/DeviceAdapters/Piezosystem_30DV50/Piezosystem_30DV50.vcxproj
index 823098b0a..ed3b6e6a8 100644
--- a/DeviceAdapters/Piezosystem_30DV50/Piezosystem_30DV50.vcxproj
+++ b/DeviceAdapters/Piezosystem_30DV50/Piezosystem_30DV50.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Piezosystem_NV120_1/Piezosystem_NV120_1.vcxproj b/DeviceAdapters/Piezosystem_NV120_1/Piezosystem_NV120_1.vcxproj
index f32c4a29d..2b4ebb59a 100644
--- a/DeviceAdapters/Piezosystem_NV120_1/Piezosystem_NV120_1.vcxproj
+++ b/DeviceAdapters/Piezosystem_NV120_1/Piezosystem_NV120_1.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Piezosystem_NV40_1/Piezosystem_NV40_1.vcxproj b/DeviceAdapters/Piezosystem_NV40_1/Piezosystem_NV40_1.vcxproj
index c61bea520..7bfdd0df9 100644
--- a/DeviceAdapters/Piezosystem_NV40_1/Piezosystem_NV40_1.vcxproj
+++ b/DeviceAdapters/Piezosystem_NV40_1/Piezosystem_NV40_1.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Piezosystem_NV40_3/Piezosystem_NV40_3.vcxproj b/DeviceAdapters/Piezosystem_NV40_3/Piezosystem_NV40_3.vcxproj
index b6fce56d0..da15a7007 100644
--- a/DeviceAdapters/Piezosystem_NV40_3/Piezosystem_NV40_3.vcxproj
+++ b/DeviceAdapters/Piezosystem_NV40_3/Piezosystem_NV40_3.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Piezosystem_dDrive/Piezosystem_dDrive.vcxproj b/DeviceAdapters/Piezosystem_dDrive/Piezosystem_dDrive.vcxproj
index 2b9c5d776..8fde0819d 100644
--- a/DeviceAdapters/Piezosystem_dDrive/Piezosystem_dDrive.vcxproj
+++ b/DeviceAdapters/Piezosystem_dDrive/Piezosystem_dDrive.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Piper/Piper.vcxproj b/DeviceAdapters/Piper/Piper.vcxproj
index 000c16374..db1bc34b9 100644
--- a/DeviceAdapters/Piper/Piper.vcxproj
+++ b/DeviceAdapters/Piper/Piper.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Pixelink/Pixelink.vcxproj b/DeviceAdapters/Pixelink/Pixelink.vcxproj
index 163c7d3e1..7fd9c90fc 100644
--- a/DeviceAdapters/Pixelink/Pixelink.vcxproj
+++ b/DeviceAdapters/Pixelink/Pixelink.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PointGrey/PointGrey.vcxproj b/DeviceAdapters/PointGrey/PointGrey.vcxproj
index fecc2f1f0..5faee892a 100644
--- a/DeviceAdapters/PointGrey/PointGrey.vcxproj
+++ b/DeviceAdapters/PointGrey/PointGrey.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PrecisExcite/PrecisExcite.vcxproj b/DeviceAdapters/PrecisExcite/PrecisExcite.vcxproj
index 643e6dc3f..0abba583f 100644
--- a/DeviceAdapters/PrecisExcite/PrecisExcite.vcxproj
+++ b/DeviceAdapters/PrecisExcite/PrecisExcite.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Prior/Prior.vcxproj b/DeviceAdapters/Prior/Prior.vcxproj
index e351b357d..f2679eb97 100644
--- a/DeviceAdapters/Prior/Prior.vcxproj
+++ b/DeviceAdapters/Prior/Prior.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PriorLegacy/PriorLegacy.vcxproj b/DeviceAdapters/PriorLegacy/PriorLegacy.vcxproj
index eaade2c19..ad5c73372 100644
--- a/DeviceAdapters/PriorLegacy/PriorLegacy.vcxproj
+++ b/DeviceAdapters/PriorLegacy/PriorLegacy.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/PrizmatixDevice/PrizmatixDevice.vcxproj b/DeviceAdapters/PrizmatixDevice/PrizmatixDevice.vcxproj
index 11c77052f..7ecd83c11 100644
--- a/DeviceAdapters/PrizmatixDevice/PrizmatixDevice.vcxproj
+++ b/DeviceAdapters/PrizmatixDevice/PrizmatixDevice.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/QCam/QCam.vcxproj b/DeviceAdapters/QCam/QCam.vcxproj
index 3953ddae1..9ee86baed 100644
--- a/DeviceAdapters/QCam/QCam.vcxproj
+++ b/DeviceAdapters/QCam/QCam.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/QSI/QSI.vcxproj b/DeviceAdapters/QSI/QSI.vcxproj
index a70bba956..0e0892992 100644
--- a/DeviceAdapters/QSI/QSI.vcxproj
+++ b/DeviceAdapters/QSI/QSI.vcxproj
@@ -34,13 +34,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
@@ -109,4 +109,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/Rapp/Rapp.vcxproj b/DeviceAdapters/Rapp/Rapp.vcxproj
index 553eacc49..59a69de92 100644
--- a/DeviceAdapters/Rapp/Rapp.vcxproj
+++ b/DeviceAdapters/Rapp/Rapp.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
@@ -106,4 +106,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/RaptorEPIX/HoribaEPIX.vcxproj b/DeviceAdapters/RaptorEPIX/HoribaEPIX.vcxproj
index 4ad975482..ab6423ae9 100644
--- a/DeviceAdapters/RaptorEPIX/HoribaEPIX.vcxproj
+++ b/DeviceAdapters/RaptorEPIX/HoribaEPIX.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/RaptorEPIX/RaptorEPIX.vcxproj b/DeviceAdapters/RaptorEPIX/RaptorEPIX.vcxproj
index be45906b0..0dfa4b6ad 100644
--- a/DeviceAdapters/RaptorEPIX/RaptorEPIX.vcxproj
+++ b/DeviceAdapters/RaptorEPIX/RaptorEPIX.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Sapphire/Sapphire.vcxproj b/DeviceAdapters/Sapphire/Sapphire.vcxproj
index 74abbaf9f..7a3700b2a 100644
--- a/DeviceAdapters/Sapphire/Sapphire.vcxproj
+++ b/DeviceAdapters/Sapphire/Sapphire.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Scientifica/Scientifica.vcxproj b/DeviceAdapters/Scientifica/Scientifica.vcxproj
index 92a90ecdd..36195e32a 100644
--- a/DeviceAdapters/Scientifica/Scientifica.vcxproj
+++ b/DeviceAdapters/Scientifica/Scientifica.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ScopeLED/ScopeLED.vcxproj b/DeviceAdapters/ScopeLED/ScopeLED.vcxproj
index 751a35590..896c3e645 100644
--- a/DeviceAdapters/ScopeLED/ScopeLED.vcxproj
+++ b/DeviceAdapters/ScopeLED/ScopeLED.vcxproj
@@ -19,12 +19,12 @@
DynamicLibrary
- v142
+ v143
false
DynamicLibrary
- v142
+ v143
true
diff --git a/DeviceAdapters/SequenceTester/SequenceTester.vcxproj b/DeviceAdapters/SequenceTester/SequenceTester.vcxproj
index 5b63e7852..b11b54315 100644
--- a/DeviceAdapters/SequenceTester/SequenceTester.vcxproj
+++ b/DeviceAdapters/SequenceTester/SequenceTester.vcxproj
@@ -43,13 +43,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/SerialManager/SerialManager.vcxproj b/DeviceAdapters/SerialManager/SerialManager.vcxproj
index 8a40c4b94..15f17ad82 100644
--- a/DeviceAdapters/SerialManager/SerialManager.vcxproj
+++ b/DeviceAdapters/SerialManager/SerialManager.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/SigmaKoki/SigmaKoki.vcxproj b/DeviceAdapters/SigmaKoki/SigmaKoki.vcxproj
index 7e042b67b..b278ecd50 100644
--- a/DeviceAdapters/SigmaKoki/SigmaKoki.vcxproj
+++ b/DeviceAdapters/SigmaKoki/SigmaKoki.vcxproj
@@ -22,13 +22,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Skyra/Skyra.vcxproj b/DeviceAdapters/Skyra/Skyra.vcxproj
index 231b6a4a3..2fc8bdbde 100644
--- a/DeviceAdapters/Skyra/Skyra.vcxproj
+++ b/DeviceAdapters/Skyra/Skyra.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
NotSet
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/SmarActHCU-3D/SmarActHCU-3D.vcxproj b/DeviceAdapters/SmarActHCU-3D/SmarActHCU-3D.vcxproj
index 6082aa82c..5523e54f1 100644
--- a/DeviceAdapters/SmarActHCU-3D/SmarActHCU-3D.vcxproj
+++ b/DeviceAdapters/SmarActHCU-3D/SmarActHCU-3D.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/SouthPort/SouthPort.vcxproj b/DeviceAdapters/SouthPort/SouthPort.vcxproj
index 4a165d9b4..06cf7cbcb 100644
--- a/DeviceAdapters/SouthPort/SouthPort.vcxproj
+++ b/DeviceAdapters/SouthPort/SouthPort.vcxproj
@@ -19,13 +19,13 @@
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
diff --git a/DeviceAdapters/SpectralLMM5/SpectralLMM5.vcxproj b/DeviceAdapters/SpectralLMM5/SpectralLMM5.vcxproj
index b74dec662..4888d3227 100644
--- a/DeviceAdapters/SpectralLMM5/SpectralLMM5.vcxproj
+++ b/DeviceAdapters/SpectralLMM5/SpectralLMM5.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
NotSet
true
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/Spinnaker/SpinnakerCamera.vcxproj b/DeviceAdapters/Spinnaker/SpinnakerCamera.vcxproj
index 53197c8e3..6adc11e90 100644
--- a/DeviceAdapters/Spinnaker/SpinnakerCamera.vcxproj
+++ b/DeviceAdapters/Spinnaker/SpinnakerCamera.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Standa/Standa.vcxproj b/DeviceAdapters/Standa/Standa.vcxproj
index bdf0e090d..8ac1442d0 100644
--- a/DeviceAdapters/Standa/Standa.vcxproj
+++ b/DeviceAdapters/Standa/Standa.vcxproj
@@ -22,14 +22,14 @@
Unicode
false
true
- v142
+ v143
false
DynamicLibrary
Unicode
false
- v142
+ v143
true
diff --git a/DeviceAdapters/Standa8SMC4/Standa8SMC4.vcxproj b/DeviceAdapters/Standa8SMC4/Standa8SMC4.vcxproj
index 5b8c556cf..b6eb68981 100644
--- a/DeviceAdapters/Standa8SMC4/Standa8SMC4.vcxproj
+++ b/DeviceAdapters/Standa8SMC4/Standa8SMC4.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/StandaStage/StandaStage.vcxproj b/DeviceAdapters/StandaStage/StandaStage.vcxproj
index ebb29f7ad..42a613e3f 100644
--- a/DeviceAdapters/StandaStage/StandaStage.vcxproj
+++ b/DeviceAdapters/StandaStage/StandaStage.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/StarlightXpress/StarlightXpress.vcxproj b/DeviceAdapters/StarlightXpress/StarlightXpress.vcxproj
index f10db1205..683bedc52 100644
--- a/DeviceAdapters/StarlightXpress/StarlightXpress.vcxproj
+++ b/DeviceAdapters/StarlightXpress/StarlightXpress.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/SutterLambda/SutterLambda.vcxproj b/DeviceAdapters/SutterLambda/SutterLambda.vcxproj
index a9331534a..e7bf06df3 100644
--- a/DeviceAdapters/SutterLambda/SutterLambda.vcxproj
+++ b/DeviceAdapters/SutterLambda/SutterLambda.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
@@ -104,4 +104,4 @@
-
+
\ No newline at end of file
diff --git a/DeviceAdapters/SutterLambda2/SutterLambda2.vcxproj b/DeviceAdapters/SutterLambda2/SutterLambda2.vcxproj
index 4a2fe06bd..3bb1b2491 100644
--- a/DeviceAdapters/SutterLambda2/SutterLambda2.vcxproj
+++ b/DeviceAdapters/SutterLambda2/SutterLambda2.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/SutterLambdaParallelArduino/SutterLambdaParallelArduino.vcxproj b/DeviceAdapters/SutterLambdaParallelArduino/SutterLambdaParallelArduino.vcxproj
index 3e3a7b4de..efd6ffe49 100644
--- a/DeviceAdapters/SutterLambdaParallelArduino/SutterLambdaParallelArduino.vcxproj
+++ b/DeviceAdapters/SutterLambdaParallelArduino/SutterLambdaParallelArduino.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/SutterStage/SutterStage.vcxproj b/DeviceAdapters/SutterStage/SutterStage.vcxproj
index 8e1b40bbc..e5125c569 100644
--- a/DeviceAdapters/SutterStage/SutterStage.vcxproj
+++ b/DeviceAdapters/SutterStage/SutterStage.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/TCPIPPort/TCPIPPort.vcxproj b/DeviceAdapters/TCPIPPort/TCPIPPort.vcxproj
index 7125c6c0c..c15698eae 100644
--- a/DeviceAdapters/TCPIPPort/TCPIPPort.vcxproj
+++ b/DeviceAdapters/TCPIPPort/TCPIPPort.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/TISCam/TIScam.vcxproj b/DeviceAdapters/TISCam/TIScam.vcxproj
index 2f4fb6705..b67ae8b19 100644
--- a/DeviceAdapters/TISCam/TIScam.vcxproj
+++ b/DeviceAdapters/TISCam/TIScam.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/TSI/TSI.vcxproj b/DeviceAdapters/TSI/TSI.vcxproj
index 21c4d8f67..fdaec15a2 100644
--- a/DeviceAdapters/TSI/TSI.vcxproj
+++ b/DeviceAdapters/TSI/TSI.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/TUCam/MMTUCam.vcxproj b/DeviceAdapters/TUCam/MMTUCam.vcxproj
index 1c8845a52..17eb0adf7 100644
--- a/DeviceAdapters/TUCam/MMTUCam.vcxproj
+++ b/DeviceAdapters/TUCam/MMTUCam.vcxproj
@@ -21,12 +21,12 @@
DynamicLibrary
MultiByte
- v142
+ v143
DynamicLibrary
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/TeesnySLM/TeensySLM.vcxproj b/DeviceAdapters/TeesnySLM/TeensySLM.vcxproj
index a928f21b5..e6b909cc4 100644
--- a/DeviceAdapters/TeesnySLM/TeensySLM.vcxproj
+++ b/DeviceAdapters/TeesnySLM/TeensySLM.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Thorlabs/Thorlabs.vcxproj b/DeviceAdapters/Thorlabs/Thorlabs.vcxproj
index fa58362d9..7e2cfbef6 100644
--- a/DeviceAdapters/Thorlabs/Thorlabs.vcxproj
+++ b/DeviceAdapters/Thorlabs/Thorlabs.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsAPTStage/ThorlabsAPTStage.vcxproj b/DeviceAdapters/ThorlabsAPTStage/ThorlabsAPTStage.vcxproj
index 9fba9c6b8..44309b9a1 100644
--- a/DeviceAdapters/ThorlabsAPTStage/ThorlabsAPTStage.vcxproj
+++ b/DeviceAdapters/ThorlabsAPTStage/ThorlabsAPTStage.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsCHROLIS/ThorlabsCHROLIS.vcxproj b/DeviceAdapters/ThorlabsCHROLIS/ThorlabsCHROLIS.vcxproj
index 4b12160c8..9fbcbf4f3 100644
--- a/DeviceAdapters/ThorlabsCHROLIS/ThorlabsCHROLIS.vcxproj
+++ b/DeviceAdapters/ThorlabsCHROLIS/ThorlabsCHROLIS.vcxproj
@@ -33,13 +33,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/ThorlabsDCxxxx/ThorlabsDCxxxx.vcxproj b/DeviceAdapters/ThorlabsDCxxxx/ThorlabsDCxxxx.vcxproj
index d9b46f8c2..7d6363dab 100644
--- a/DeviceAdapters/ThorlabsDCxxxx/ThorlabsDCxxxx.vcxproj
+++ b/DeviceAdapters/ThorlabsDCxxxx/ThorlabsDCxxxx.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsElliptecSlider/ThorlabsElliptecSlider.vcxproj b/DeviceAdapters/ThorlabsElliptecSlider/ThorlabsElliptecSlider.vcxproj
index 18a3d60df..132b1b02b 100644
--- a/DeviceAdapters/ThorlabsElliptecSlider/ThorlabsElliptecSlider.vcxproj
+++ b/DeviceAdapters/ThorlabsElliptecSlider/ThorlabsElliptecSlider.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsFilterWheel/ThorlabsFilterWheel.vcxproj b/DeviceAdapters/ThorlabsFilterWheel/ThorlabsFilterWheel.vcxproj
index 457789049..9c875eb52 100644
--- a/DeviceAdapters/ThorlabsFilterWheel/ThorlabsFilterWheel.vcxproj
+++ b/DeviceAdapters/ThorlabsFilterWheel/ThorlabsFilterWheel.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsPM100x/ThorlabsPM100x.vcxproj b/DeviceAdapters/ThorlabsPM100x/ThorlabsPM100x.vcxproj
index c4478ee06..88edcff14 100644
--- a/DeviceAdapters/ThorlabsPM100x/ThorlabsPM100x.vcxproj
+++ b/DeviceAdapters/ThorlabsPM100x/ThorlabsPM100x.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsSC10/ThorlabsSC10.vcxproj b/DeviceAdapters/ThorlabsSC10/ThorlabsSC10.vcxproj
index a8cf4c0bb..6e5e86f42 100644
--- a/DeviceAdapters/ThorlabsSC10/ThorlabsSC10.vcxproj
+++ b/DeviceAdapters/ThorlabsSC10/ThorlabsSC10.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ThorlabsUSBCamera/ThorlabsUSBCamera.vcxproj b/DeviceAdapters/ThorlabsUSBCamera/ThorlabsUSBCamera.vcxproj
index 8354a8d6d..310fb7313 100644
--- a/DeviceAdapters/ThorlabsUSBCamera/ThorlabsUSBCamera.vcxproj
+++ b/DeviceAdapters/ThorlabsUSBCamera/ThorlabsUSBCamera.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Thorlabs_ELL14/Thorlabs_ELL14.vcxproj b/DeviceAdapters/Thorlabs_ELL14/Thorlabs_ELL14.vcxproj
index e12776bce..d403589c2 100644
--- a/DeviceAdapters/Thorlabs_ELL14/Thorlabs_ELL14.vcxproj
+++ b/DeviceAdapters/Thorlabs_ELL14/Thorlabs_ELL14.vcxproj
@@ -32,13 +32,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Tofra/Tofra.vcxproj b/DeviceAdapters/Tofra/Tofra.vcxproj
index d609e9d55..80157771b 100644
--- a/DeviceAdapters/Tofra/Tofra.vcxproj
+++ b/DeviceAdapters/Tofra/Tofra.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Toptica_iBeamSmartCW/Toptica_iBeamSmartCW.vcxproj b/DeviceAdapters/Toptica_iBeamSmartCW/Toptica_iBeamSmartCW.vcxproj
index 5306fe1b6..1c4a9b706 100644
--- a/DeviceAdapters/Toptica_iBeamSmartCW/Toptica_iBeamSmartCW.vcxproj
+++ b/DeviceAdapters/Toptica_iBeamSmartCW/Toptica_iBeamSmartCW.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/TriggerScope/TriggerScope.vcxproj b/DeviceAdapters/TriggerScope/TriggerScope.vcxproj
index 4f3fb7777..58c62ea6a 100644
--- a/DeviceAdapters/TriggerScope/TriggerScope.vcxproj
+++ b/DeviceAdapters/TriggerScope/TriggerScope.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
MultiByte
- v142
+ v143
DynamicLibrary
false
true
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/TriggerScopeMM/TriggerScopeMM.vcxproj b/DeviceAdapters/TriggerScopeMM/TriggerScopeMM.vcxproj
index 32d5e0ed5..6e76aeb67 100644
--- a/DeviceAdapters/TriggerScopeMM/TriggerScopeMM.vcxproj
+++ b/DeviceAdapters/TriggerScopeMM/TriggerScopeMM.vcxproj
@@ -22,14 +22,14 @@
DynamicLibrary
true
MultiByte
- v142
+ v143
DynamicLibrary
false
true
MultiByte
- v142
+ v143
diff --git a/DeviceAdapters/TwainCamera/TwainCamera.vcxproj b/DeviceAdapters/TwainCamera/TwainCamera.vcxproj
index 7119c5f55..9108864a1 100644
--- a/DeviceAdapters/TwainCamera/TwainCamera.vcxproj
+++ b/DeviceAdapters/TwainCamera/TwainCamera.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
NotSet
true
- v142
+ v143
false
DynamicLibrary
NotSet
- v142
+ v143
true
diff --git a/DeviceAdapters/TwoPhoton/TwoPhoton.vcxproj b/DeviceAdapters/TwoPhoton/TwoPhoton.vcxproj
index 01a503b12..68c0838da 100644
--- a/DeviceAdapters/TwoPhoton/TwoPhoton.vcxproj
+++ b/DeviceAdapters/TwoPhoton/TwoPhoton.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/USBManager/USBManager.vcxproj b/DeviceAdapters/USBManager/USBManager.vcxproj
index 678ce0061..cb0b69d7a 100644
--- a/DeviceAdapters/USBManager/USBManager.vcxproj
+++ b/DeviceAdapters/USBManager/USBManager.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/USB_Viper_QPL/USB_Viper_QPL.vcxproj b/DeviceAdapters/USB_Viper_QPL/USB_Viper_QPL.vcxproj
index f406a7bc3..a6f059b71 100644
--- a/DeviceAdapters/USB_Viper_QPL/USB_Viper_QPL.vcxproj
+++ b/DeviceAdapters/USB_Viper_QPL/USB_Viper_QPL.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/UniversalMMHubSerial/UniversalMMHubSerial.vcxproj b/DeviceAdapters/UniversalMMHubSerial/UniversalMMHubSerial.vcxproj
index 03b05e887..3ca93b194 100644
--- a/DeviceAdapters/UniversalMMHubSerial/UniversalMMHubSerial.vcxproj
+++ b/DeviceAdapters/UniversalMMHubSerial/UniversalMMHubSerial.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/UniversalMMHubUsb/UniversalMMHubUsb.vcxproj b/DeviceAdapters/UniversalMMHubUsb/UniversalMMHubUsb.vcxproj
index 635ca62d8..fa935c51f 100644
--- a/DeviceAdapters/UniversalMMHubUsb/UniversalMMHubUsb.vcxproj
+++ b/DeviceAdapters/UniversalMMHubUsb/UniversalMMHubUsb.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/UserDefinedSerial/UserDefinedSerial.vcxproj b/DeviceAdapters/UserDefinedSerial/UserDefinedSerial.vcxproj
index d949056c7..e92315787 100644
--- a/DeviceAdapters/UserDefinedSerial/UserDefinedSerial.vcxproj
+++ b/DeviceAdapters/UserDefinedSerial/UserDefinedSerial.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Utilities/Utilities.vcxproj b/DeviceAdapters/Utilities/Utilities.vcxproj
index 540094967..3011ea924 100644
--- a/DeviceAdapters/Utilities/Utilities.vcxproj
+++ b/DeviceAdapters/Utilities/Utilities.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Utilities/Utilities.vcxproj.filters b/DeviceAdapters/Utilities/Utilities.vcxproj.filters
index 6fb30c3d1..3d0647137 100644
--- a/DeviceAdapters/Utilities/Utilities.vcxproj.filters
+++ b/DeviceAdapters/Utilities/Utilities.vcxproj.filters
@@ -18,6 +18,51 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
diff --git a/DeviceAdapters/VariLC/VariLC.vcxproj b/DeviceAdapters/VariLC/VariLC.vcxproj
index f61885955..2e1953b89 100644
--- a/DeviceAdapters/VariLC/VariLC.vcxproj
+++ b/DeviceAdapters/VariLC/VariLC.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/VarispecLCTF/VarispecLCTF.vcxproj b/DeviceAdapters/VarispecLCTF/VarispecLCTF.vcxproj
index ed0084cc2..441a95622 100644
--- a/DeviceAdapters/VarispecLCTF/VarispecLCTF.vcxproj
+++ b/DeviceAdapters/VarispecLCTF/VarispecLCTF.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Vincent/Vincent.vcxproj b/DeviceAdapters/Vincent/Vincent.vcxproj
index f80b9e2b2..4b5604669 100644
--- a/DeviceAdapters/Vincent/Vincent.vcxproj
+++ b/DeviceAdapters/Vincent/Vincent.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/VisiTech_iSIM/VisiTech_iSIM.vcxproj b/DeviceAdapters/VisiTech_iSIM/VisiTech_iSIM.vcxproj
index 6a6782ad3..c59254b68 100644
--- a/DeviceAdapters/VisiTech_iSIM/VisiTech_iSIM.vcxproj
+++ b/DeviceAdapters/VisiTech_iSIM/VisiTech_iSIM.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/Vortran/Stradus.vcxproj b/DeviceAdapters/Vortran/Stradus.vcxproj
index 2cc9ca196..12ae709d8 100644
--- a/DeviceAdapters/Vortran/Stradus.vcxproj
+++ b/DeviceAdapters/Vortran/Stradus.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Vortran/VersaLase.vcxproj b/DeviceAdapters/Vortran/VersaLase.vcxproj
index 70bc6daa8..e52c7e9f0 100644
--- a/DeviceAdapters/Vortran/VersaLase.vcxproj
+++ b/DeviceAdapters/Vortran/VersaLase.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/WOSM/WOSM.vcxproj b/DeviceAdapters/WOSM/WOSM.vcxproj
index 937832a2f..cb85a8312 100644
--- a/DeviceAdapters/WOSM/WOSM.vcxproj
+++ b/DeviceAdapters/WOSM/WOSM.vcxproj
@@ -32,13 +32,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/WieneckeSinske/WieneckeSinske.vcxproj b/DeviceAdapters/WieneckeSinske/WieneckeSinske.vcxproj
index 66e0adc6f..b5375fc66 100644
--- a/DeviceAdapters/WieneckeSinske/WieneckeSinske.vcxproj
+++ b/DeviceAdapters/WieneckeSinske/WieneckeSinske.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/XCite120PC_Exacte/XCite120PC_Exacte.vcxproj b/DeviceAdapters/XCite120PC_Exacte/XCite120PC_Exacte.vcxproj
index 8b5e72ace..177b61fb7 100644
--- a/DeviceAdapters/XCite120PC_Exacte/XCite120PC_Exacte.vcxproj
+++ b/DeviceAdapters/XCite120PC_Exacte/XCite120PC_Exacte.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/XCiteLed/XCiteLed.vcxproj b/DeviceAdapters/XCiteLed/XCiteLed.vcxproj
index 6a1802dab..5f4a6a427 100644
--- a/DeviceAdapters/XCiteLed/XCiteLed.vcxproj
+++ b/DeviceAdapters/XCiteLed/XCiteLed.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/XCiteXT600/XCiteXT600.vcxproj b/DeviceAdapters/XCiteXT600/XCiteXT600.vcxproj
index eb0888020..6406d9962 100644
--- a/DeviceAdapters/XCiteXT600/XCiteXT600.vcxproj
+++ b/DeviceAdapters/XCiteXT600/XCiteXT600.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/XLight/XLight.vcxproj b/DeviceAdapters/XLight/XLight.vcxproj
index b3927c52b..af4ce1095 100644
--- a/DeviceAdapters/XLight/XLight.vcxproj
+++ b/DeviceAdapters/XLight/XLight.vcxproj
@@ -21,14 +21,14 @@
DynamicLibrary
true
Unicode
- v142
+ v143
DynamicLibrary
false
true
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/XLightV3/XLightV3.vcxproj b/DeviceAdapters/XLightV3/XLightV3.vcxproj
index a1f7106cc..de7d060c4 100644
--- a/DeviceAdapters/XLightV3/XLightV3.vcxproj
+++ b/DeviceAdapters/XLightV3/XLightV3.vcxproj
@@ -33,13 +33,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Xcite/Xcite.vcxproj b/DeviceAdapters/Xcite/Xcite.vcxproj
index cf2031876..519ac4ac0 100644
--- a/DeviceAdapters/Xcite/Xcite.vcxproj
+++ b/DeviceAdapters/Xcite/Xcite.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Ximea/XIMEACamera.vcxproj b/DeviceAdapters/Ximea/XIMEACamera.vcxproj
index 36ce12437..8bc4fd6b4 100644
--- a/DeviceAdapters/Ximea/XIMEACamera.vcxproj
+++ b/DeviceAdapters/Ximea/XIMEACamera.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/YodnE600/YodnE600.vcxproj b/DeviceAdapters/YodnE600/YodnE600.vcxproj
index 53cea4bad..a248cb347 100644
--- a/DeviceAdapters/YodnE600/YodnE600.vcxproj
+++ b/DeviceAdapters/YodnE600/YodnE600.vcxproj
@@ -19,13 +19,13 @@
DynamicLibrary
true
- v142
+ v143
MultiByte
DynamicLibrary
false
- v142
+ v143
true
MultiByte
diff --git a/DeviceAdapters/Yokogawa/CSUX/CSUX.vcxproj b/DeviceAdapters/Yokogawa/CSUX/CSUX.vcxproj
index fc6db5e7d..6482945a9 100644
--- a/DeviceAdapters/Yokogawa/CSUX/CSUX.vcxproj
+++ b/DeviceAdapters/Yokogawa/CSUX/CSUX.vcxproj
@@ -19,13 +19,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/Yokogawa/Yokogawa.vcxproj b/DeviceAdapters/Yokogawa/Yokogawa.vcxproj
index 5e1a54ccf..c10137473 100644
--- a/DeviceAdapters/Yokogawa/Yokogawa.vcxproj
+++ b/DeviceAdapters/Yokogawa/Yokogawa.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ZWO/ZWO.vcxproj b/DeviceAdapters/ZWO/ZWO.vcxproj
index 3d065a5b2..996cd7375 100644
--- a/DeviceAdapters/ZWO/ZWO.vcxproj
+++ b/DeviceAdapters/ZWO/ZWO.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
true
- v142
+ v143
Unicode
DynamicLibrary
false
- v142
+ v143
true
Unicode
diff --git a/DeviceAdapters/Zaber/Zaber.vcxproj b/DeviceAdapters/Zaber/Zaber.vcxproj
index b485aec5c..8c9fa0815 100644
--- a/DeviceAdapters/Zaber/Zaber.vcxproj
+++ b/DeviceAdapters/Zaber/Zaber.vcxproj
@@ -20,7 +20,7 @@
DynamicLibrary
true
Unicode
- v142
+ v143
false
@@ -28,7 +28,7 @@
false
false
Unicode
- v142
+ v143
diff --git a/DeviceAdapters/ZeissAxioZoom/ZeissAxioZoom.vcxproj b/DeviceAdapters/ZeissAxioZoom/ZeissAxioZoom.vcxproj
index 8ab4df04f..0315fad27 100644
--- a/DeviceAdapters/ZeissAxioZoom/ZeissAxioZoom.vcxproj
+++ b/DeviceAdapters/ZeissAxioZoom/ZeissAxioZoom.vcxproj
@@ -22,13 +22,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/ZeissCAN/ZeissCAN.vcxproj b/DeviceAdapters/ZeissCAN/ZeissCAN.vcxproj
index 555fd62a4..7eb236fa0 100644
--- a/DeviceAdapters/ZeissCAN/ZeissCAN.vcxproj
+++ b/DeviceAdapters/ZeissCAN/ZeissCAN.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
Unicode
true
- v142
+ v143
false
DynamicLibrary
Unicode
- v142
+ v143
true
diff --git a/DeviceAdapters/ZeissCAN29/ZeissCAN29.vcxproj b/DeviceAdapters/ZeissCAN29/ZeissCAN29.vcxproj
index ffc8f437e..dcb0c75b4 100644
--- a/DeviceAdapters/ZeissCAN29/ZeissCAN29.vcxproj
+++ b/DeviceAdapters/ZeissCAN29/ZeissCAN29.vcxproj
@@ -21,13 +21,13 @@
DynamicLibrary
MultiByte
true
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/dc1394/dc1394.vcxproj b/DeviceAdapters/dc1394/dc1394.vcxproj
index 6d3b61fc4..83d4403a1 100644
--- a/DeviceAdapters/dc1394/dc1394.vcxproj
+++ b/DeviceAdapters/dc1394/dc1394.vcxproj
@@ -20,13 +20,13 @@
DynamicLibrary
MultiByte
- v142
+ v143
false
DynamicLibrary
MultiByte
- v142
+ v143
true
diff --git a/DeviceAdapters/go2scope/AcqZarrStorage.cpp b/DeviceAdapters/go2scope/AcqZarrStorage.cpp
new file mode 100644
index 000000000..31a9a1e5e
--- /dev/null
+++ b/DeviceAdapters/go2scope/AcqZarrStorage.cpp
@@ -0,0 +1,571 @@
+///////////////////////////////////////////////////////////////////////////////
+// FILE: AcqZarrStorage.cpp
+// PROJECT: Micro-Manager
+// SUBSYSTEM: DeviceAdapters
+//-----------------------------------------------------------------------------
+// DESCRIPTION: Zarr writer based on the CZI acquire-zarr library
+//
+// AUTHOR: Nenad Amodaj
+//
+// COPYRIGHT: Nenad Amodaj, Chan Zuckerberg Initiative, 2024
+//
+// LICENSE: This file is distributed under the BSD license.
+// License text is included with the source distribution.
+//
+// This file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
+//
+// NOTE: Storage Device development is supported in part by
+// Chan Zuckerberg Initiative (CZI)
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "G2SStorage.h"
+#include "AcqZarrStorage.h"
+#include "zarr.h"
+#include "nlohmann/json.hpp"
+#include
+#include
+#include
+#include
+
+
+using namespace std;
+
+
+std::string generate_guid() {
+ std::random_device rd;
+ std::mt19937 gen(rd());
+ std::uniform_int_distribution<> dis(0, 15);
+ std::uniform_int_distribution<> dis2(8, 11);
+
+ std::stringstream ss;
+ ss << std::hex;
+
+ for (int i = 0; i < 8; i++) {
+ ss << dis(gen);
+ }
+ ss << "-";
+ for (int i = 0; i < 4; i++) {
+ ss << dis(gen);
+ }
+ ss << "-4";
+ for (int i = 0; i < 3; i++) {
+ ss << dis(gen);
+ }
+ ss << "-" << dis2(gen);
+ for (int i = 0; i < 3; i++) {
+ ss << dis(gen);
+ }
+ ss << "-";
+ for (int i = 0; i < 12; i++) {
+ ss << dis(gen);
+ }
+
+ return ss.str();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Zarr storage
+
+AcqZarrStorage::AcqZarrStorage() :
+ initialized(false), zarrStream(nullptr), currentImageNumber(0), dataType(MM::StorageDataType_UNKNOWN)
+{
+ InitializeDefaultErrorMessages();
+
+ // set device specific error messages
+ SetErrorText(ERR_ZARR, "Generic Zarr writer error. Check log for more information.");
+ SetErrorText(ERR_INTERNAL, "Internal driver error, see log file for details");
+ SetErrorText(ERR_ZARR_SETTINGS, "Error in creating Zarr settings.");
+ SetErrorText(ERR_ZARR_NUMDIMS, "Number of Zarr dimensions is not valid.");
+ SetErrorText(ERR_ZARR_STREAM_CREATE, "Error creating Zarr stream. See log for more info.");
+ SetErrorText(ERR_ZARR_STREAM_CLOSE, "Error closing Zarr stream. See log for more info.");
+ SetErrorText(ERR_ZARR_STREAM_LOAD, "Error opening an existing Zarr stream.");
+ SetErrorText(ERR_ZARR_STREAM_APPEND, "Error appending image to Zarr stream.");
+ SetErrorText(ERR_ZARR_STREAM_ACCESS, "Error accessing Zarr stream. See log for more info.");
+ SetErrorText(ERR_ZARR_STREAM_LOAD, "Error opening an existing Zarr stream.");
+
+ auto ver = Zarr_get_api_version();
+
+ // create pre-initialization properties
+ // ------------------------------------
+ //
+
+ // Name
+ CreateProperty(MM::g_Keyword_Name, g_AcqZarrStorage, MM::String, true);
+ //
+ // Description
+ ostringstream os;
+ os << "Acquire Zarr Storage v" << ver;
+ CreateProperty(MM::g_Keyword_Description, os.str().c_str(), MM::String, true);
+}
+
+AcqZarrStorage::~AcqZarrStorage()
+{
+ Shutdown();
+}
+
+void AcqZarrStorage::GetName(char* Name) const
+{
+ CDeviceUtils::CopyLimitedString(Name, g_AcqZarrStorage);
+}
+
+int AcqZarrStorage::Initialize()
+{
+ if (initialized)
+ return DEVICE_OK;
+
+ int ret(DEVICE_OK);
+
+ UpdateStatus();
+
+ initialized = true;
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::Shutdown()
+{
+ if (initialized)
+ {
+ initialized = false;
+ }
+ destroyStream();
+
+ return DEVICE_OK;
+}
+
+// Never busy because all commands block
+bool AcqZarrStorage::Busy()
+{
+ return false;
+}
+
+/**
+ * Creates Zarr dataset
+ *
+ * \param path - parent directory of the dataset
+ * \param name - name of the dataset (the actual name will follow the micro-manager convention for not overwriting)
+ * \param numberOfDimensions - how many dimensions
+ * \param shape - array of dimension sizes, from slow to fast. Y and X are always the last two.
+ * \param pixType - pixel type
+ * \param meta - JSON encoded string representing "summary" metadata. Can be empty.
+ * \param handle - handle to the dataset.
+ * \return
+ */
+int AcqZarrStorage::Create(const char* path, const char* name, int numberOfDimensions, const int shape[], MM::StorageDataType pixType, const char* meta, char* handle)
+{
+ if (zarrStream)
+ {
+ LogMessage("Another stream is already open. Currently this device supports only one stream.");
+ return ERR_ZARR_NUMDIMS;
+ }
+
+ if (numberOfDimensions < 3)
+ {
+ LogMessage("Number of dimensions is lower than 3.");
+ return ERR_ZARR_NUMDIMS;
+ }
+
+ auto settings = ZarrStreamSettings_create();
+ if (!settings)
+ {
+ LogMessage("Failed creating Zarr stream settings.");
+ return ERR_ZARR_SETTINGS;
+ }
+
+ // set path
+ string savePrefix(name);
+ string savePrefixTmp(name);
+ string saveRoot(path);
+ string dsName = string(path) + "/" + savePrefixTmp;
+ int counter(1);
+ while (boost::filesystem::exists(dsName))
+ {
+ savePrefixTmp = savePrefix + "_" + to_string(counter++);
+ dsName = saveRoot + "/" + savePrefixTmp;
+ }
+ boost::system::error_code errCode;
+ if (!boost::filesystem::create_directory(dsName, errCode))
+ return ERR_FAILED_CREATING_FILE;
+
+ char* streamPathName = new char[dsName.size() + 1];
+ strcpy(streamPathName, dsName.c_str());
+ ZarrStatus status = ZarrStreamSettings_set_store(settings,
+ streamPathName,
+ dsName.size() + 1,
+ nullptr);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ // set data type and convert to zarr
+ int ztype = ConvertToZarrType(pixType);
+ if (ztype == -1)
+ {
+ LogMessage("Pixel data type is not supported by Zarr writer " + pixType);
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ status = ZarrStreamSettings_set_data_type(settings, (ZarrDataType)ztype);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ status = ZarrStreamSettings_reserve_dimensions(settings, numberOfDimensions);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ for (size_t i = 0; i < numberOfDimensions - 2; i++)
+ {
+ ZarrDimensionProperties dimProps;
+ ostringstream osd;
+ osd << "dim-" << i;
+ auto dimName(osd.str());
+ dimProps.name = new char[dimName.size() + 1];
+ strcpy(const_cast(dimProps.name), osd.str().c_str());
+ dimProps.bytes_of_name = dimName.size() + 1;
+ dimProps.array_size_px = shape[i];
+ dimProps.chunk_size_px = 1;
+ dimProps.shard_size_chunks = 1;
+ ZarrStatus status = ZarrStreamSettings_set_dimension(settings, i, &dimProps);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+ }
+
+ ZarrDimensionProperties dimPropsY;
+ string nameY("y");
+ dimPropsY.name = new char[nameY.size() + 1];
+ strcpy(const_cast(dimPropsY.name), nameY.c_str());
+ dimPropsY.bytes_of_name = nameY.size() + 1;
+ dimPropsY.array_size_px = shape[numberOfDimensions - 2];
+ dimPropsY.chunk_size_px = dimPropsY.array_size_px;
+ dimPropsY.shard_size_chunks = 1;
+ dimPropsY.kind = ZarrDimensionType_Space;
+
+ status = ZarrStreamSettings_set_dimension(settings, numberOfDimensions - 2, &dimPropsY);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ ZarrDimensionProperties dimPropsX;
+ string nameX("x");
+ dimPropsX.name = new char[nameX.size() + 1];
+ strcpy(const_cast(dimPropsX.name), nameX.c_str());
+ dimPropsX.bytes_of_name = nameX.size() + 1;
+ dimPropsX.array_size_px = shape[numberOfDimensions - 1];
+ dimPropsX.chunk_size_px = dimPropsX.array_size_px;
+ dimPropsX.shard_size_chunks = 1;
+ dimPropsX.kind = ZarrDimensionType_Space;
+
+ status = ZarrStreamSettings_set_dimension(settings, numberOfDimensions - 1, &dimPropsX);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+
+ if (strlen(meta))
+ {
+ status = ZarrStreamSettings_set_custom_metadata(settings, meta, strlen(meta) + 1);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage("Invalid summary metadata.");
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_SETTINGS;
+ }
+ }
+
+ zarrStream = ZarrStream_create(settings, ZarrVersion_2);
+ if (zarrStream == nullptr)
+ {
+ LogMessage("Failed creating Zarr stream: " + dsName);
+ ZarrStreamSettings_destroy(settings);
+ return ERR_ZARR_STREAM_CREATE;
+ }
+
+ dataType = pixType;
+ streamHandle = generate_guid();
+ streamDimensions.clear();
+ for (int i = 0; i < numberOfDimensions; i++) streamDimensions.push_back(shape[i]);
+ // TODO: allow many streams
+
+ currentImageNumber = 0;
+ strncpy(handle, streamHandle.c_str(), MM::MaxStrLength);
+
+ ZarrStreamSettings_destroy(settings);
+
+ streamPath = dsName;
+
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::ConfigureDimension(const char* handle, int dimension, const char* name, const char* meaning)
+{
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::ConfigureCoordinate(const char* handle, int dimension, int coordinate, const char* name)
+{
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::Close(const char* handle)
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return ERR_ZARR_STREAM_CLOSE;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_CLOSE;
+ }
+
+ streamPath.clear();
+ destroyStream();
+
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::Load(const char* path, char* handle)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+int AcqZarrStorage::GetShape(const char* handle, int shape[])
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+
+ int i(0);
+ for (auto d : streamDimensions) shape[i++] = d;
+
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::Delete(char* handle)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+int AcqZarrStorage::List(const char* path, char** listOfDatasets, int maxItems, int maxItemLength)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+int AcqZarrStorage::AddImage(const char* handle, int sizeInBytes, unsigned char* pixels, int coordinates[], int numCoordinates, const char* imageMeta)
+{
+ // acquire-zarr supports append-only images
+ // TODO: check if the coordinates are coming in the right order and return run-time error if they dont
+ return AppendImage(handle, sizeInBytes, pixels, imageMeta);
+}
+
+int AcqZarrStorage::AppendImage(const char* handle, int sizeInBytes, unsigned char* pixels, const char* imageMeta)
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+
+ if (streamDimensions[streamDimensions.size() - 2] * streamDimensions[streamDimensions.size() - 1] * MM::GetPixelDataSizeInBytes(dataType) != sizeInBytes)
+ {
+ LogMessage("Stream dimensions do not match image size");
+ return ERR_ZARR_STREAM_APPEND;
+ }
+
+ size_t bytesIn(sizeInBytes);
+ size_t bytesOut(0);
+ ZarrStatus status = ZarrStream_append(zarrStream, pixels, bytesIn, &bytesOut);
+ if (status != ZarrStatus_Success)
+ {
+ LogMessage(getErrorMessage(status));
+ return ERR_ZARR_STREAM_APPEND;
+ }
+
+ if (bytesOut != bytesIn)
+ {
+ ostringstream os;
+ os << "Bytes in " << bytesIn << " does not match bytes out " << bytesOut;
+ LogMessage(os.str());
+ return ERR_ZARR_STREAM_APPEND;
+ }
+ currentImageNumber++;
+
+ return DEVICE_OK;
+}
+
+int AcqZarrStorage::GetSummaryMeta(const char* handle, char* meta, int bufSize)
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+
+ if (bufSize > 0)
+ meta[0] = 0;
+
+ return 0;
+}
+
+int AcqZarrStorage::GetImageMeta(const char* handle, int coordinates[], int numCoordinates, char* meta, int bufSize)
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+
+ if (bufSize > 0)
+ meta[0] = 0;
+
+ return 0;
+}
+
+const unsigned char* AcqZarrStorage::GetImage(const char* handle, int coordinates[], int numCoordinates)
+{
+ if (zarrStream == nullptr)
+ {
+ LogMessage("No stream is currently open.");
+ return nullptr;
+ }
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return nullptr;
+ }
+
+ return nullptr;
+}
+
+int AcqZarrStorage::GetNumberOfDimensions(const char* handle, int& numDimensions)
+{
+ if (streamHandle.compare(handle) != 0)
+ {
+ LogMessage("Handle is not valid.");
+ return ERR_ZARR_STREAM_ACCESS;
+ }
+ return streamDimensions.size();
+}
+
+int AcqZarrStorage::GetDimension(const char* handle, int dimension, char* name, int nameLength, char* meaning, int meaningLength)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+int AcqZarrStorage::GetCoordinate(const char* handle, int dimension, int coordinate, char* name, int nameLength)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+int AcqZarrStorage::GetImageCount(const char* handle, int& imgcount)
+{
+ return DEVICE_NOT_YET_IMPLEMENTED;
+}
+
+bool AcqZarrStorage::IsOpen(const char* handle)
+{
+ if (streamHandle.compare(handle) != 0)
+ {
+ return false;
+ }
+ return true;
+}
+
+bool AcqZarrStorage::IsReadOnly(const char* handle)
+{
+ return false;
+}
+
+int AcqZarrStorage::GetPath(const char* handle, char* path, int maxPathLength)
+{
+ return 0;
+}
+
+std::string AcqZarrStorage::getErrorMessage(int code)
+{
+ return std::string(Zarr_get_error_message((ZarrStatus)code));
+}
+
+void AcqZarrStorage::destroyStream()
+{
+ if (zarrStream)
+ {
+ ZarrStream_destroy(zarrStream);
+ zarrStream = nullptr;
+ streamHandle = "";
+ }
+}
+
+int AcqZarrStorage::ConvertToZarrType(MM::StorageDataType type)
+{
+ ZarrDataType ztype;
+ switch (type)
+ {
+ case MM::StorageDataType_GRAY8:
+ ztype = ZarrDataType_uint8;
+ break;
+
+ case MM::StorageDataType_GRAY16:
+ ztype = ZarrDataType_int16; // why is there no uint16?
+ break;
+
+ default:
+ return -1;
+ }
+ return (int)ztype;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+// Action handlers
+///////////////////////////////////////////////////////////////////////////////
+
diff --git a/DeviceAdapters/go2scope/AcqZarrStorage.h b/DeviceAdapters/go2scope/AcqZarrStorage.h
new file mode 100644
index 000000000..cd054e5a5
--- /dev/null
+++ b/DeviceAdapters/go2scope/AcqZarrStorage.h
@@ -0,0 +1,90 @@
+///////////////////////////////////////////////////////////////////////////////
+// FILE: AcqZarrStorage.h
+// PROJECT: Micro-Manager
+// SUBSYSTEM: DeviceAdapters
+//-----------------------------------------------------------------------------
+// DESCRIPTION: Go2Scope devices. Includes the experimental StorageDevice
+//
+// AUTHOR: Nenad Amodaj
+//
+// COPYRIGHT: Nenad Amodaj, Chan Zuckerberg Initiative, 2024
+//
+// LICENSE: This file is distributed under the BSD license.
+// License text is included with the source distribution.
+//
+// This file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
+//
+// NOTE: Storage Device development is supported in part by
+// Chan Zuckerberg Initiative (CZI)
+//
+///////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+#include "MMDevice.h"
+#include "DeviceBase.h"
+
+struct ZarrStream_s;
+
+class AcqZarrStorage : public CStorageBase
+{
+public:
+ AcqZarrStorage();
+ virtual ~AcqZarrStorage();
+
+ // Device API
+ // ----------
+ int Initialize();
+ int Shutdown();
+
+ void GetName(char* pszName) const;
+ bool Busy();
+
+ // Storage API
+ // -----------
+ int Create(const char* path, const char* name, int numberOfDimensions, const int shape[], MM::StorageDataType pixType, const char* meta, char* handle);
+ int ConfigureDimension(const char* handle, int dimension, const char* name, const char* meaning);
+ int ConfigureCoordinate(const char* handle, int dimension, int coordinate, const char* name);
+ int Close(const char* handle);
+ int Load(const char* path, char* handle);
+ int GetShape(const char* handle, int shape[]);
+ int GetDataType(const char* handle, MM::StorageDataType& pixelDataType) { return dataType; }
+
+ int Delete(char* handle);
+ int List(const char* path, char** listOfDatasets, int maxItems, int maxItemLength);
+ int AddImage(const char* handle, int sizeInBytes, unsigned char* pixels, int coordinates[], int numCoordinates, const char* imageMeta);
+ int AppendImage(const char* handle, int sizeInBytes, unsigned char* pixels, const char* imageMeta);
+ int GetSummaryMeta(const char* handle, char* meta, int bufSize);
+ int GetImageMeta(const char* handle, int coordinates[], int numCoordinates, char* meta, int bufSize);
+ const unsigned char* GetImage(const char* handle, int coordinates[], int numCoordinates);
+ int GetNumberOfDimensions(const char* handle, int& numDimensions);
+ int GetDimension(const char* handle, int dimension, char* name, int nameLength, char* meaning, int meaningLength);
+ int GetCoordinate(const char* handle, int dimension, int coordinate, char* name, int nameLength);
+ int GetImageCount(const char* handle, int& imgcnt);
+ bool IsOpen(const char* handle);
+ bool IsReadOnly(const char* handle);
+ int GetPath(const char* handle, char* path, int maxPathLength);
+
+
+ // action interface
+ // ----------------
+
+private:
+ bool initialized;
+ ZarrStream_s* zarrStream;
+ std::vector streamDimensions;
+ MM::StorageDataType dataType;
+ std::vector currentCoordinate;
+ int currentImageNumber;
+ std::string streamHandle;
+ std::string getErrorMessage(int code);
+ void destroyStream();
+ int ConvertToZarrType(MM::StorageDataType type);
+ std::string streamPath;
+};
+
diff --git a/DeviceAdapters/go2scope/CFileUtil.cpp b/DeviceAdapters/go2scope/CFileUtil.cpp
new file mode 100644
index 000000000..c69e4e279
--- /dev/null
+++ b/DeviceAdapters/go2scope/CFileUtil.cpp
@@ -0,0 +1,113 @@
+///////////////////////////////////////////////////////////////////////////////
+// FILE: G2SFileUtil.cpp
+// PROJECT: Micro-Manager
+// SUBSYSTEM: DeviceAdapters
+//-----------------------------------------------------------------------------
+// DESCRIPTION: Go2Scope devices. Includes the experimental StorageDevice
+//
+// AUTHOR: Milos Jovanovic
+//
+// COPYRIGHT: Nenad Amodaj, Chan Zuckerberg Initiative, 2024
+//
+// LICENSE: This file is distributed under the BSD license.
+// License text is included with the source distribution.
+//
+// This file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
+//
+// NOTE: Storage Device development is supported in part by
+// Chan Zuckerberg Initiative (CZI)
+//
+///////////////////////////////////////////////////////////////////////////////
+#include "G2SFileUtil.h"
+
+/**
+ * Write integer value to a byte buffer
+ * @param buff Byte buffer
+ * @param len Value length (in bytes)
+ * @param val Integer value
+ * @author Miloš Jovanović
+ * @version 1.0
+ */
+void writeInt(unsigned char* buff, std::uint8_t len, std::uint64_t val) noexcept
+{
+ if(buff == nullptr || len == 0)
+ return;
+ for(auto i = 0; i < len; i++)
+ buff[i] = (val >> (i * 8)) & 0xff;
+}
+
+/**
+ * Read integer value from a byte buffer
+ * @param buff Byte buffer
+ * @param len Value length (in bytes)
+ * @return Integer value
+ * @author Miloš Jovanović
+ * @version 1.0
+ */
+std::uint64_t readInt(const unsigned char* buff, std::uint8_t len) noexcept
+{
+ if(buff == nullptr || len == 0 || len > 8)
+ return 0;
+ std::uint64_t ret = 0;
+ for(std::uint8_t i = 0; i < len; i++)
+ {
+ auto shift = i * 8;
+ std::uint64_t xval = (std::uint64_t)buff[i] << shift;
+ ret |= xval;
+ }
+ return ret;
+}
+
+/**
+ * Split CSV line into tokens
+ * @param line CSV line
+ * @return Tokens list
+ */
+std::vector splitLineCSV(const std::string& line) noexcept
+{
+ std::vector ret;
+ if(line.empty())
+ return ret;
+
+ std::string curr = "";
+ bool qopen = false;
+ int qcnt = 0;
+ for(char c : line)
+ {
+ bool endswithQ = curr.size() >= 1 && curr[curr.size() - 1] == '\"';
+ bool endswithS = curr.size() >= 1 && curr[curr.size() - 1] == ' ';
+ bool endswithEQ = curr.size() >= 2 && curr[curr.size() - 1] == '\"' && curr[curr.size() - 1] == '\\';
+ if(c == ',' && (!qopen || (qcnt % 2 == 0 && (endswithQ || endswithS) && !endswithEQ)))
+ {
+ if(curr.size() >= 2 && curr[0] == '\"' && curr[curr.size() - 1] == '\"')
+ curr = curr.substr(1, curr.size() - 2);
+ ret.push_back(curr);
+ curr = "";
+ qcnt = 0;
+ qopen = false;
+ }
+ else if(c == '"')
+ {
+ if(qcnt == 0)
+ qopen = true;
+ qcnt++;
+ //if(qcnt > 1 && qcnt % 2 == 1)
+ curr += "\"";
+ }
+ else
+ curr += c;
+ }
+ if(!curr.empty())
+ {
+ if(curr.size() >= 2 && curr[0] == '\"' && curr[curr.size() - 1] == '\"')
+ curr = curr.substr(1, curr.size() - 2);
+ ret.push_back(curr);
+ }
+ return ret;
+}
diff --git a/DeviceAdapters/go2scope/G2SBigTiffDataset.cpp b/DeviceAdapters/go2scope/G2SBigTiffDataset.cpp
new file mode 100644
index 000000000..fc9f81b59
--- /dev/null
+++ b/DeviceAdapters/go2scope/G2SBigTiffDataset.cpp
@@ -0,0 +1,894 @@
+///////////////////////////////////////////////////////////////////////////////
+// FILE: G2STiffFile.cpp
+// PROJECT: Micro-Manager
+// SUBSYSTEM: DeviceAdapters
+//-----------------------------------------------------------------------------
+// DESCRIPTION: Go2Scope devices. Includes the experimental StorageDevice
+//
+// AUTHOR: Milos Jovanovic
+//
+// COPYRIGHT: Nenad Amodaj, Chan Zuckerberg Initiative, 2024
+//
+// LICENSE: This file is distributed under the BSD license.
+// License text is included with the source distribution.
+//
+// This file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
+//
+// NOTE: Storage Device development is supported in part by
+// Chan Zuckerberg Initiative (CZI)
+//
+///////////////////////////////////////////////////////////////////////////////
+#define _LARGEFILE64_SOURCE
+#include
+#include
+#include
+#include
+#include "G2SBigTiffDataset.h"
+#ifdef _WIN32
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
+
+#define G2SFOLDER_EXT ".g2s"
+#define G2SFILE_EXT ".g2s.tif"
+#define G2SAXISINFO_FILE "axisinfo.txt"
+
+/**
+ * Class constructor
+ * Constructor doesn't open the file, just creates an object set sets the configuration
+ * By convention G2S format files end with a .g2s.tif extension
+ * First data chunk doesn't have a index (e.g. SampleDataset.g2s.tif)
+ * Other data chunks contain an index (1-based, e.g. SampleDataset_1.g2s.tif, SampleDataset_2.g2s.tif..)
+ * Dataset files are contained within a directory. The name of the directory matches the dataset name with the .g2s sufix (e.g. SampleDataset.g2s)
+ */
+G2SBigTiffDataset::G2SBigTiffDataset() noexcept
+{
+ dspath = "";
+ datasetuid = "";
+ bitdepth = 8;
+ samples = 1;
+ imgcounter = 0;
+ flushcnt = 0;
+ chunksize = 0;
+ directIo = false;
+ bigTiff = true;
+ writemode = false;
+}
+
+/**
+ * Create a dataset
+ * All datasets are stored in separate folders, folder names have a .g2s suffix
+ * If the folder with the specified name already exists, a name with the index in the suffix will be used
+ * If the dataset is chunked files will be created only when the active chunk is filled
+ * @param path Dataset (folder) path
+ * @param dio Use direct I/O
+ * @param fbig Use BigTIFF format
+ * @param chunksz Chunk size
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::create(const std::string& path, bool dio, bool fbig, std::uint32_t chunksz)
+{
+ if(isOpen())
+ throw std::runtime_error("Invalid operation. Dataset is already created");
+ if(path.empty())
+ throw std::runtime_error("Unable to create a file stream. Dataset path is undefined");
+ directIo = dio;
+ writemode = true;
+ chunksize = chunksz;
+ bigTiff = fbig;
+
+ // Extract dataset name
+ std::filesystem::path basepath = std::filesystem::u8path(path);
+ dsname = basepath.stem().u8string();
+ if(dsname.find(".g2s") == dsname.size() - 4)
+ dsname = dsname.substr(0, dsname.size() - 4);
+
+ // Determine dataset path
+ std::uint32_t counter = 1;
+ std::filesystem::path xpath = basepath.parent_path() / (dsname + G2SFOLDER_EXT);
+ while(std::filesystem::exists(xpath))
+ {
+ // If the file path (path + name) exists, it should not be an error
+ // nor the file should be overwritten, first available suffix (index) will be appended to the file name
+ auto tmpname = dsname + "_" + std::to_string(counter++) + G2SFOLDER_EXT;
+ xpath = basepath.parent_path() / tmpname;
+ }
+ dspath = xpath.u8string();
+
+
+ // Create a first file (data chunk)
+ std::error_code ec;
+ std::filesystem::path fp = xpath / (dsname + G2SFILE_EXT);
+ std::filesystem::create_directories(fp.parent_path(), ec);
+ if(ec.value() != 0)
+ throw std::runtime_error("Unable to create a file stream. Directory tree creation failed");
+ activechunk = std::make_shared(fp.u8string(), directIo, bigTiff);
+ if(!activechunk)
+ throw std::runtime_error("Unable to create a file stream. Data chunk allocation failed");
+ activechunk->open(true);
+ if(activechunk->getHeader().empty())
+ throw std::runtime_error("Unable to create a file stream. File header creation failed");
+ if(!datasetuid.empty())
+ activechunk->writeDatasetUid(datasetuid);
+ if(!shape.empty())
+ activechunk->writeShapeInfo(shape, chunksize);
+ datachunks.push_back(activechunk);
+}
+
+/**
+ * Load a dataset
+ * If the dataset doesn't exist an exception will be thrown
+ * If the dataset exists dataset parameters and metadata will be parsed
+ * If the dataset is chunked all files will be enumerated, but only the first file will be loaded
+ * @param path Dataset (folder) path or File path of the first data chunk
+ * @param dio Use direct I/O
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::load(const std::string& path, bool dio)
+{
+ if(isOpen())
+ throw std::runtime_error("Invalid operation. Dataset is already loaded");
+ if(path.empty())
+ throw std::runtime_error("Unable to load a dataset. Dataset path is undefined");
+ directIo = dio;
+ writemode = false;
+
+ // Check dataset / file path
+ auto xp = std::filesystem::u8path(path);
+ if(!std::filesystem::exists(xp))
+ {
+ // Check if the dataset path has a .g2s extension
+ std::string fpath(path);
+ if(fpath.find(".g2s") != fpath.size() - 4)
+ fpath += ".g2s";
+ xp = std::filesystem::u8path(path);
+ if(!std::filesystem::exists(xp))
+ throw std::runtime_error("Unable to load a dataset. Specified path doesn't exist");
+ }
+
+ // If the first data chunk (file) path is specified -> use parent folder path
+ if(std::filesystem::is_regular_file(xp))
+ xp = xp.parent_path();
+ dspath = xp.u8string();
+ dsname = xp.stem().u8string();
+ if(dsname.find(".g2s") == dsname.size() - 4)
+ dsname = dsname.substr(0, dsname.size() - 4);
+
+ // Enumerate files
+ for(const auto& entry : std::filesystem::directory_iterator(xp))
+ {
+ // Skip auto folder paths
+ auto fname = entry.path().filename().u8string();
+ if(fname == "." || fname == "..")
+ continue;
+
+ // Skip folders
+ if(std::filesystem::is_directory(entry))
+ continue;
+
+ // Skip unsupported file formats
+ auto fext = entry.path().extension().u8string();
+ if(fext.size() == 0)
+ continue;
+ if(fext[0] == '.')
+ fext = fext.substr(1);
+ std::transform(fext.begin(), fext.end(), fext.begin(), [](char c) { return (char)tolower(c); });
+ if(fext != "tiff" && fext != "tif" && fext != "g2s.tiff" && fext != "g2s.tif")
+ continue;
+
+ // We found a supported file type -> Add to results list
+ auto abspath = std::filesystem::absolute(entry).u8string();
+ auto dchunk = std::make_shared(abspath, directIo);
+ datachunks.push_back(dchunk);
+ }
+ if(datachunks.empty())
+ throw std::runtime_error("Unable to load a dataset. No files found");
+
+ // Load first data chunk
+ samples = 1;
+ imgcounter = 0;
+ metadata.clear();
+ activechunk = datachunks.front();
+ activechunk->open(false);
+ activechunk->parse(datasetuid, shape, chunksize, metadata, bitdepth);
+ imgcounter += activechunk->getImageCount();
+ resetAxisInfo();
+ parseAxisInfo();
+
+ // Validate dataset parameters
+ if(activechunk->getChunkIndex() != 0)
+ {
+ close();
+ throw std::runtime_error("Unable to load a dataset. First data chunk is missing");
+ }
+ if(datasetuid.empty())
+ {
+ close();
+ throw std::runtime_error("Unable to load a dataset. Invalid dataset UID");
+ }
+ if(shape.size() < 3)
+ {
+ close();
+ throw std::runtime_error("Unable to load a dataset. Invalid dataset shape");
+ }
+ if(bitdepth < 8 || bitdepth > 16)
+ {
+ close();
+ throw std::runtime_error("Unable to load a dataset. Unsupported pixel format");
+ }
+
+ // Parse headers for other data chunks
+ for(std::size_t i = 1; i < datachunks.size(); i++)
+ {
+ validateDataChunk(i, false);
+ imgcounter += datachunks[i]->getImageCount();
+ datachunks[i]->close();
+ }
+}
+
+/**
+ * Close the dataset
+ * If a dataset hasn't been created / loaded this method will have no effect
+ * File handles will be released / closed
+ * In the create mode during closing final section (dataset metadata) is commited to the first data chunk (file)
+ */
+void G2SBigTiffDataset::close() noexcept
+{
+ if(writemode && datachunks.size() == 1 && datachunks[0]->isOpen())
+ datachunks[0]->appendMetadata(metadata);
+ writeAxisInfo();
+ for(const auto& fx : datachunks)
+ fx->close();
+ imgcounter = 0;
+ bitdepth = 8;
+ samples = 1;
+ metadata.clear();
+ shape.clear();
+ datachunks.clear();
+ activechunk.reset();
+ axisinfo.clear();
+}
+
+/**
+ * Set dataset shape / dimension & axis sizes
+ * First two axis are always width and height
+ * If the shape info is invalid this method will take no effect
+ * Shape can only be set in the write mode, before adding any images
+ * @param dims Axis sizes list
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::setShape(const std::vector& dims)
+{
+ if(dims.size() < 2)
+ throw std::runtime_error("Unable to set dataset shape. Invalid shape info");
+ if(!writemode)
+ throw std::runtime_error("Unable to set dataset shape in read mode");
+ if(datachunks.size() > 1)
+ throw std::runtime_error("Unable to set dataset shape. Dataset configuration is already set");
+ if(imgcounter > 0 && shape.size() >= 2)
+ {
+ if(dims.size() != shape.size())
+ throw std::runtime_error("Unable to set dataset shape. Invalid axis count");
+ if(dims[dims.size() - 2] != shape[shape.size() - 2] || dims[dims.size() - 1] != shape[shape.size() - 1])
+ throw std::runtime_error("Unable to set dataset shape. Image dimensions don't match the existing image dimensions");
+ return;
+ }
+ shape = dims;
+
+ // Resize axis descriptors vector
+ resetAxisInfo();
+
+ // Write shape info
+ if(activechunk)
+ activechunk->writeShapeInfo(shape, chunksize);
+}
+
+/**
+ * Set dataset shape / dimension & axis sizes
+ * First two axis are always width and height
+ * If the shape info is invalid this method will take no effect
+ * Shape can only be set in the write mode, before adding any images
+ * @param dims Axis sizes list
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::setShape(std::initializer_list dims)
+{
+ if(dims.size() < 2)
+ throw std::runtime_error("Unable to set dataset shape. Invalid shape info");
+ if(!writemode)
+ throw std::runtime_error("Unable to set dataset shape in read mode");
+ if(datachunks.size() > 1)
+ throw std::runtime_error("Unable to set dataset shape. Dataset configuration is already set");
+ if(imgcounter > 0 && shape.size() >= 2)
+ {
+ if(dims.size() != shape.size())
+ throw std::runtime_error("Unable to set dataset shape. Invalid axis count");
+ if(*(dims.end() - 2) != shape[shape.size() - 2] || *(dims.end() - 1) != shape[shape.size() - 1])
+ throw std::runtime_error("Unable to set dataset shape. Image dimensions don't match the existing image dimensions");
+ return;
+ }
+ shape = dims;
+
+ // Resize axis descriptors vector
+ resetAxisInfo();
+
+ // Write shape info
+ if(activechunk)
+ activechunk->writeShapeInfo(shape, chunksize);
+}
+
+/**
+ * Set pixel format
+ * If the pixel format is invalid this method will take no effect
+ * Pixel format can only be set in the write mode, before adding any images
+ * @param depth Bit depth (bits per sample)
+ * @parma vsamples Samples per pixel
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::setPixelFormat(std::uint8_t depth, std::uint8_t vsamples)
+{
+ if(!writemode)
+ throw std::runtime_error("Unable to set pixel format in read mode");
+ if(datachunks.size() > 1)
+ throw std::runtime_error("Unable to set pixel format. Dataset configuration is already set");
+ if(imgcounter > 0)
+ {
+ if(bitdepth != depth || samples != vsamples)
+ throw std::runtime_error("Unable to set pixel format. Specified pixel format doesn't match current pixel format");
+ return;
+ }
+ bitdepth = depth;
+ samples = vsamples;
+}
+
+/**
+ * Set dataset metadata
+ * Metadata will be stored in byte buffer whose size is 1 byte larger than the metadata string length
+ * @param meta Metadata string
+ */
+void G2SBigTiffDataset::setMetadata(const std::string& meta)
+{
+ if(!writemode)
+ throw std::runtime_error("Unable to set dataset metadata in read mode");
+
+ metadata.clear();
+ if(meta.empty())
+ return;
+ metadata.resize(meta.size() + 1);
+ std::copy(meta.begin(), meta.end(), metadata.begin());
+}
+
+/**
+ * Set dataset UID
+ * UID must be in a standard UUID format, 16-bytes long hex string with or without the dash delimiters:
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
+ * @param val Dataset UID
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::setUID(const std::string& val)
+{
+ if(!writemode)
+ throw std::runtime_error("Unable to set dataset UID in read mode");
+ if(datachunks.size() > 1)
+ throw std::runtime_error("Unable to set dataset UID. Dataset configuration is already set");
+
+ if(val.empty())
+ datasetuid = val;
+ else
+ {
+ if(val.size() != 32 && val.size() != 36)
+ throw std::runtime_error("Unable to set the dataset UID. Invalid UID format");
+ auto hasdashes = val.size() == 36;
+ if(hasdashes && (val[8] != '-' || val[13] != '-' || val[18] != '-' || val[23] != '-'))
+ throw std::runtime_error("Unable to set the dataset UID. Invalid UID format");
+ for(std::size_t i = 0; i < val.size(); i++)
+ {
+ if(hasdashes && (i == 8 || i == 13 || i == 18 || i == 23))
+ continue;
+ if(val[i] < 48 || val[i] > 102 || (val[i] > 57 && val[i] < 65) || (val[i] > 70 && val[i] < 97))
+ throw std::runtime_error("Unable to set the dataset UID. Invalid UID format");
+ }
+ datasetuid = hasdashes ? val : val.substr(0, 8) + "-" + val.substr(8, 4) + "-" + val.substr(12, 4) + "-" + val.substr(16, 4) + "-" + val.substr(20);
+ }
+
+ // Update file header
+ if(activechunk)
+ activechunk->writeDatasetUid(datasetuid);
+}
+
+/**
+ * Configure axis info
+ * If axis index is invalid this method will have no effect
+ * @param dim Axis index
+ * @param name Axis name
+ * @param desc Axis description
+ */
+void G2SBigTiffDataset::configureAxis(int dim, const std::string& name, const std::string& desc) noexcept
+{
+ if(!writemode)
+ return;
+ if(dim < 0 || (std::size_t)dim >= axisinfo.size())
+ return;
+ axisinfo[dim].Name = name;
+ axisinfo[dim].Description = desc;
+}
+
+/**
+ * Configure axis coordinate info
+ * If axis / coordinate index is invalid this method will have no effect
+ * @param dim Axis index
+ * @param coord Axis coordinate index
+ * @param desc Coordinate description
+ */
+void G2SBigTiffDataset::configureCoordinate(int dim, int coord, const std::string& desc) noexcept
+{
+ if(!writemode)
+ return;
+ if(dim < 0 || (std::size_t)dim >= axisinfo.size() - 2)
+ return;
+ if(coord < 0 || (std::size_t)coord >= axisinfo[dim].Coordinates.size())
+ return;
+ axisinfo[dim].Coordinates[coord] = desc;
+}
+
+/**
+ * Get dataset metadata
+ * If metadata is specified value will be returned from cache, otherwise it will be read from a file stream
+ * @return Metadata string
+ */
+std::string G2SBigTiffDataset::getMetadata() const noexcept
+{
+ // Check metadata cache
+ if(metadata.empty())
+ return "";
+ std::string str(metadata.begin(), metadata.end() - 1);
+ return str;
+}
+
+/**
+ * Get image metadata
+ * If the coordinates are not specified images are read sequentially, metadata for the current image
+ * will be returned, in which case the current image won't be changed
+ * If no metadata is defined this method will return an empty string
+ * If no images are defined this method will return an empty string
+ * In the sequential mode the image IFD will be loaded if this method is called before getImage() (only for the first image)
+ * For other images getImage() should always be called prior to calling getImageMetadata()
+ * @param coord Image coordinates
+ * @return Image metadata
+ * @throws std::runtime_error
+ */
+std::string G2SBigTiffDataset::getImageMetadata(const std::vector& coord)
+{
+ if(!isOpen())
+ throw std::runtime_error("Invalid operation. No open file stream available");
+ if(imgcounter == 0)
+ throw std::runtime_error("Invalid operation. No images available");
+
+ // Select current image (IFD)
+ if(!coord.empty())
+ selectImage(coord);
+ else if(activechunk->getCurrentIFD().empty())
+ // Load IFD
+ activechunk->loadIFD(activechunk->getCurrentIFDOffset());
+
+ return activechunk->getImageMetadata();
+}
+
+/**
+ * Add image / write image to the file
+ * Images are added sequentially
+ * Image data is stored uncompressed
+ * Metadata is stored in plain text, after the pixel data
+ * Image IFD is stored before pixel data
+ * If the new image doesn't belong to the current chunk, a new file will be created automatically, and the current one will be closed
+ * @param buff Image buffer
+ * @param len Image buffer length
+ * @param meta Image metadata (optional)
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::addImage(const unsigned char* buff, std::size_t len, const std::string& meta)
+{
+ if(!isOpen())
+ throw std::runtime_error("Invalid operation. No open file stream available");
+ if(!writemode)
+ throw std::runtime_error("Invalid operation. Unable to add images in read mode");
+ if(shape.size() < 2)
+ throw std::runtime_error("Invalid operation. Dataset shape is not defined");
+ if(!bigTiff && len > TIFF_MAX_BUFFER_SIZE)
+ throw std::runtime_error("Invalid operation. Image data is too long");
+ if(!bigTiff && meta.size() > TIFF_MAX_BUFFER_SIZE)
+ throw std::runtime_error("Invalid operation. Metadata string is too large");
+
+ // Check active data chunk
+ if(chunksize > 0 && imgcounter > 0 && imgcounter % getChunkImageCount() == 0)
+ {
+ // Close current data chunk
+ // Only the first data chunk should contain dataset metadata
+ if(datachunks.size() == 1)
+ activechunk->appendMetadata(metadata);
+ activechunk->close();
+
+ // Create new data chunk
+ std::filesystem::path fp = std::filesystem::path(dspath) / (dsname + "_" + std::to_string(datachunks.size()) + G2SFILE_EXT);
+ activechunk = std::make_shared(fp.u8string(), directIo, bigTiff, (std::uint32_t)datachunks.size());
+ if(!activechunk)
+ throw std::runtime_error("Unable to add an image. Data chunk allocation failed");
+ activechunk->open(true);
+ if(activechunk->getHeader().empty())
+ throw std::runtime_error("Unable to add an image. File header creation failed");
+ activechunk->writeDatasetUid(datasetuid);
+ activechunk->writeShapeInfo(shape, chunksize);
+ datachunks.push_back(activechunk);
+ }
+
+ // Check file size limits
+ activechunk->addImage(buff, len, getWidth(), getHeight(), bitdepth, meta);
+ imgcounter++;
+
+ // Flush pending data
+ if(flushcnt > 0 && activechunk->getImageCount() % flushcnt == 0)
+ activechunk->flush();
+}
+
+/**
+ * Get image data (pixel buffer)
+ * If the coordinates are not specified images are read sequentially
+ * This method will change (advance) the current image
+ * If this method is called after the last available image (in sequential mode), or with invalid coordinates an exception will be thrown
+ * @param coord Image coordinates
+ * @return Image data
+ * @throws std::runtime_error
+ */
+std::vector G2SBigTiffDataset::getImage(const std::vector& coord)
+{
+ if(!isOpen())
+ throw std::runtime_error("Invalid operation. No open file stream available");
+ if(imgcounter == 0)
+ throw std::runtime_error("Invalid operation. No images available");
+
+ // Select current image (IFD)
+ if(!coord.empty())
+ selectImage(coord);
+ else
+ advanceImage();
+ return activechunk->getImage();
+}
+
+/**
+ * Check if image for the specified coordinates is already set
+ * @param coordinates Coordinates list
+ * @param numCoordinates Coordinates count
+ * @return Does image at the specified coordinates exists
+ */
+bool G2SBigTiffDataset::isCoordinateSet(int coordinates[], int numCoordinates) const noexcept
+{
+ std::uint32_t imgind = 0;
+ for(int i = 0; i < numCoordinates; i++)
+ {
+ if(i >= shape.size() - 2)
+ break;
+ std::uint32_t sum = 1;
+ for(int j = i + 1; j < shape.size() - 2; j++)
+ sum *= shape[j];
+ imgind += sum * coordinates[i];
+ }
+ return imgind < imgcounter;
+}
+
+/**
+ * Change active data chunk
+ * This method is used only for reading data
+ * Dataset properties from the new data chunk will be validated
+ * @param chunkind Data chunk index
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::switchDataChunk(std::uint32_t chunkind)
+{
+ // Validate next data chunk
+ validateDataChunk(chunkind, true);
+
+ // Change active data chunk
+ activechunk->close();
+ activechunk = datachunks[chunkind];
+}
+
+/**
+ * Validate data chunk
+ * Data chunk (file stream) will be opened in order to parse the header
+ * File stream won't be closed unless validation fails
+ * @param chunkind Data chunk index
+ * @param index Index data chunk IFDs
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::validateDataChunk(std::uint32_t chunkind, bool index)
+{
+ std::string ldataseuid = "";
+ std::vector lshape;
+ std::uint32_t lchunksz = 0;
+ std::vector lmetadata;
+ std::uint8_t lbitdepth = 0;
+
+ // Open & parse data chunk (file)
+ datachunks[chunkind]->open(false);
+ datachunks[chunkind]->parse(ldataseuid, lshape, lchunksz, lmetadata, lbitdepth, index);
+
+ // Validate dataset properties
+ if(datasetuid != ldataseuid)
+ {
+ datachunks[chunkind]->close();
+ throw std::runtime_error("Invalid data chunk. Dataset UID missmatch");
+ }
+ if(shape.size() != lshape.size())
+ {
+ datachunks[chunkind]->close();
+ throw std::runtime_error("Invalid data chunk. Dataset shape missmatch");
+ }
+ for(std::size_t i = 0; i < shape.size(); i++)
+ {
+ if(shape[i] != lshape[i])
+ {
+ datachunks[chunkind]->close();
+ throw std::runtime_error("Invalid data chunk. Axis " + std::to_string(i) + " size missmatch");
+ }
+ }
+ if(chunksize != lchunksz)
+ {
+ datachunks[chunkind]->close();
+ throw std::runtime_error("Invalid data chunk. Chunk size missmatch");
+ }
+ if(index && bitdepth != lbitdepth)
+ {
+ datachunks[chunkind]->close();
+ throw std::runtime_error("Invalid data chunk. Pixel format missmatch");
+ }
+}
+
+/**
+ * Select image
+ * This method will automatically switch active data chunk
+ * @param coord Image coordinates
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::selectImage(const std::vector& coord)
+{
+ if(coord.empty())
+ return;
+ if(!activechunk)
+ throw std::runtime_error("Invalid operation. Invalid data chunk");
+
+ // Calculate data chunk & image index
+ std::uint32_t chunkind = 0, imgind = 0;
+ calcImageIndex(coord, chunkind, imgind);
+ if(chunkind != activechunk->getChunkIndex())
+ switchDataChunk(chunkind);
+ if(imgind >= activechunk->getIFDOffsets().size())
+ throw std::runtime_error("Invalid operation. Invalid image coordinates");
+
+ // Change current image & load IFD
+ activechunk->setCurrentImage(imgind);
+ activechunk->loadIFD(activechunk->getIFDOffsets()[imgind]);
+}
+
+/**
+ * Advance current image
+ * This method will automatically switch active data chunk
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::advanceImage()
+{
+ if(!activechunk)
+ throw std::runtime_error("Invalid operation. Invalid data chunk");
+ if(activechunk == datachunks.back() && (activechunk->getCurrentImage() + 1 > activechunk->getImageCount() || activechunk->getNextIFDOffset() == 0))
+ throw std::runtime_error("Invalid operation. No more images available");
+
+ // Check if need to switch the data chunk
+ if(activechunk->getCurrentImage() + 1 == activechunk->getImageCount())
+ switchDataChunk(activechunk->getChunkIndex() + 1);
+
+ // Clear current IFD before advancing
+ // In a case where getImageMetadata() is called before any getImage() call
+ // we should skip clearing the current IFD; this works only for the first image
+ if(activechunk->getCurrentImage() > 0)
+ activechunk->advanceIFD();
+
+ // Advance current image
+ activechunk->setCurrentImage(activechunk->getCurrentImage() + 1);
+
+ // Load IFD (skip if already loaded by the getImageMetadata())
+ if(activechunk->getCurrentIFD().empty())
+ activechunk->loadNextIFD();
+}
+
+/**
+ * Get number of images in a data chunk
+ * Data chunk represents a dataset subset with one or more slowest changing dimension coordinates
+ * If chunking is turned OFF this method will return 0
+ * @return Image count
+ */
+std::uint32_t G2SBigTiffDataset::getChunkImageCount() const noexcept
+{
+ if(chunksize == 0)
+ return 0;
+ std::uint32_t ret = 1;
+ for(std::size_t i = 1; i < shape.size() - 2; i++)
+ ret *= shape[i];
+ return chunksize * ret;
+}
+
+/**
+ * Calculate image index from image coordinates
+ * Image coordiantes should not contain indices for the last two dimensions (width & height)
+ * By convention image acquisitions loops through the coordinates in the descending order (higher coordinates are looped first)
+ * E.g. ZTC order means that all channels are acquired before changing the time point, and all specified time points
+ * are acquired before moving the Z-stage, in which case dataset with the shape 2-4-3 for coordinates 1-2-1 will return 19 (=1*12 + 2*3 + 1*1)
+ * First image coordinate can go beyond the specified shape size
+ * @param coord Image coordinates
+ * @param chunkind Data chunk index [out]
+ * @param imgind Image index (in the data chunk) [out]
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::calcImageIndex(const std::vector& coord, std::uint32_t& chunkind, std::uint32_t& imgind) const
+{
+ // Validate coordinates count
+ if(coord.size() > shape.size() - 2)
+ throw std::runtime_error("Invalid number of coordinates");
+ if(chunkind >= datachunks.size() || (chunkind > 0 && chunksize == 0))
+ throw std::runtime_error("Invalid data chunk index");
+ if(coord.empty())
+ {
+ chunkind = 0;
+ imgind = 0;
+ return;
+ }
+
+ // Validate ranges for all axis (except the first)
+ for(std::size_t i = 1; i < coord.size(); i++)
+ {
+ if(coord[i] >= shape[i])
+ throw std::runtime_error("Invalid coordinate for dimension " + std::to_string(i + 2));
+ }
+
+ // Determine chunk index
+ if(chunksize == 0)
+ chunkind = 0;
+ else
+ chunkind = coord[0] / chunksize;
+
+ // Adjust slowest changing dimension index to set the base for image index calculation
+ std::vector lcoord = coord;
+ std::uint32_t baseind = chunkind * chunksize;
+ lcoord[0] -= baseind;
+
+ // Calculate image index
+ std::uint32_t ind = 0;
+ for(int i = 0; i < lcoord.size(); i++)
+ {
+ if(lcoord[i] == 0)
+ continue;
+ std::uint32_t sum = 1;
+ for(int j = i + 1; j < shape.size() - 2; j++)
+ sum *= shape[j];
+ ind += sum * lcoord[i];
+ }
+ imgind = ind;
+}
+
+/**
+ * Reset axis info structure
+ */
+void G2SBigTiffDataset::resetAxisInfo() noexcept
+{
+ axisinfo.clear();
+ axisinfo.resize(shape.size());
+ for(std::size_t i = 0; i < shape.size() - 2; i++)
+ axisinfo[i].setSize((std::size_t)shape[i]);
+}
+
+/**
+ * Parse axis info
+ * Axis info is expected to be stored in a file: 'axisinfo.txt'
+ * @throws std::runtime_error
+ */
+void G2SBigTiffDataset::parseAxisInfo()
+{
+ auto fpath = std::filesystem::u8path(dspath) / G2SAXISINFO_FILE;
+ if(!std::filesystem::exists(fpath) || axisinfo.empty())
+ return;
+
+ // Load file content
+ std::fstream fs(fpath.u8string(), std::ios::in);
+ if(!fs.is_open())
+ throw std::runtime_error("Unable to load axis info. Opening axis info file failed");
+
+ int ind = 0;
+ std::string line = "";
+ while(std::getline(fs, line))
+ {
+ if(line.empty())
+ continue;
+ if((std::size_t)ind >= axisinfo.size())
+ throw std::runtime_error("Unable to load axis info. Invalid axis info data");
+ std::vector tokens = splitLineCSV(line);
+ if(tokens.size() < 3)
+ throw std::runtime_error("Unable to load axis info. Corrupted axis info, axis: " + std::to_string(ind));
+ std::uint32_t axisdim = 0;
+ try
+ {
+ axisdim = std::stoul(tokens[2]);
+ }
+ catch(std::exception& e)
+ {
+ throw std::runtime_error("Unable to load axis info. " + std::string(e.what()) + ", axis: " + std::to_string(ind));
+ }
+ if(axisinfo[ind].Coordinates.size() != axisdim || tokens.size() != (std::size_t)(3 + axisdim))
+ throw std::runtime_error("Unable to load axis info. Axis size missmatch, axis: " + std::to_string(ind));
+ axisinfo[ind].Name = tokens[0];
+ axisinfo[ind].Description = tokens[1];
+ for(std::uint32_t i = 0; i < axisdim; i++)
+ axisinfo[ind].Coordinates[i] = tokens[3 + i];
+ ind++;
+ }
+}
+
+/**
+ * Write axis info
+ * Axis info will be stored in a separate file: 'axisinfo.txt'
+ * If no axis info is defined file won't be created
+ * Axis info will be stored in plain text, CSV-like format
+ */
+void G2SBigTiffDataset::writeAxisInfo() const noexcept
+{
+ // Check if axis info is set, and that we are in WRITE mode
+ if(axisinfo.empty() || !writemode)
+ return;
+
+ bool hasinfo = false;
+ for(const auto& dinf : axisinfo)
+ {
+ if(!dinf.Name.empty() || !dinf.Description.empty())
+ {
+ hasinfo = true;
+ break;
+ }
+ for(const auto& cinf : dinf.Coordinates)
+ {
+ if(!cinf.empty())
+ {
+ hasinfo = true;
+ break;
+ }
+ }
+ if(hasinfo)
+ break;
+ }
+
+ // If axis info is empty, but the file exists -> delete it before exiting
+ auto fpath = std::filesystem::u8path(dspath) / G2SAXISINFO_FILE;
+ if(!hasinfo)
+ {
+ return;
+ }
+
+ // Write data to a file
+ std::fstream fs(fpath.u8string(), std::ios::out | std::ios::trunc);
+ if(!fs.is_open())
+ return;
+ for(const auto& dinf : axisinfo)
+ {
+ fs << "\"" << dinf.Name << "\",\"" << dinf.Description << "\"," << dinf.Coordinates.size();
+ for(const auto& cinf : dinf.Coordinates)
+ fs << ",\"" << cinf << "\"";
+ fs << std::endl;
+ }
+ fs.close();
+}
diff --git a/DeviceAdapters/go2scope/G2SBigTiffDataset.h b/DeviceAdapters/go2scope/G2SBigTiffDataset.h
new file mode 100644
index 000000000..b3eb3d71e
--- /dev/null
+++ b/DeviceAdapters/go2scope/G2SBigTiffDataset.h
@@ -0,0 +1,166 @@
+///////////////////////////////////////////////////////////////////////////////
+// FILE: G2STiffFile.h
+// PROJECT: Micro-Manager
+// SUBSYSTEM: DeviceAdapters
+//-----------------------------------------------------------------------------
+// DESCRIPTION: BIGTIFF storage device driver
+//
+// AUTHOR: Milos Jovanovic
+//
+// COPYRIGHT: Luminous Point LLC, Lumencor Inc. 2024
+//
+// LICENSE: This file is distributed under the BSD license.
+// License text is included with the source distribution.
+//
+// This file is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty
+// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+//
+// IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES.
+////
+///////////////////////////////////////////////////////////////////////////////
+#pragma once
+#include
+#include