Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
235 changes: 235 additions & 0 deletions C++/PAX1000 Polarimeter/PAX1000_sample.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,235 @@
//Example Date of Creation(YYYY - MM - DD) 2025 - 10 - 07
//Example Date of Last Modification on Github 2025 - 10 - 07
//Version of C++ used for Testing and IDE: C++ 14, Visual Studio 2022
//Version of the Thorlabs SDK used : PAX1000 Software version 1.7
//Example Description: The sample code shows how to control a PAX1000 in C++.
//In the example the available PAX1000 are found, a connection is established,
//measurement mode and scan rate are set and scan data is read. Azimuth, ellipticity and DOP are printed to the console.
#include <stdio.h>
#include <string.h>
#include <visa.h>
#include "TLPAX.h"
#include <windows.h>

#define PI_VAL (3.1415926535897932384626433832795f)

ViStatus find_instrument(ViChar** resource);
void error_exit(ViSession instrHdl, ViStatus err);
void waitKeypress(void);
ViStatus get_device_id(ViSession ihdl);
ViStatus set_measurement_mode(ViSession ihdl);
ViStatus set_basic_scan_rate(ViSession ihdl);
ViStatus get_scan(ViSession ihdl);

int main()
{
ViStatus err;
ViChar* rscPtr;
ViSession instrHdl = VI_NULL;
int c, done;

printf("PAX1000 sample\n");

// Find resources
err = find_instrument(&rscPtr);
if (err) error_exit(VI_NULL, err);
if (rscPtr == NULL) exit(EXIT_SUCCESS); // No instrument found


// Open session to PAX series instrumentset
printf("Opening session to '%s' ...\n\n", rscPtr);
err = TLPAX_init(rscPtr, VI_OFF, VI_ON, &instrHdl);
if (err) error_exit(instrHdl, err);

if ((err = get_device_id(instrHdl))) error_exit(instrHdl, err);
if ((err = set_measurement_mode(instrHdl))) error_exit(instrHdl, err);
if ((err = set_basic_scan_rate(instrHdl))) error_exit(instrHdl, err);

Sleep(5000); // Wait 5 s until rotation stabilizes

for (int i = 0; i < 5; i++)
{
if ((err = get_scan(instrHdl))) error_exit(instrHdl, err);
}

if (instrHdl != VI_NULL) TLPAX_close(instrHdl);
return 0;
}

void clearInputBuffer()
{
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}

void error_exit(ViSession instrHdl, ViStatus err)
{
ViChar buf[TLPAX_ERR_DESCR_BUFFER_SIZE];

// Print error
TLPAX_errorMessage(instrHdl, err, buf);
fprintf(stderr, "ERROR: %s\n", buf);

// Close instrument handle if open
if (instrHdl != VI_NULL) TLPAX_close(instrHdl);

// Exit program
waitKeypress();
exit(EXIT_FAILURE);
}

void waitKeypress(void)
{
printf("Press <ENTER> to exit\n");
while (getchar() == EOF);
}

ViStatus find_instrument(ViChar** resource)
{
ViStatus err;
static ViChar rscBuf[TLPAX_BUFFER_SIZE];
ViUInt32 findCnt;

printf("Scanning for instruments ...\n");

*resource = NULL;

err = TLPAX_findRsrc(0, &findCnt);
if (err) return err;

if (findCnt < 1)
{
printf("No matching instruments found\n\n");
return VI_ERROR_RSRC_NFOUND;
}

// connect to first device
err = TLPAX_getRsrcName(0, 0, rscBuf);
if (!err) *resource = rscBuf;
return err;
}

ViStatus get_device_id(ViSession ihdl)
{
ViStatus err;
ViChar nameBuf[TLPAX_BUFFER_SIZE];
ViChar snBuf[TLPAX_BUFFER_SIZE];
ViChar revBuf[TLPAX_BUFFER_SIZE];

err = TLPAX_identificationQuery(ihdl, VI_NULL, nameBuf, snBuf, revBuf);
if (err) return err;
printf("Instrument: %s\n", nameBuf);
printf("Serial number: %s\n", snBuf);
printf("Firmware: V%s\n", revBuf);
if ((err = TLPAX_revisionQuery(ihdl, revBuf, VI_NULL))) return err;
printf("Driver: V%s\n", revBuf);

return VI_SUCCESS;
}

char const* get_measurement_mode_label(ViUInt32 mode)
{
char const* str;

switch (mode)
{
case TLPAX_MEASMODE_IDLE: str = "Idle, no measurements are taken"; break;
case TLPAX_MEASMODE_HALF_512: str = "0.5 revolutions for one measurement, 512 points for FFT"; break;
case TLPAX_MEASMODE_HALF_1024: str = "0.5 revolutions for one measurement, 1024 points for FFT"; break;
case TLPAX_MEASMODE_HALF_2048: str = "0.5 revolutions for one measurement, 2048 points for FFT"; break;
case TLPAX_MEASMODE_FULL_512: str = "1 revolution for one measurement, 512 points for FFT"; break;
case TLPAX_MEASMODE_FULL_1024: str = "1 revolution for one measurement, 1024 points for FFT"; break;
case TLPAX_MEASMODE_FULL_2048: str = "1 revolution for one measurement, 2048 points for FFT"; break;
case TLPAX_MEASMODE_DOUBLE_512: str = "2 revolutions for one measurement, 512 points for FFT"; break;
case TLPAX_MEASMODE_DOUBLE_1024: str = "2 revolutions for one measurement, 1024 points for FFT"; break;
case TLPAX_MEASMODE_DOUBLE_2048: str = "2 revolutions for one measurement, 2048 points for FFT"; break;
default: str = "unknown"; break;
}
return str;
}


ViStatus set_measurement_mode(ViSession ihdl)
{
ViUInt32 mode;

printf("Set Measurement Mode...\n");
for (mode = TLPAX_MEASMODE_IDLE; mode <= TLPAX_MEASMODE_DOUBLE_2048; mode++)
{
printf("(%d) %s\n", mode, get_measurement_mode_label(mode));
}

printf("\nPlease select: ");
while ((mode = getchar()) == EOF);
mode -= '0';
clearInputBuffer();
printf("\n");

return TLPAX_setMeasurementMode(ihdl, mode);
}

ViStatus set_basic_scan_rate(ViSession ihdl)
{
ViStatus err;
ViReal64 bsr, min, max;
char buf[1000];

err = TLPAX_getBasicScanRateLimits(ihdl, &min, &max);
if (err) return err;
printf("Set Basic Sample Rate in 1/s...\n");
printf("Enter new Basic Sample rate (%.1f ... %.1f 1/s): ", min, max);

fgets(buf, sizeof(buf), stdin);
sscanf_s(buf, "%lf", &bsr);
err = TLPAX_setBasicScanRate(ihdl, bsr);
printf("\n\n");
return err;
}


ViStatus get_scan(ViSession ihdl)
{
ViStatus err;
ViSession scanId;
ViReal64 azimuth;
ViReal64 ellipticity;
ViReal64 DOP = 0.0;

err = TLPAX_getLatestScan(ihdl, &scanId);
if (err) return err;
printf("Scan Data:\n");
err = TLPAX_getPolarization(VI_NULL, scanId, &azimuth, &ellipticity);
if (!err) err = TLPAX_getDOP(VI_NULL, scanId, &DOP, NULL, NULL);
TLPAX_releaseScan(VI_NULL, scanId);

if (err) return err;
printf("Azimuth: %.1f degree\n", azimuth * 180.0 / PI_VAL);
printf("Ellipticity: %.1f degree\n", ellipticity * 180.0 / PI_VAL);
printf("DOP: %.1f %%\n\n", DOP * 100.0);
return VI_SUCCESS;
}

























134 changes: 134 additions & 0 deletions C++/PAX1000 Polarimeter/PAX1000_sample.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{27d1ede8-7999-4aed-bf0a-11da69176880}</ProjectGuid>
<RootNamespace>PAX1000sample</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>C:\Program Files\IVI Foundation\VISA\Win64\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>C:\Program Files\IVI Foundation\VISA\Win64\Lib_x64\msc</AdditionalLibraryDirectories>
<AdditionalDependencies>TLPAX_64.lib;%(AdditionalDependencies);visa64.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="PAX1000_sample.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
22 changes: 22 additions & 0 deletions C++/PAX1000 Polarimeter/PAX1000_sample.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Quelldateien">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Headerdateien">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Ressourcendateien">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="PAX1000_sample.cpp">
<Filter>Quelldateien</Filter>
</ClCompile>
</ItemGroup>
</Project>
Loading