From 368fdd92df29ea22743a60d4d89a00c09520f0b3 Mon Sep 17 00:00:00 2001 From: Myzhar Date: Sat, 16 Dec 2017 15:15:42 +0000 Subject: [PATCH] Added source code for LEPTON_SDK * compilation of LEPTON_SDK integrated in grabber_lib --- bbb_life_tracker/CMakeLists.txt | 2 +- .../CMakeDirectoryInformation.cmake | 16 + .../lepton3_grabber.dir/CXX.includecache | 136 ++ .../lepton3_grabber.dir/DependInfo.cmake | 23 + .../CMakeFiles/lepton3_grabber.dir/build.make | 141 ++ .../lepton3_grabber.dir/cmake_clean.cmake | 11 + .../cmake_clean_target.cmake | 3 + .../lepton3_grabber.dir/depend.internal | 21 + .../lepton3_grabber.dir/depend.make | 21 + .../CMakeFiles/lepton3_grabber.dir/flags.make | 10 + .../CMakeFiles/lepton3_grabber.dir/link.txt | 2 + .../lepton3_grabber.dir/progress.make | 4 + grabber_lib/CMakeFiles/progress.marks | 1 + grabber_lib/CMakeLists.txt | 11 +- grabber_lib/Lepton_SDK/CMakeLists.txt | 16 + grabber_lib/Lepton_SDK/lib/LEPTON_SDK.a | Bin 52416 -> 0 bytes grabber_lib/Lepton_SDK/lib/debug_LEPTON_SDK.a | Bin 180216 -> 0 bytes grabber_lib/Lepton_SDK/src/LEPTON_AGC.c | 918 +++++++++ .../Lepton_SDK/src/LEPTON_I2C_Protocol.c | 606 ++++++ .../Lepton_SDK/src/LEPTON_I2C_Service.c | 276 +++ grabber_lib/Lepton_SDK/src/LEPTON_OEM.c | 1058 ++++++++++ grabber_lib/Lepton_SDK/src/LEPTON_RAD.c | 1754 +++++++++++++++++ grabber_lib/Lepton_SDK/src/LEPTON_SDK.c | 574 ++++++ grabber_lib/Lepton_SDK/src/LEPTON_SYS.c | 746 +++++++ grabber_lib/Lepton_SDK/src/LEPTON_VID.c | 714 +++++++ grabber_lib/Lepton_SDK/src/bbb_I2C.c | 360 ++++ grabber_lib/Lepton_SDK/src/crc16fast.c | 144 ++ grabber_lib/Makefile | 210 ++ grabber_lib/cmake_install.cmake | 34 + 29 files changed, 7807 insertions(+), 5 deletions(-) create mode 100644 grabber_lib/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/CXX.includecache create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/DependInfo.cmake create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean.cmake create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean_target.cmake create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.internal create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.make create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/link.txt create mode 100644 grabber_lib/CMakeFiles/lepton3_grabber.dir/progress.make create mode 100644 grabber_lib/CMakeFiles/progress.marks create mode 100644 grabber_lib/Lepton_SDK/CMakeLists.txt delete mode 100644 grabber_lib/Lepton_SDK/lib/LEPTON_SDK.a delete mode 100644 grabber_lib/Lepton_SDK/lib/debug_LEPTON_SDK.a create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_AGC.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_I2C_Protocol.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_I2C_Service.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_OEM.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_RAD.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_SDK.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_SYS.c create mode 100755 grabber_lib/Lepton_SDK/src/LEPTON_VID.c create mode 100644 grabber_lib/Lepton_SDK/src/bbb_I2C.c create mode 100755 grabber_lib/Lepton_SDK/src/crc16fast.c create mode 100644 grabber_lib/Makefile create mode 100644 grabber_lib/cmake_install.cmake diff --git a/bbb_life_tracker/CMakeLists.txt b/bbb_life_tracker/CMakeLists.txt index 558bc75..bd69567 100644 --- a/bbb_life_tracker/CMakeLists.txt +++ b/bbb_life_tracker/CMakeLists.txt @@ -38,7 +38,7 @@ target_link_libraries (test_tracker LINK_PUBLIC add_executable (bbb_life_tracker bbb_life_tracker.cpp ${ENC_SRC} ${TRK_SRC} ) target_link_libraries (bbb_life_tracker LINK_PUBLIC lepton3_grabber - ${LIB_GSTREAMER} + ${LIB_GSTREAMER} opencv_core opencv_highgui opencv_imgproc diff --git a/grabber_lib/CMakeFiles/CMakeDirectoryInformation.cmake b/grabber_lib/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..65f8a98 --- /dev/null +++ b/grabber_lib/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/CXX.includecache b/grabber_lib/CMakeFiles/lepton3_grabber.dir/CXX.includecache new file mode 100644 index 0000000..9de2496 --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/CXX.includecache @@ -0,0 +1,136 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp +Lepton3.hpp +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.hpp +sys/stat.h +- +sys/types.h +- +fcntl.h +- +unistd.h +- +string.h +- +LEPTON_SDK.h +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/LEPTON_SDK.h +LEPTON_SYS.h +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/LEPTON_SYS.h +LEPTON_AGC.h +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/LEPTON_AGC.h +LEPTON_RAD.h +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/LEPTON_RAD.h +LEPTON_VID.h +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/LEPTON_VID.h +bitset +- + +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp +stopwatch.hpp +/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.hpp + +grabber_lib/Lepton_SDK/include/LEPTON_AGC.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h + +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h + +grabber_lib/Lepton_SDK/include/LEPTON_I2C_Protocol.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h +LEPTON_I2C_Service.h +grabber_lib/Lepton_SDK/include/LEPTON_I2C_Service.h + +grabber_lib/Lepton_SDK/include/LEPTON_I2C_Service.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h + +grabber_lib/Lepton_SDK/include/LEPTON_OEM.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h + +grabber_lib/Lepton_SDK/include/LEPTON_RAD.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h + +grabber_lib/Lepton_SDK/include/LEPTON_SDK.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h +LEPTON_SDKConfig.h +grabber_lib/Lepton_SDK/include/LEPTON_SDKConfig.h +LEPTON_I2C_Protocol.h +grabber_lib/Lepton_SDK/include/LEPTON_I2C_Protocol.h + +grabber_lib/Lepton_SDK/include/LEPTON_SDKConfig.h + +grabber_lib/Lepton_SDK/include/LEPTON_SYS.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h + +grabber_lib/Lepton_SDK/include/LEPTON_Types.h +avr_compiler.h +grabber_lib/Lepton_SDK/include/avr_compiler.h +windows.h +- +stdlib.h +- +stdbool.h +- + +grabber_lib/Lepton_SDK/include/LEPTON_VID.h +LEPTON_Types.h +grabber_lib/Lepton_SDK/include/LEPTON_Types.h + +grabber_lib/include/Lepton3.hpp +ctime +- +stdint.h +- +iostream +- +cstdlib +- +thread +- +mutex +- +sys/ioctl.h +- +linux/types.h +- +linux/spi/spidev.h +- +LEPTON_Types.h +grabber_lib/include/LEPTON_Types.h +LEPTON_ErrorCodes.h +grabber_lib/include/LEPTON_ErrorCodes.h +LEPTON_SYS.h +grabber_lib/include/LEPTON_SYS.h +LEPTON_OEM.h +grabber_lib/include/LEPTON_OEM.h +stopwatch.hpp +grabber_lib/include/stopwatch.hpp + +grabber_lib/include/stopwatch.hpp +stdlib.h +- +chrono +- + diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/DependInfo.cmake b/grabber_lib/CMakeFiles/lepton3_grabber.dir/DependInfo.cmake new file mode 100644 index 0000000..27740fe --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp" "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o" + "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp" "/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "grabber_lib/Lepton_SDK/include" + "grabber_lib/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make b/grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make new file mode 100644 index 0000000..28496fb --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make @@ -0,0 +1,141 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB + +# Include any dependencies generated for this target. +include grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.make + +# Include the progress variables for this target. +include grabber_lib/CMakeFiles/lepton3_grabber.dir/progress.make + +# Include the compile flags for this target's objects. +include grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/src/Lepton3.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o -c /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.i" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp > CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.i + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.s" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp -o CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.s + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.requires: + +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.requires + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.provides: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.requires + $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.provides.build +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.provides + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.provides.build: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o + + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o: grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o: grabber_lib/src/stopwatch.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o -c /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.i" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp > CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.i + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.s" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp -o CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.s + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.requires: + +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.requires + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.provides: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.requires + $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.provides.build +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.provides + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.provides.build: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o + + +# Object files for target lepton3_grabber +lepton3_grabber_OBJECTS = \ +"CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o" \ +"CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o" + +# External object files for target lepton3_grabber +lepton3_grabber_EXTERNAL_OBJECTS = + +grabber_lib/liblepton3_grabber.a: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o +grabber_lib/liblepton3_grabber.a: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o +grabber_lib/liblepton3_grabber.a: grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make +grabber_lib/liblepton3_grabber.a: grabber_lib/CMakeFiles/lepton3_grabber.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX static library liblepton3_grabber.a" + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && $(CMAKE_COMMAND) -P CMakeFiles/lepton3_grabber.dir/cmake_clean_target.cmake + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/lepton3_grabber.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +grabber_lib/CMakeFiles/lepton3_grabber.dir/build: grabber_lib/liblepton3_grabber.a + +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/build + +grabber_lib/CMakeFiles/lepton3_grabber.dir/requires: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o.requires +grabber_lib/CMakeFiles/lepton3_grabber.dir/requires: grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o.requires + +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/requires + +grabber_lib/CMakeFiles/lepton3_grabber.dir/clean: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib && $(CMAKE_COMMAND) -P CMakeFiles/lepton3_grabber.dir/cmake_clean.cmake +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/clean + +grabber_lib/CMakeFiles/lepton3_grabber.dir/depend: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/CMakeFiles/lepton3_grabber.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/depend + diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean.cmake b/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean.cmake new file mode 100644 index 0000000..be1f32e --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o" + "CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o" + "liblepton3_grabber.pdb" + "liblepton3_grabber.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/lepton3_grabber.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean_target.cmake b/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..224926a --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "liblepton3_grabber.a" +) diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.internal b/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.internal new file mode 100644 index 0000000..1fe2f18 --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.internal @@ -0,0 +1,21 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o + /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/Lepton3.cpp + grabber_lib/Lepton_SDK/include/LEPTON_AGC.h + grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h + grabber_lib/Lepton_SDK/include/LEPTON_I2C_Protocol.h + grabber_lib/Lepton_SDK/include/LEPTON_I2C_Service.h + grabber_lib/Lepton_SDK/include/LEPTON_OEM.h + grabber_lib/Lepton_SDK/include/LEPTON_RAD.h + grabber_lib/Lepton_SDK/include/LEPTON_SDK.h + grabber_lib/Lepton_SDK/include/LEPTON_SDKConfig.h + grabber_lib/Lepton_SDK/include/LEPTON_SYS.h + grabber_lib/Lepton_SDK/include/LEPTON_Types.h + grabber_lib/Lepton_SDK/include/LEPTON_VID.h + grabber_lib/include/Lepton3.hpp + grabber_lib/include/stopwatch.hpp +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o + /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/src/stopwatch.cpp + grabber_lib/include/stopwatch.hpp diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.make b/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.make new file mode 100644 index 0000000..9e0406d --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/depend.make @@ -0,0 +1,21 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/src/Lepton3.cpp +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_AGC.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_ErrorCodes.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_I2C_Protocol.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_I2C_Service.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_OEM.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_RAD.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_SDK.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_SDKConfig.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_SYS.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_Types.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/Lepton_SDK/include/LEPTON_VID.h +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/include/Lepton3.hpp +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o: grabber_lib/include/stopwatch.hpp + +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o: grabber_lib/src/stopwatch.cpp +grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o: grabber_lib/include/stopwatch.hpp + diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make b/grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make new file mode 100644 index 0000000..1e0a51b --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -std=c++11 -pthread -O3 -DNDEBUG -std=gnu++11 + +CXX_DEFINES = + +CXX_INCLUDES = -I/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/Lepton_SDK/include -I/home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/include + diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/link.txt b/grabber_lib/CMakeFiles/lepton3_grabber.dir/link.txt new file mode 100644 index 0000000..706ec3a --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc liblepton3_grabber.a CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o +/usr/bin/ranlib liblepton3_grabber.a diff --git a/grabber_lib/CMakeFiles/lepton3_grabber.dir/progress.make b/grabber_lib/CMakeFiles/lepton3_grabber.dir/progress.make new file mode 100644 index 0000000..eaef64c --- /dev/null +++ b/grabber_lib/CMakeFiles/lepton3_grabber.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = 9 +CMAKE_PROGRESS_2 = 10 +CMAKE_PROGRESS_3 = 11 + diff --git a/grabber_lib/CMakeFiles/progress.marks b/grabber_lib/CMakeFiles/progress.marks new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/grabber_lib/CMakeFiles/progress.marks @@ -0,0 +1 @@ +3 diff --git a/grabber_lib/CMakeLists.txt b/grabber_lib/CMakeLists.txt index cc8c8a5..5af57c4 100644 --- a/grabber_lib/CMakeLists.txt +++ b/grabber_lib/CMakeLists.txt @@ -7,16 +7,19 @@ file(GLOB_RECURSE GRB_SRC *.c *.cpp) file(GLOB_RECURSE GRB_HDR *.h *.hpp) ######################################################### +# bbb_life_tracker +add_subdirectory(Lepton_SDK) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/Lepton_SDK/include) add_library( lepton3_grabber ${GRB_SRC} ) -target_link_libraries( lepton3_grabber - ${CMAKE_CURRENT_SOURCE_DIR}/Lepton_SDK/lib/LEPTON_SDK.a +target_link_libraries( lepton3_grabber LINK_PUBLIC + lepton_sdk -ldl ) -# Make sure the compiler can find include files for our Hello library -# when other libraries or executables link to Hello +# Make sure the compiler can find include files for our library +# when other libraries or executables link to it target_include_directories( lepton3_grabber PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/Lepton_SDK/include diff --git a/grabber_lib/Lepton_SDK/CMakeLists.txt b/grabber_lib/Lepton_SDK/CMakeLists.txt new file mode 100644 index 0000000..a652428 --- /dev/null +++ b/grabber_lib/Lepton_SDK/CMakeLists.txt @@ -0,0 +1,16 @@ +######################################################### +# SOURCES +file(GLOB_RECURSE SDK_SRC *.c *.cpp) +# HEADERS +file(GLOB_RECURSE SDK_HDR *.h *.hpp) +######################################################### + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) + +add_library( lepton_sdk ${SDK_SRC} ) + +# Make sure the compiler can find include files for our library +# when other libraries or executables link to it +target_include_directories( lepton_sdk PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include +) diff --git a/grabber_lib/Lepton_SDK/lib/LEPTON_SDK.a b/grabber_lib/Lepton_SDK/lib/LEPTON_SDK.a deleted file mode 100644 index 06a386634f91fe49a0683d2b0f2cfcb62a4b734e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52416 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 UhQvmm;8yF$IfOEy1X$eu7gqZft^fc4 diff --git a/grabber_lib/Lepton_SDK/lib/debug_LEPTON_SDK.a b/grabber_lib/Lepton_SDK/lib/debug_LEPTON_SDK.a deleted file mode 100644 index b8f7d1fc8b59d9496b7c54c416e48ec30fb58358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180216 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 diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_AGC.c b/grabber_lib/Lepton_SDK/src/LEPTON_AGC.c new file mode 100755 index 0000000..1b3e597 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_AGC.c @@ -0,0 +1,918 @@ +/******************************************************************************* +** +** File NAME: LEPTON_AGC.c +** +** AUTHOR: David Dart +** +** CREATED: 4/30/2012 +** +** DESCRIPTION: Lepton SDK AGC Module Command Interface +** +** HISTORY: 4/30/2012 DWD - Initial Draft +** +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_SDK.h" +#include "LEPTON_AGC.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +/**************************************/ + +/** + * Retrieves the current AGC Enable state from the Camera. The + * AGC enable state turns AGC On (enabled) or OFF (disabled). + * + * @param agcEnableStatePtr + * Pointer to variable to update with the camera's + * current state. + * Range: + * LEP_AGC_DISABLE=0 + * LEP_AGC_ENABLE =1 + * + * @return LEP_OK if all goes well, otherwise an error code. + */ +LEP_RESULT LEP_GetAgcEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ENABLE_E_PTR agcEnableStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* attribute is an enum, so 32-bit value */ + + /* Validate Parameter(s) + */ + if( agcEnableStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Read the Camera's AGC Enable State + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR )agcEnableStatePtr, + attributeWordLength ); + return( result ); +} + +/** + * Sets the current AGC Enable state on the Camera. The + * AGC enable state turns AGC On (enabled) or OFF (disabled). + * + * @param agcEnableState + * Specifies the enable state to set the camera' AGC + * Range: + * LEP_AGC_DISABLE=0 + * LEP_AGC_ENABLE =1 + * + * @return LEP_OK if all goes well, otherwise an error code. + */ +LEP_RESULT LEP_SetAgcEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ENABLE_E agcEnableState ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* 2 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcEnableState >= LEP_END_AGC_ENABLE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's AGC Enable State + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR ) & agcEnableState, + attributeWordLength ); + return( result ); +} + + + + +LEP_RESULT LEP_GetAgcPolicy( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_POLICY_E_PTR agcPolicyPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* 2 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcPolicyPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Policy + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_POLICY, + ( LEP_ATTRIBUTE_T_PTR )agcPolicyPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetAgcPolicy( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_POLICY_E agcPolicy ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* 2 16-bit value */ + + /* Bounds Check + */ + if( agcPolicy >= LEP_END_AGC_POLICY ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's AGC Policy + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_POLICY, + ( LEP_ATTRIBUTE_T_PTR ) & agcPolicy, + attributeWordLength ); + return( result ); +} + + + +LEP_RESULT LEP_GetAgcROI( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ROI_T_PTR agcROIPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* four 16-bit values */ + + /* Validate Parameter(s) + */ + if( agcROIPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC ROI + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_ROI, + ( LEP_ATTRIBUTE_T_PTR )agcROIPtr, + attributeWordLength ); + //return(sizeof(*agcROIPtr)); + return( result ); +} + + +LEP_RESULT LEP_SetAgcROI( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ROI_T agcROI ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* four 16-bit values */ + + /* Perform Command + ** Writing the Camera's AGC ROI + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_ROI, + ( LEP_ATTRIBUTE_T_PTR ) & agcROI, + attributeWordLength ); + + + return( result ); +} + +LEP_RESULT LEP_GetAgcLinearHistogramClipPercent( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcLinearHistogramClipPercentPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcLinearHistogramClipPercentPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Histogram Clip Percent + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HISTOGRAM_CLIP_PERCENT, + ( LEP_ATTRIBUTE_T_PTR )agcLinearHistogramClipPercentPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetAgcLinearHistogramClipPercent( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcLinearHistogramClipPercent ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC Linear Histogram Clip Percent + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HISTOGRAM_CLIP_PERCENT, + ( LEP_ATTRIBUTE_T_PTR ) & agcLinearHistogramClipPercent, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcLinearHistogramTailSize( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcLinearHistogramTailSizePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcLinearHistogramTailSizePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Histogram Tail Size + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HISTOGRAM_TAIL_SIZE, + ( LEP_ATTRIBUTE_T_PTR )agcLinearHistogramTailSizePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcLinearHistogramTailSize( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcLinearHistogramTailSize ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC Linear Histogram Clip Percent + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HISTOGRAM_TAIL_SIZE, + ( LEP_ATTRIBUTE_T_PTR ) & agcLinearHistogramTailSize, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHistogramStatistics( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HISTOGRAM_STATISTICS_T_PTR *agcHistogramStatisticsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* four 16-bit values */ + + /* Validate Parameter(s) + */ + if( agcHistogramStatisticsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Histogram Statistics + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_STATISTICS, + ( LEP_ATTRIBUTE_T_PTR )agcHistogramStatisticsPtr, + attributeWordLength ); + return( result ); +} + + + +/* Linear Policy Controls +*/ + +LEP_RESULT LEP_GetAgcLinearMaxGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcLinearMaxGainPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcLinearMaxGainPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Max Gain + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_MAX_GAIN, + ( LEP_ATTRIBUTE_T_PTR )agcLinearMaxGainPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcLinearMaxGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcLinearMaxGain ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC Linear Max Gain + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_MAX_GAIN, + ( LEP_ATTRIBUTE_T_PTR ) & agcLinearMaxGain, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcLinearMidPoint( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcLinearMidPointPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcLinearMidPointPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Midpoint + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_MIDPOINT, + ( LEP_ATTRIBUTE_T_PTR )agcLinearMidPointPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcLinearMidPoint( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcLinearMidPoint ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC Linear Midpoint + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_MIDPOINT, + ( LEP_ATTRIBUTE_T_PTR ) & agcLinearMidPoint, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcLinearDampeningFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcLinearDampeningFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcLinearDampeningFactorPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC Linear Dampening Factor + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_DAMPENING_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )agcLinearDampeningFactorPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcLinearDampeningFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcLinearDampeningFactor ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC Linear Histogram Dampening Factor + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_LINEAR_DAMPENING_FACTOR, + ( LEP_ATTRIBUTE_T_PTR ) & agcLinearDampeningFactor, + attributeWordLength + ); + return( result ); +} + + + +/* Heq Policy Controls +*/ + +LEP_RESULT LEP_GetAgcHeqDampingFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqDampingFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqDampingFactorPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Dampening Factor + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_DAMPENING_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )agcHeqDampingFactorPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqDampingFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqDampingFactor ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Histogram Dampening Factor + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_DAMPENING_FACTOR, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqDampingFactor, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHeqMaxGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqMaxGainPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqMaxGainPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Max Gain + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_MAX_GAIN, + ( LEP_ATTRIBUTE_T_PTR )agcHeqMaxGainPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqMaxGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqMaxGain ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Max Gain + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_MAX_GAIN, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqMaxGain, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHeqClipLimitHigh( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqClipLimitHighPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqClipLimitHighPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Clip Limit High + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_CLIP_LIMIT_HIGH, + ( LEP_ATTRIBUTE_T_PTR )agcHeqClipLimitHighPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqClipLimitHigh( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqClipLimitHigh ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Clip Limit High + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_CLIP_LIMIT_HIGH, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqClipLimitHigh, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHeqClipLimitLow( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqClipLimitLowPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqClipLimitLowPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Clip Limit Low + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_CLIP_LIMIT_LOW, + ( LEP_ATTRIBUTE_T_PTR )agcHeqClipLimitLowPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqClipLimitLow( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqClipLimitLow ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Clip Limit Low + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_CLIP_LIMIT_LOW, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqClipLimitLow, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHeqBinExtension( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqBinExtensionPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqBinExtensionPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Bin Extension + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_BIN_EXTENSION, + ( LEP_ATTRIBUTE_T_PTR )agcHeqBinExtensionPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqBinExtension( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqBinExtension ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Bin Extension + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_BIN_EXTENSION, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqBinExtension, + attributeWordLength + ); + return( result ); +} + + +LEP_RESULT LEP_GetAgcHeqMidPoint( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqMidPointPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + /* Validate Parameter(s) + */ + if( agcHeqMidPointPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's AGC HEQ Midpoint + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_MIDPOINT, + ( LEP_ATTRIBUTE_T_PTR )agcHeqMidPointPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetAgcHeqMidPoint( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqMidPoint ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + + /* Perform Command + ** Writing the Camera's AGC HEQ Midpoint + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_MIDPOINT, + ( LEP_ATTRIBUTE_T_PTR ) & agcHeqMidPoint, + attributeWordLength + ); + return( result ); +} + +LEP_RESULT LEP_GetAgcHeqEmptyCount( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_EMPTY_COUNT_T_PTR emptyCountPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_EMPTY_COUNTS, + ( LEP_ATTRIBUTE_T_PTR )emptyCountPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetAgcHeqEmptyCount( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_EMPTY_COUNT_T emptyCount ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_EMPTY_COUNTS, + ( LEP_ATTRIBUTE_T_PTR ) & emptyCount, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetAgcHeqNormalizationFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_NORMALIZATION_FACTOR_T_PTR normalizationFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_NORMALIZATION_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )normalizationFactorPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetAgcHeqNormalizationFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_NORMALIZATION_FACTOR_T normalizationFactor ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_NORMALIZATION_FACTOR, + ( LEP_ATTRIBUTE_T_PTR ) & normalizationFactor, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetAgcHeqScaleFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_SCALE_FACTOR_E_PTR scaleFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_SCALE_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )scaleFactorPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetAgcHeqScaleFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_HEQ_SCALE_FACTOR_E scaleFactor ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_SCALE_FACTOR, + ( LEP_ATTRIBUTE_T_PTR ) & scaleFactor, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetAgcCalcEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ENABLE_E_PTR agcCalculationEnableStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if( agcCalculationEnableStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_CALC_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR )agcCalculationEnableStatePtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetAgcCalcEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_AGC_ENABLE_E agcCalculationEnableState ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if( agcCalculationEnableState >= LEP_END_AGC_ENABLE ) + { + return( LEP_RANGE_ERROR ); + } + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_CALC_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR ) & agcCalculationEnableState, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetAgcHeqLinearPercent( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *agcHeqLinearPercentPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + if( agcHeqLinearPercentPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_LINEAR_PERCENT, + ( LEP_ATTRIBUTE_T_PTR )agcHeqLinearPercentPtr, + attributeWordLength ); + + return(result); +} + +LEP_RESULT LEP_SetAgcHeqLinearPercent( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 agcHeqLinearPercent) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_AGC_HEQ_LINEAR_PERCENT, + ( LEP_ATTRIBUTE_T_PTR )&agcHeqLinearPercent, + attributeWordLength ); + + return(result); +} + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Protocol.c b/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Protocol.c new file mode 100755 index 0000000..b1ce344 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Protocol.c @@ -0,0 +1,606 @@ +/******************************************************************************* +** +** File NAME: LEPTON_I2C_Protocol.c +** +** AUTHOR: David Dart +** +** CREATED: 5/3/2012 +** +** DESCRIPTION: Lepton I2C Protocol Layer +** +** HISTORY: 5/3/2012 DWD - Initial Draft +** +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ + +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_Types.h" +#include "LEPTON_ErrorCodes.h" +#include "LEPTON_I2C_Protocol.h" +#include "LEPTON_I2C_Reg.h" +#include "crc16.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT LEP_I2C_SelectDevice(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PROTOCOL_DEVICE_E device) +{ + LEP_RESULT result; + + result = LEP_I2C_MasterSelectDevice( portDescPtr, device ); + + return(result); +} + +LEP_RESULT LEP_I2C_OpenPort(LEP_UINT16 portID, + LEP_UINT16 *baudRateInkHz, + LEP_UINT8* deviceAddress) +{ + LEP_RESULT result; + LEP_UINT16 statusReg; + + result = LEP_I2C_MasterOpen( portID, baudRateInkHz ); + if(result != LEP_OK) + { + return(LEP_COMM_INVALID_PORT_ERROR); + } + + *deviceAddress = 0x2a; + result = LEP_I2C_MasterReadData( portID, + *deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + + if(result != LEP_OK) + { + /* + * Try 0x00 as the device address if 0x2a didn't work. In this case, we are in Virgin Boot Mode. + * + */ + *deviceAddress = 0x00; + result = LEP_I2C_MasterReadData( portID, + *deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + if(result != LEP_OK) + { + return(LEP_COMM_NO_DEV); + } + } + + return(result); +} + + +LEP_RESULT LEP_I2C_ClosePort(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result; + + result =LEP_I2C_MasterClose( portDescPtr ); + + return(result); +} + + +LEP_RESULT LEP_I2C_ResetPort(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result; + + result = LEP_I2C_MasterReset( portDescPtr ); + + return(result); +} + + +LEP_RESULT LEP_I2C_GetAttribute(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result; + LEP_UINT16 statusReg; + LEP_INT16 statusCode; + LEP_UINT32 done; + LEP_UINT16 crcExpected, crcActual; + + /* Implement the Lepton TWI READ Protocol + */ + /* First wait until the Camera is ready to receive a new + ** command by polling the STATUS REGISTER BUSY Bit until it + ** reports NOT BUSY. + */ + + do + { + /* Read the Status REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + + }while( !done ); + + /* Set the Lepton's DATA LENGTH REGISTER first to inform the + ** Lepton Camera how many 16-bit DATA words we want to read. + */ + result = LEP_I2C_MasterWriteData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_LENGTH_REG, + &attributeWordLength, + 1); + if(result != LEP_OK) + { + return(result); + } + /* Now issue the GET Attribute Command + */ + result = LEP_I2C_MasterWriteData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_COMMAND_REG, + &commandID, + 1); + + if(result != LEP_OK) + { + return(result); + } + + /* Now wait until the Camera has completed this command by + ** polling the statusReg REGISTER BUSY Bit until it reports NOT + ** BUSY. + */ + do + { + /* Read the statusReg REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + + }while( !done ); + + + /* Check statusReg word for Errors? + */ + statusCode = (statusReg >> 8) ? ((statusReg >> 8) | 0xFF00) : 0; + if(statusCode) + { + return((LEP_RESULT)statusCode); + } + + /* If NO Errors then READ the DATA from the DATA REGISTER(s) + */ + if( attributeWordLength <= 16 ) + { + /* Read from the DATA Registers - always start from DATA 0 + ** Little Endean + */ + result = LEP_I2C_MasterReadData(portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_0_REG, + attributePtr, + attributeWordLength ); + } + else if( attributeWordLength <= 1024 ) + { + /* Read from the DATA Block Buffer + */ + result = LEP_I2C_MasterReadData(portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_BUFFER_0, + attributePtr, + attributeWordLength ); + } + if(result == LEP_OK && attributeWordLength > 0) + { + /* Check CRC */ + result = LEP_I2C_MasterReadData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_CRC_REG, + &crcExpected, + 1); + crcActual = (LEP_UINT16)CalcCRC16Words(attributeWordLength, (short*)attributePtr); + + /* Check for 0 in the register in case the camera does not support CRC check + */ + if(crcExpected != 0 && crcExpected != crcActual) + { + return(LEP_CHECKSUM_ERROR); + } + + } + + + return(result); +} + + +LEP_RESULT LEP_I2C_SetAttribute(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result; + LEP_UINT16 statusReg; + LEP_INT16 statusCode; + LEP_UINT32 done; + LEP_UINT16 timeoutCount = LEPTON_I2C_COMMAND_BUSY_WAIT_COUNT; + + /* Implement the Lepton TWI WRITE Protocol + */ + /* First wait until the Camera is ready to receive a new + ** command by polling the STATUS REGISTER BUSY Bit until it + ** reports NOT BUSY. + */ + do + { + /* Read the Status REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + /* Add timout check */ + if( timeoutCount-- == 0 ) + { + /* Timed out waiting for command busy to go away + */ + return(LEP_TIMEOUT_ERROR); + + } + }while( !done ); + + if( result == LEP_OK ) + { + /* Now WRITE the DATA to the DATA REGISTER(s) + */ + if( attributeWordLength <= 16 ) + { + /* WRITE to the DATA Registers - always start from DATA 0 + */ + result = LEP_I2C_MasterWriteData(portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_0_REG, + attributePtr, + attributeWordLength ); + } + else if( attributeWordLength <= 1024 ) + { + /* WRITE to the DATA Block Buffer + */ + result = LEP_I2C_MasterWriteData(portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_BUFFER_0, + attributePtr, + attributeWordLength ); + + } + else + result = LEP_RANGE_ERROR; + } + + if( result == LEP_OK ) + { + /* Set the Lepton's DATA LENGTH REGISTER first to inform the + ** Lepton Camera how many 16-bit DATA words we want to read. + */ + result = LEP_I2C_MasterWriteData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_LENGTH_REG, + &attributeWordLength, + 1); + + if( result == LEP_OK ) + { + /* Now issue the SET Attribute Command + */ + result = LEP_I2C_MasterWriteData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_COMMAND_REG, + &commandID, + 1); + + if( result == LEP_OK ) + { + /* Now wait until the Camera has completed this command by + ** polling the statusReg REGISTER BUSY Bit until it reports NOT + ** BUSY. + */ + do + { + /* Read the statusReg REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadData( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg, + 1 ); + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + + }while( !done ); + + /* Check statusReg word for Errors? + */ + statusCode = (statusReg >> 8) ? ((statusReg >> 8) | 0xFF00) : 0; + if(statusCode) + { + return((LEP_RESULT)statusCode); + } + + } + } + } + + /* Check statusReg word for Errors? + */ + + return(result); +} + + +LEP_RESULT LEP_I2C_RunCommand(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID) +{ + LEP_RESULT result; + LEP_UINT16 statusReg; + LEP_INT16 statusCode; + LEP_UINT32 done; + LEP_UINT16 timeoutCount = LEPTON_I2C_COMMAND_BUSY_WAIT_COUNT; + + /* Implement the Lepton TWI WRITE Protocol + */ + /* First wait until the Camera is ready to receive a new + ** command by polling the STATUS REGISTER BUSY Bit until it + ** reports NOT BUSY. + */ + do + { + /* Read the Status REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadRegister( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg); + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + /* Add timout check */ + if( timeoutCount-- == 0 ) + { + /* Timed out waiting for command busy to go away + */ + + } + }while( !done ); + + if( result == LEP_OK ) + { + /* Set the Lepton's DATA LENGTH REGISTER first to inform the + ** Lepton Camera no 16-bit DATA words being transferred. + */ + result = LEP_I2C_MasterWriteRegister( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_LENGTH_REG, + (LEP_UINT16)0); + + if( result == LEP_OK ) + { + /* Now issue the Run Command + */ + result = LEP_I2C_MasterWriteRegister( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_COMMAND_REG, + commandID); + if( result == LEP_OK ) + { + /* Now wait until the Camera has completed this command by + ** polling the statusReg REGISTER BUSY Bit until it reports NOT + ** BUSY. + */ + do + { + /* Read the statusReg REGISTER and peek at the BUSY Bit + */ + result = LEP_I2C_MasterReadRegister( portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_STATUS_REG, + &statusReg); + if(result != LEP_OK) + { + return(result); + } + done = (statusReg & LEP_I2C_STATUS_BUSY_BIT_MASK)? 0: 1; + /* Timeout? */ + + }while( !done ); + + statusCode = (statusReg >> 8) ? ((statusReg >> 8) | 0xFF00) : 0; + if(statusCode) + { + return((LEP_RESULT)statusCode); + } + } + } + } + + /* Check statusReg word for Errors? + */ + + + return(result); +} + +LEP_RESULT LEP_I2C_DirectReadRegister(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 regAddress, + LEP_UINT16 *regValue) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_I2C_MasterReadRegister( portDescPtr->portID, + portDescPtr->deviceAddress, + regAddress, + regValue); + + return(result); +} + +LEP_RESULT LEP_I2C_GetPortStatus(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result = LEP_OK; + + return(result); +} + +LEP_RESULT LEP_I2C_GetDeviceAddress(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT8* deviceAddress) +{ + LEP_RESULT result = LEP_OK; + + if(deviceAddress == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + *deviceAddress = portDescPtr->deviceAddress; + + return(result); +} + + +LEP_RESULT LEP_I2C_DirectWriteBuffer(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result = LEP_OK; + + /* WRITE to the DATA Block Buffer + */ + result = LEP_I2C_MasterWriteData(portDescPtr->portID, + portDescPtr->deviceAddress, + LEP_I2C_DATA_BUFFER_0, + attributePtr, + attributeWordLength ); + + + + return(result); +} + +LEP_RESULT LEP_I2C_DirectWriteRegister(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 regAddress, + LEP_UINT16 regValue) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_I2C_MasterWriteRegister(portDescPtr->portID, + portDescPtr->deviceAddress, + regAddress, + regValue); + return(result); +} + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Service.c b/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Service.c new file mode 100755 index 0000000..6bf82f4 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_I2C_Service.c @@ -0,0 +1,276 @@ +/******************************************************************************* +* +* FILE: LEPTON_I2C_Service.c +* +* DESCRIPTION: I2C Driver Service Interface +* +* AUTHOR: Dart +* +* CREATED: 4/10/2012 +* +* HISTORY: 4/10/2012 DWD Initial Draft +* +* This service layer supports the Lepton protocol above the +* I2C device. Lepton supported I2C drivers will attach in +* each of these supported functions. +* +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ + +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ + +#include "LEPTON_Types.h" +#include "LEPTON_ErrorCodes.h" +#include "LEPTON_I2C_Service.h" +#include "bbb_I2C.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +#define LEP_I2C_BUSY_BIT_MASK 0x0001 /* Bit 0 is the Busy Bit */ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT LEP_I2C_MasterSelectDevice(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PROTOCOL_DEVICE_E device) +{ + LEP_RESULT result = LEP_OK; + + /* Do any device-specific calls to implement a close operation + */ +#ifdef IMPLEMENTS_SELECT_DEVICE + result = DEV_I2C_MasterSelectDevice(device); +#else + result = LEP_UNDEFINED_FUNCTION_ERROR; +#endif + + return(result); +} + +/* Driver Open +*/ +LEP_RESULT LEP_I2C_MasterOpen(LEP_UINT16 portID, + LEP_UINT16 *portBaudRate) +{ + LEP_RESULT result; + + /* Call the I2C Device-Specific Driver to open device as a + ** Master + */ + result = DEV_I2C_MasterInit( portID, portBaudRate ); + + return(result); +} + +/* Driver Close +*/ +LEP_RESULT LEP_I2C_MasterClose(LEP_CAMERA_PORT_DESC_T_PTR portDescriptorPtr) +{ + LEP_RESULT result = LEP_OK; + + /* Do any device-specific calls to implement a close operation + */ + result = DEV_I2C_MasterClose(); + return(result); +} + +/* Driver Reset +*/ +LEP_RESULT LEP_I2C_MasterReset(LEP_CAMERA_PORT_DESC_T_PTR portDescriptorPtr ) +{ + LEP_RESULT result = LEP_OK; + + return(result); +} + +/** + * Driver Read + * Use Lepton I2C protocol for READ starting from current + * location + * + * @param portID User-defined parameter to identify one of multiple ports + * + * @param deviceAddress This is the Lepton TWI/CCI (I2C) device address. + * + * @param subAddress Specifies the Lepton Register Address to write to + * + * @param dataPtr Pointer to the DATA buffer that is filled by this command + * + * @param dataLength Number of 16-bit words to read. + * + * @return + */ +LEP_RESULT LEP_I2C_MasterReadData(LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 subAddress, + LEP_UINT16 *dataPtr, + LEP_UINT16 dataLength) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 transactionStatus; + LEP_UINT16 numWordsRead; + + result = DEV_I2C_MasterReadData(portID, + deviceAddress, + subAddress, + dataPtr, + dataLength, + &numWordsRead, + &transactionStatus + ); + + return(result); +} + +/** + * Driver Write + * + * @param portID User-defined parameter to identify one of multiple ports + * + * @param subAddress Specifies the Lepton Register Address to write to + * + * @param dataPtr Pointer to a DATA buffer to source the transfers + * + * @param dataLength Specifies the number of 16-bit words to write from the bufffer + * + * @return LEP_RESULT LEP_OK if all goes well; otherwise a Lepton error code. + */ +LEP_RESULT LEP_I2C_MasterWriteData(LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 subAddress, + LEP_UINT16 *dataPtr, + LEP_UINT16 dataLength) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 transactionStatus; + LEP_UINT16 numWordsWritten; + + result = DEV_I2C_MasterWriteData(portID, + deviceAddress, + subAddress, + dataPtr, + dataLength, + &numWordsWritten, + &transactionStatus + ); + return(result); +} + + +LEP_RESULT LEP_I2C_MasterReadRegister(LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 regAddress, + LEP_UINT16 *regValue) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 transactionStatus; + + result = DEV_I2C_MasterReadRegister(portID, + deviceAddress, + regAddress, + regValue, + &transactionStatus + ); + return(result); +} + + +LEP_RESULT LEP_I2C_MasterWriteRegister(LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 regAddress, + LEP_UINT16 regValue) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 transactionStatus; + + result = DEV_I2C_MasterWriteRegister(portID, + deviceAddress, + regAddress, + regValue, + &transactionStatus + ); + return(result); +} + + +/* Driver Status +*/ +LEP_RESULT LEP_I2C_MasterStatus(LEP_UINT16 portID, + LEP_UINT16 *portStatus ) +{ + LEP_RESULT result = LEP_OK; + + return(result); +} + + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_OEM.c b/grabber_lib/Lepton_SDK/src/LEPTON_OEM.c new file mode 100755 index 0000000..e07bbf2 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_OEM.c @@ -0,0 +1,1058 @@ +/******************************************************************************* +** +** File NAME: LEPTON_OEM.c +** +** AUTHOR: David Dart +** +** CREATED: 8/6/2012 +** +** DESCRIPTION: Contains OEM Interfaces +** +** HISTORY: 8/6/2012 DWD - Initial Draft +** +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_SDK.h" +#include "LEPTON_OEM.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** + * Power Down the Camera by asserting the POWERDOWN condition. + * + * @param portDescPtr + * + * @return + */ +LEP_RESULT LEP_RunOemPowerDown( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_POWER_DOWN ); + + return( result ); +} + +LEP_RESULT LEP_RunOemPowerOn( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_DirectWriteRegister( portDescPtr, 0x0, 0x0 ); + + return( result ); +} + +/** + * Places the Camera into the Stand By condition. + * + * @param portDescPtr + * + * @return + */ +LEP_RESULT LEP_RunOemStandby( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + + //result= LEP_RunCommand( portDescPtr, (LEP_COMMAND_ID)LEP_CID_OEM_STANDBY ); + + return( result ); +} + +LEP_RESULT LEP_RunOemReboot( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_REBOOT ); + + return( result ); +} + +LEP_RESULT LEP_RunOemLowPowerMode1( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_LOW_POWER_MODE_1 ); + + return( result ); +} + +LEP_RESULT LEP_RunOemLowPowerMode2( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_LOW_POWER_MODE_2 ); + + return( result ); +} + +LEP_RESULT LEP_RunOemBit( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_BIT_TEST ); + + return( result ); +} + +LEP_RESULT LEP_GetOemMaskRevision( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_MASK_REVISION_T_PTR oemMaskRevisionPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* one 16-bit value */ + + /* Validate Parameter(s) + */ + if( oemMaskRevisionPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Chip Mask Revision + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_MASK_REVISION, + ( LEP_ATTRIBUTE_T_PTR )oemMaskRevisionPtr, + attributeWordLength ); + return( result ); +} +#if 0 +LEP_RESULT LEP_GetOemMasterID( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_MASTER_ID_T_PTR oemMasterIDPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 48; /* 96 bytes */ + + /* Validate Parameter(s) + */ + if( oemMasterIDPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Chip Master ID + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_MASTER_ID, + ( LEP_ATTRIBUTE_T_PTR )oemMasterIDPtr, + attributeWordLength ); + return( result ); +} +#endif + +#if USE_DEPRECATED_PART_NUMBER_INTERFACE +LEP_RESULT LEP_GetOemFlirPartNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PART_NUMBER_T_PTR oemPartNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /* 32 bytes */ + + /* Validate Parameter(s) + */ + if( oemPartNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Part Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_FLIR_PART_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )oemPartNumberPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemCustPartNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PART_NUMBER_T_PTR oemPartNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /* 32 bytes */ + + if( oemPartNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_CUST_PART_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )oemPartNumberPtr, + attributeWordLength ); + return( result ); +} +#else +LEP_RESULT LEP_GetOemFlirPartNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PART_NUMBER_T_PTR oemPartNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /* 32 bytes */ + + /* Validate Parameter(s) + */ + if( oemPartNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Part Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_FLIR_PART_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )oemPartNumberPtr, + attributeWordLength ); + return( result ); +} +LEP_RESULT LEP_GetOemCustPartNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PART_NUMBER_T_PTR oemPartNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /* 32 bytes */ + + if( oemPartNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_CUST_PART_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )oemPartNumberPtr, + attributeWordLength ); + + return( result ); +} +#endif + +LEP_RESULT LEP_GetOemSoftwareVersion( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_SW_VERSION_T *oemSoftwareVersionPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* 4 16-bit words to contain 64-bits */ + + /* Validate Parameter(s) + */ + if( oemSoftwareVersionPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Software Version + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_SOFTWARE_VERSION, + ( LEP_ATTRIBUTE_T_PTR )oemSoftwareVersionPtr, + attributeWordLength ); + return( result ); +} + + +#if 0 +LEP_RESULT LEP_GetOemVendorID(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VENDORID_T *oemVendorIDPtr) +{ + LEP_RESULT result = LEP_OK; + + return( result ); +} +#endif + + + +LEP_RESULT LEP_GetOemVideoOutputEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_ENABLE_E_PTR oemVideoOutputEnablePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputEnablePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video output enable state + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_ENABLE, + ( LEP_ATTRIBUTE_T_PTR )oemVideoOutputEnablePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetOemVideoOutputEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_ENABLE_E oemVideoOutputEnable ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputEnable >= LEP_END_VIDEO_OUTPUT_ENABLE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output enable state + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_ENABLE, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoOutputEnable, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemVideoOutputFormat( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_FORMAT_E_PTR oemVideoOutputFormatPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputFormatPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video output format + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_FORMAT, + ( LEP_ATTRIBUTE_T_PTR )oemVideoOutputFormatPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetOemVideoOutputFormat( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_FORMAT_E oemVideoOutputFormat ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputFormat >= LEP_END_VIDEO_OUTPUT_FORMAT ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output format + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_FORMAT, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoOutputFormat, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemVideoOutputSource( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_SOURCE_E_PTR oemVideoOutputSourcePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputSourcePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video output source selection + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_SOURCE, + ( LEP_ATTRIBUTE_T_PTR )oemVideoOutputSourcePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetOemVideoOutputSource( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_SOURCE_E oemVideoOutputSource ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputSource >= LEP_END_VIDEO_OUTPUT_SOURCE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output source selection + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_SOURCE, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoOutputSource, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemVideoOutputSourceConstant( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 oemVideoOutputSourceConstant ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit values for constant value */ + + + /* Perform Command + ** Reading the Camera's current video output source selection + */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_CONSTANT, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoOutputSourceConstant, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemVideoOutputSourceConstant( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *oemVideoOutputSourceConstPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit values for constant value */ + + if( oemVideoOutputSourceConstPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output source selection + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_CONSTANT, + ( LEP_ATTRIBUTE_T_PTR )oemVideoOutputSourceConstPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_GetOemVideoOutputChannel( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_CHANNEL_E_PTR oemVideoOutputChannelPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputChannelPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video output channel selection + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_CHANNEL, + ( LEP_ATTRIBUTE_T_PTR )oemVideoOutputChannelPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemVideoOutputChannel( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_OUTPUT_CHANNEL_E oemVideoOutputChannel ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoOutputChannel >= LEP_END_VIDEO_OUTPUT_CHANNEL ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output channel selection + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_OUTPUT_CHANNEL, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoOutputChannel, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemVideoGammaEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_GAMMA_ENABLE_E_PTR oemVideoGammaEnablePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoGammaEnablePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video gamma correction enable + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_GAMMA_ENABLE, + ( LEP_ATTRIBUTE_T_PTR )oemVideoGammaEnablePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemVideoGammaEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VIDEO_GAMMA_ENABLE_E oemVideoGammaEnable ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( oemVideoGammaEnable >= LEP_END_VIDEO_GAMMA_ENABLE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output channel selection + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_VIDEO_GAMMA_ENABLE, + ( LEP_ATTRIBUTE_T_PTR ) & oemVideoGammaEnable, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemCalStatus( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_STATUS_E_PTR calStatusPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if( calStatusPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_STATUS, + ( LEP_ATTRIBUTE_T_PTR )calStatusPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetOemFFCNormalizationTarget( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_FFC_NORMALIZATION_TARGET_T_PTR ffcTargetPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* FFC Target is a single 16-bit value */ + + if( ffcTargetPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_FFC_NORMALIZATION_TARGET, + ( LEP_ATTRIBUTE_T_PTR )ffcTargetPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetOemFFCNormalizationTarget( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_FFC_NORMALIZATION_TARGET_T ffcTarget ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_FFC_NORMALIZATION_TARGET, + ( LEP_ATTRIBUTE_T_PTR ) & ffcTarget, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_RunOemFFCNormalization( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_FFC_NORMALIZATION_TARGET_T ffcTarget ) +{ + LEP_RESULT result = LEP_OK; + LEP_OEM_STATUS_E oemStatus = LEP_OEM_STATUS_BUSY; + + result = LEP_SetOemFFCNormalizationTarget( portDescPtr, ffcTarget ); + if( result == LEP_OK ) + { + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_FFC_NORMALIZATION_TARGET ); + while( oemStatus == LEP_OEM_STATUS_BUSY ) + { + LEP_GetOemCalStatus( portDescPtr, &oemStatus ); + } + } + + return( result ); + +} + +LEP_RESULT LEP_RunOemFFC( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_OEM_STATUS_E oemStatus = LEP_OEM_STATUS_BUSY; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_FFC_NORMALIZATION_TARGET ); + while( oemStatus == LEP_OEM_STATUS_BUSY ) + { + LEP_GetOemCalStatus( portDescPtr, &oemStatus ); + } + + return( result ); + +} + +LEP_RESULT LEP_GetOemFrameMean( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_FRAME_AVERAGE_T_PTR frameAveragePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + if( frameAveragePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_SCENE_MEAN_VALUE, + ( LEP_ATTRIBUTE_T_PTR )frameAveragePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetOemPowerMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_POWER_STATE_E_PTR powerModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( powerModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_POWER_MODE, + ( LEP_ATTRIBUTE_T_PTR )powerModePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetOemPowerMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_POWER_STATE_E powerMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( powerMode >= LEP_OEM_END_POWER_MODE ) + { + return( LEP_RANGE_ERROR ); + } + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_POWER_MODE, + ( LEP_ATTRIBUTE_T_PTR ) & powerMode, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetOemGpioMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_GPIO_MODE_E_PTR gpioModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( gpioModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_GPIO_MODE_SELECT, + ( LEP_ATTRIBUTE_T_PTR )gpioModePtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetOemGpioMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_GPIO_MODE_E gpioMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( gpioMode >= LEP_OEM_END_GPIO_MODE ) + { + return( LEP_RANGE_ERROR ); + } + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_GPIO_MODE_SELECT, + ( LEP_ATTRIBUTE_T_PTR ) & gpioMode, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_GetOemGpioVsyncPhaseDelay( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VSYNC_DELAY_E_PTR numHsyncLinesPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( numHsyncLinesPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_GPIO_VSYNC_PHASE_DELAY, + ( LEP_ATTRIBUTE_T_PTR )numHsyncLinesPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetOemGpioVsyncPhaseDelay( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_VSYNC_DELAY_E numHsyncLines ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( numHsyncLines >= LEP_END_OEM_VSYNC_DELAY ) + { + return( LEP_RANGE_ERROR ); + } + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_GPIO_VSYNC_PHASE_DELAY, + ( LEP_ATTRIBUTE_T_PTR ) & numHsyncLines, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetOemUserDefaultsState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_USER_PARAMS_STATE_E_PTR userParamsStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( userParamsStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_USER_DEFAULTS, + ( LEP_ATTRIBUTE_T_PTR )userParamsStatePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_RunOemUserDefaultsCopyToOtp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_USER_DEFAULTS ); + + return( result ); +} + +LEP_RESULT LEP_RunOemUserDefaultsRestore( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_OEM_USER_DEFAULTS_RESTORE ); + + return( result ); +} + + + +LEP_RESULT LEP_SetOemThermalShutdownEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_THERMAL_SHUTDOWN_ENABLE_T ThermalShutdownEnableState ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + + if( ThermalShutdownEnableState.oemThermalShutdownEnable >= LEP_OEM_END_STATE ) + { + return( LEP_RANGE_ERROR ); + } + /* Perform Command + ** Writing the Camera's current video freeze enable state + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_THERMAL_SHUTDOWN_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR ) & ThermalShutdownEnableState, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemThermalShutdownEnable( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_THERMAL_SHUTDOWN_ENABLE_T_PTR ThermalShutdownEnableStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + + if( ThermalShutdownEnableStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_THERMAL_SHUTDOWN_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR )ThermalShutdownEnableStatePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemShutterProfileObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_SHUTTER_PROFILE_OBJ_T ShutterProfileObj ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* 2 words */ + + /* Perform Command + ** Writing the Camera's current video freeze enable state + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_SHUTTER_PROFILE_OBJ, + ( LEP_ATTRIBUTE_T_PTR ) & ShutterProfileObj, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemShutterProfileObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_SHUTTER_PROFILE_OBJ_T_PTR ShutterProfileObjPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* 2 words */ + + if( ShutterProfileObjPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_SHUTTER_PROFILE_OBJ, + ( LEP_ATTRIBUTE_T_PTR )ShutterProfileObjPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetOemBadPixelReplaceControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_BAD_PIXEL_REPLACE_CONTROL_T BadPixelReplaceControl ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two word enums */ + + /* Perform Command + ** Writing the Camera's current video freeze enable state + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_BAD_PIXEL_REPLACE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR ) & BadPixelReplaceControl, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetOemBadPixelReplaceControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_BAD_PIXEL_REPLACE_CONTROL_T_PTR BadPixelReplaceControlPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum */ + if( BadPixelReplaceControlPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_BAD_PIXEL_REPLACE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR )BadPixelReplaceControlPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemTemporalFilterControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_TEMPORAL_FILTER_CONTROL_T TemporalFilterControl ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + + /* Perform Command + ** Writing the Camera's current video freeze enable state + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_TEMPORAL_FILTER_CONTROL, + ( LEP_ATTRIBUTE_T_PTR ) & TemporalFilterControl, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemTemporalFilterControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_TEMPORAL_FILTER_CONTROL_T_PTR TemporalFilterControlPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + if( TemporalFilterControlPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_TEMPORAL_FILTER_CONTROL, + ( LEP_ATTRIBUTE_T_PTR )TemporalFilterControlPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetOemColumnNoiseEstimateControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_COLUMN_NOISE_ESTIMATE_CONTROL_T ColumnNoiseEstimateControl ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_COLUMN_NOISE_ESTIMATE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR ) & ColumnNoiseEstimateControl, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemColumnNoiseEstimateControl( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_COLUMN_NOISE_ESTIMATE_CONTROL_T_PTR ColumnNoiseEstimateControlPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one enum = two words */ + if( ColumnNoiseEstimateControlPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_COLUMN_NOISE_ESTIMATE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR )ColumnNoiseEstimateControlPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetOemPixelNoiseSettings( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PIXEL_NOISE_SETTINGS_T_PTR pixelNoiseSettingsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* struct size 4 bytes */ + + if( pixelNoiseSettingsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_PIXEL_NOISE_ESTIMATE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR )pixelNoiseSettingsPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetOemPixelNoiseSettings( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_OEM_PIXEL_NOISE_SETTINGS_T pixelNoiseSettings ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* struct size 4 bytes */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_OEM_PIXEL_NOISE_ESTIMATE_CONTROL, + ( LEP_ATTRIBUTE_T_PTR ) & pixelNoiseSettings, + attributeWordLength ); + + return( result ); +} diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_RAD.c b/grabber_lib/Lepton_SDK/src/LEPTON_RAD.c new file mode 100755 index 0000000..7770a36 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_RAD.c @@ -0,0 +1,1754 @@ +/******************************************************************************* +* +* FILE: LEPTON_RAD.c +* +* DESCRIPTION: +* +* AUTHOR: dart +* +* CREATED: 11/6/2013 +* +* HISTORY: 11/6/2013 DWD Initial Draft +* +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ + +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ + +#include "LEPTON_SDK.h" +#include "LEPTON_RAD.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT LEP_GetRadTShutterMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TS_MODE_E_PTR radTShutterModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( radTShutterModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current TShutter mode + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TSHUTTER_MODE, + ( LEP_ATTRIBUTE_T_PTR )radTShutterModePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetRadTShutterMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TS_MODE_E radTShutterMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( radTShutterMode >= LEP_RAD_TS_END_TS_MODE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current TShutter mode + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TSHUTTER_MODE, + ( LEP_ATTRIBUTE_T_PTR ) & radTShutterMode, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_GetRadTShutter( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_KELVIN_T_PTR radTShutterPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radTShutterPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TSHUTTER, + ( LEP_ATTRIBUTE_T_PTR )radTShutterPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetRadTShutter( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_KELVIN_T radTShutter ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TSHUTTER, + ( LEP_ATTRIBUTE_T_PTR ) & radTShutter, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_RunRadFFC( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_RAD_STATUS_E radStatus = LEP_RAD_STATUS_BUSY; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_RAD_RUN_FFC ); + if( result == LEP_OK ) + { + //TODO: Add timeout check + while( radStatus == LEP_RAD_STATUS_BUSY ) + { + LEP_GetRadRunStatus( portDescPtr, &radStatus ); + } + } + return( result ); +} + + +LEP_RESULT LEP_GetRadRBFOInternal0( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadRBFOInternal0( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadRBFOExternal0( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadRBFOExternal0( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 4 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadInternalRBFOHighGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadInternalRBFOHighGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadExternalRBFOHighGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadExternalRBFOHighGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 4 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadInternalRBFOLowGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL_LG, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadInternalRBFOLowGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_INTERNAL_LG, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadExternalRBFOLowGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 8 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL_LG, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadExternalRBFOLowGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RBFO_T_PTR radRBFOPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; // RBFO is 4 16-bit words + + if( radRBFOPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RBFO_EXTERNAL_LG, + ( LEP_ATTRIBUTE_T_PTR )radRBFOPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadResponsivityShift( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RS_T_PTR radResponsivityShiftPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radResponsivityShiftPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RESPONSIVITY_SHIFT, + ( LEP_ATTRIBUTE_T_PTR )radResponsivityShiftPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadResponsivityShift( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RS_T radResponsivityShift ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RESPONSIVITY_SHIFT, + ( LEP_ATTRIBUTE_T_PTR ) & radResponsivityShift, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadFNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FNUMBER_T_PTR radFNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radFNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_F_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )radFNumberPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadFNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FNUMBER_T radFNumber ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_F_NUMBER, + ( LEP_ATTRIBUTE_T_PTR ) & radFNumber, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTauLens( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TAULENS_T_PTR radTauLensPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radTauLensPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAU_LENS, + ( LEP_ATTRIBUTE_T_PTR )radTauLensPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTauLens( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TAULENS_T radTauLens ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAU_LENS, + ( LEP_ATTRIBUTE_T_PTR ) & radTauLens, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadRadometryFilter( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RADIOMETRY_FILTER_T_PTR radRadiometryFilterPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radRadiometryFilterPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RADIOMETRY_FILTER, + ( LEP_ATTRIBUTE_T_PTR )radRadiometryFilterPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadRadometryFilter( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RADIOMETRY_FILTER_T radRadiometryFilter ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RADIOMETRY_FILTER, + ( LEP_ATTRIBUTE_T_PTR ) & radRadiometryFilter, + attributeWordLength ); + + return( result ); +} + +/* Deprecated: Use LEP_GetRadTFpaLut */ +LEP_RESULT LEP_GetRadTFpaCLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTFpaCLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTFpaCLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTFpaCLutPtr, + attributeWordLength ); + + return( result ); +} + +/* Deprecated: Use LEP_SetRadTFpaLut */ +LEP_RESULT LEP_SetRadTFpaCLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTFpaCLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTFpaCLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTFpaCLutPtr, + attributeWordLength ); + + return( result ); +} + +/* Deprecated: Use LEP_GetRadTAuxLut */ +LEP_RESULT LEP_GetRadTAuxCLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTAuxCLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTAuxCLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTAuxCLutPtr, + attributeWordLength ); + + return( result ); +} + +/* Deprecated: Use LEP_SetRadTAuxLut */ +LEP_RESULT LEP_SetRadTAuxCLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTAuxCLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTAuxCLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTAuxCLutPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadTFpaLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTFpaLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTFpaLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTFpaLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTFpaLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTFpaLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTFpaLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTFpaLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTAuxLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTAuxLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTAuxLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTAuxLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTAuxLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT256_T_PTR radTAuxLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 256; // 256 16-bit word LUT + + if( radTAuxLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTAuxLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadResponsivityValueLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT128_T_PTR radResponsivityValueLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 128 16-bit word LUT + + if( radResponsivityValueLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RESPONSIVITY_VALUE_LUT, + ( LEP_ATTRIBUTE_T_PTR )radResponsivityValueLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadResponsivityValueLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT128_T_PTR radResponsivityValueLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 128 16-bit word LUT + + if( radResponsivityValueLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RESPONSIVITY_VALUE_LUT, + ( LEP_ATTRIBUTE_T_PTR )radResponsivityValueLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadDebugTemp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_KELVIN_T_PTR radDebugTempPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radDebugTempPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_DEBUG_TEMP, + ( LEP_ATTRIBUTE_T_PTR )radDebugTempPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadDebugTemp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_KELVIN_T radDebugTemp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_DEBUG_TEMP, + ( LEP_ATTRIBUTE_T_PTR ) & radDebugTemp, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadDebugFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T_PTR radDebugFluxPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words + + if( radDebugFluxPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_DEBUG_FLUX, + ( LEP_ATTRIBUTE_T_PTR )radDebugFluxPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadDebugFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T radDebugFlux ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_DEBUG_FLUX, + ( LEP_ATTRIBUTE_T_PTR ) & radDebugFlux, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E_PTR radEnableStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + if( radEnableStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR )radEnableStatePtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E radEnableState ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR ) & radEnableState, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadGlobalGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_GAIN_T_PTR radGlobalGainPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radGlobalGainPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_GLOBAL_GAIN, + ( LEP_ATTRIBUTE_T_PTR )radGlobalGainPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadGlobalGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_GAIN_T radGlobalGain ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_GLOBAL_GAIN, + ( LEP_ATTRIBUTE_T_PTR ) & radGlobalGain, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadGlobalOffset( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_OFFSET_T_PTR radGlobalOffsetPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radGlobalOffsetPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_GLOBAL_OFFSET, + ( LEP_ATTRIBUTE_T_PTR )radGlobalOffsetPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadGlobalOffset( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_OFFSET_T radGlobalOffset ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_GLOBAL_OFFSET, + ( LEP_ATTRIBUTE_T_PTR ) & radGlobalOffset, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTFpaCtsMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_UPDATE_E_PTR radTFpaCtsModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + if( radTFpaCtsModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_CTS_MODE, + ( LEP_ATTRIBUTE_T_PTR )radTFpaCtsModePtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTFpaCtsMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_UPDATE_E radTFpaCtsMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_CTS_MODE, + ( LEP_ATTRIBUTE_T_PTR ) & radTFpaCtsMode, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTAuxCtsMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_UPDATE_E_PTR radTAuxCtsModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + if( radTAuxCtsModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_CTS_MODE, + ( LEP_ATTRIBUTE_T_PTR )radTAuxCtsModePtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTAuxCtsMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_UPDATE_E radTAuxCtsMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // 2 16-bit words for an enum + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_CTS_MODE, + ( LEP_ATTRIBUTE_T_PTR ) & radTAuxCtsMode, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTFpaCts( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_COUNTS_T_PTR radTFpaCtsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radTFpaCtsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_CTS, + ( LEP_ATTRIBUTE_T_PTR )radTFpaCtsPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTFpaCts( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_COUNTS_T radTFpaCts ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TFPA_CTS, + ( LEP_ATTRIBUTE_T_PTR ) & radTFpaCts, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTAuxCts( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_COUNTS_T_PTR radTAuxCtsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + if( radTAuxCtsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_CTS, + ( LEP_ATTRIBUTE_T_PTR )radTAuxCtsPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTAuxCts( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TEMPERATURE_COUNTS_T radTAuxCts ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; // single 16-bit word + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TAUX_CTS, + ( LEP_ATTRIBUTE_T_PTR ) & radTAuxCts, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTEqShutterLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT128_T_PTR radTEqShutterLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 128 16-bit word LUT + + if( radTEqShutterLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TEQ_SHUTTER_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTEqShutterLutPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTEqShutterLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LUT128_T_PTR radTEqShutterLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 128 16-bit word LUT + + if( radTEqShutterLutPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TEQ_SHUTTER_LUT, + ( LEP_ATTRIBUTE_T_PTR )radTEqShutterLutPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadRunStatus( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_STATUS_E_PTR radStatusPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + if( radStatusPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_RUN_STATUS, + ( LEP_ATTRIBUTE_T_PTR )radStatusPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadTEqShutterFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T_PTR radTEqShutterFluxPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // single 32-bit word + + if( radTEqShutterFluxPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TEQ_SHUTTER_FLUX, + ( LEP_ATTRIBUTE_T_PTR )radTEqShutterFluxPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadTEqShutterFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T radTEqShutterFlux ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // single 32-bit word + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TEQ_SHUTTER_FLUX, + ( LEP_ATTRIBUTE_T_PTR ) & radTEqShutterFlux, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadMffcFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T_PTR radRadMffcFluxPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // single 32-bit word + + if( radRadMffcFluxPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_MFFC_FLUX, + ( LEP_ATTRIBUTE_T_PTR )radRadMffcFluxPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadMffcFlux( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_T radRadMffcFlux ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; // single 32-bit word + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_MFFC_FLUX, + ( LEP_ATTRIBUTE_T_PTR ) & radRadMffcFlux, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadFrameMedianPixelValue( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_MEDIAN_VALUE_T_PTR frameMedianPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit word */ + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_FRAME_MEDIAN_VALUE, + ( LEP_ATTRIBUTE_T_PTR )frameMedianPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadMLGLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_SIGNED_LUT128_T_PTR radMLGLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 256 16-bit word LUT + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_MLG_LUT, + ( LEP_ATTRIBUTE_T_PTR )radMLGLutPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetRadMLGLut( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_SIGNED_LUT128_T_PTR radMLGLutPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 128; // 256 16-bit word LUT + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_MLG_LUT, + ( LEP_ATTRIBUTE_T_PTR )radMLGLutPtr, + attributeWordLength ); + + return( result ); +} +#if USE_DEPRECATED_HOUSING_TCP_INTERFACE +LEP_RESULT LEP_GetRadTHousingTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T_PTR radHousingTcp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; // LEP_RAD_LINEAR_TEMP_CORRECTION_T is 4 16-bit words + + if( radHousingTcp == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_THOUSING_TCP, + ( LEP_ATTRIBUTE_T_PTR )radHousingTcp, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetRadTHousingTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T radHousingTcp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_THOUSING_TCP, + ( LEP_ATTRIBUTE_T_PTR ) & radHousingTcp, + attributeWordLength ); + + return( result ); +} +#else +LEP_RESULT LEP_GetRadHousingTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T_PTR RadHousingTcpPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; // LEP_RAD_LINEAR_TEMP_CORRECTION_T is 4 16-bit words + + if( RadHousingTcpPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_HOUSING_TCP, + ( LEP_ATTRIBUTE_T_PTR )RadHousingTcpPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadHousingTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T RadHousingTcp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_HOUSING_TCP, + ( LEP_ATTRIBUTE_T_PTR ) & RadHousingTcp, + attributeWordLength ); + + return( result ); +} +#endif + + + + +LEP_RESULT LEP_GetRadShutterTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T_PTR RadShutterTcpPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; // LEP_RAD_LINEAR_TEMP_CORRECTION_T is 4 16-bit words + + if( RadShutterTcpPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_SHUTTER_TCP, + ( LEP_ATTRIBUTE_T_PTR )RadShutterTcpPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadShutterTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T RadShutterTcp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* single 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_SHUTTER_TCP, + ( LEP_ATTRIBUTE_T_PTR ) & RadShutterTcp, + attributeWordLength ); + + return( result ); +} + + + + +LEP_RESULT LEP_GetRadLensTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T_PTR RadLensTcpPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; // LEP_RAD_LINEAR_TEMP_CORRECTION_T is 4 16-bit words + + if( RadLensTcpPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_LENS_TCP, + ( LEP_ATTRIBUTE_T_PTR )RadLensTcpPtr, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_SetRadLensTcp( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_LINEAR_TEMP_CORRECTION_T RadLensTcp ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* 4 16-bit value */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_LENS_TCP, + ( LEP_ATTRIBUTE_T_PTR ) & RadLensTcp, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetRadPreviousGlobalOffset( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_OFFSET_T_PTR globalOffsetPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_PREVIOUS_GLOBAL_OFFSET, + ( LEP_ATTRIBUTE_T_PTR )globalOffsetPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadPreviousGlobalGain( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_GAIN_T_PTR globalGainPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_PREVIOUS_GLOBAL_GAIN, + ( LEP_ATTRIBUTE_T_PTR )globalGainPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetGlobalGainFFC( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_GLOBAL_GAIN_T_PTR globalGainFfcPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_GLOBAL_GAIN_FFC, + ( LEP_ATTRIBUTE_T_PTR )globalGainFfcPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadCnfScaleFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_PARAMETER_SCALE_FACTOR_T_PTR scaleFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + if( scaleFactorPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_CNF_SCALE_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )scaleFactorPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_GetRadTnfScaleFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_PARAMETER_SCALE_FACTOR_T_PTR scaleFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + if( scaleFactorPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_TNF_SCALE_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )scaleFactorPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_GetRadSnfScaleFactor( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_PARAMETER_SCALE_FACTOR_T_PTR scaleFactorPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + if( scaleFactorPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_SNF_SCALE_FACTOR, + ( LEP_ATTRIBUTE_T_PTR )scaleFactorPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadArbitraryOffset( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_T_PTR arbitraryOffsetPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + if( arbitraryOffsetPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_ARBITRARY_OFFSET, + ( LEP_ATTRIBUTE_T_PTR )arbitraryOffsetPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetRadArbitraryOffset( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_T arbitraryOffset ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_RAD_ARBITRARY_OFFSET, + ( LEP_ATTRIBUTE_T_PTR ) & arbitraryOffset, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetRadFluxLinearParams(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_LINEAR_PARAMS_T_PTR fluxParamsPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; + + if(fluxParamsPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_FLUX_LINEAR_PARAMS, + (LEP_ATTRIBUTE_T_PTR)fluxParamsPtr, + attributeWordLength); + + return(result); +} + +LEP_RESULT LEP_SetRadFluxLinearParams(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_FLUX_LINEAR_PARAMS_T fluxParams) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 8; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_FLUX_LINEAR_PARAMS, + (LEP_ATTRIBUTE_T_PTR)&fluxParams, + attributeWordLength); + + return(result); +} + +LEP_RESULT LEP_GetRadTLinearEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E_PTR enableStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if(enableStatePtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_ENABLE_STATE, + (LEP_ATTRIBUTE_T_PTR)enableStatePtr, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_SetRadTLinearEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E enableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_ENABLE_STATE, + (LEP_ATTRIBUTE_T_PTR)&enableState, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadTLinearResolution(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TLINEAR_RESOLUTION_E_PTR resolutionPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if(resolutionPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_RESOLUTION, + (LEP_ATTRIBUTE_T_PTR)resolutionPtr, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_SetRadTLinearResolution(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_TLINEAR_RESOLUTION_E resolution) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_RESOLUTION, + (LEP_ATTRIBUTE_T_PTR)&resolution, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadTLinearAutoResolution(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E_PTR enableStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if(enableStatePtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_AUTO_RESOLUTION, + (LEP_ATTRIBUTE_T_PTR)enableStatePtr, + attributeWordLength); + return(result); +} +LEP_RESULT LEP_SetRadTLinearAutoResolution(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ENABLE_E enableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_TLINEAR_AUTO_RESOLUTION, + (LEP_ATTRIBUTE_T_PTR)&enableState, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadSpotmeterRoi(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ROI_T_PTR spotmeterRoiPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; + + if(spotmeterRoiPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_SPOTMETER_ROI, + (LEP_ATTRIBUTE_T_PTR)spotmeterRoiPtr, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_SetRadSpotmeterRoi(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ROI_T spotmeterRoi) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_SPOTMETER_ROI, + (LEP_ATTRIBUTE_T_PTR)&spotmeterRoi, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadSpotmeterObjInKelvinX100(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_SPOTMETER_OBJ_KELVIN_T_PTR kelvinPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; + + if(kelvinPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_SPOTMETER_OBJ_KELVIN, + (LEP_ATTRIBUTE_T_PTR)kelvinPtr, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadArbitraryOffsetMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_MODE_E_PTR arbitraryOffsetModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if(arbitraryOffsetModePtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_ARBITRARY_OFFSET_MODE, + (LEP_ATTRIBUTE_T_PTR)arbitraryOffsetModePtr, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_SetRadArbitraryOffsetMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_MODE_E arbitraryOffsetMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_ARBITRARY_OFFSET_MODE, + (LEP_ATTRIBUTE_T_PTR)&arbitraryOffsetMode, + attributeWordLength); + return(result); +} + +LEP_RESULT LEP_GetRadArbitraryOffsetParams( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_PARAMS_T_PTR arbitraryOffsetParamsPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if(arbitraryOffsetParamsPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_ARBITRARY_OFFSET_PARAMS, + (LEP_ATTRIBUTE_T_PTR)arbitraryOffsetParamsPtr, + attributeWordLength); + return(result); + +} + +LEP_RESULT LEP_SetRadArbitraryOffsetParams( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_ARBITRARY_OFFSET_PARAMS_T arbitraryOffsetParams) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_ARBITRARY_OFFSET_PARAMS, + (LEP_ATTRIBUTE_T_PTR)&arbitraryOffsetParams, + attributeWordLength); + return(result); +} + +extern LEP_RESULT LEP_GetRadRadioCalValues( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RADIO_CAL_VALUES_T_PTR radRadioCalValuesPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; + + if(radRadioCalValuesPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_RADIO_CAL_VALUES, + (LEP_ATTRIBUTE_T_PTR)radRadioCalValuesPtr, + attributeWordLength); + return(result); +} + +extern LEP_RESULT LEP_SetRadRadioCalValues( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_RAD_RADIO_CAL_VALUES_T radRadioCalValues ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; + + result = LEP_SetAttribute(portDescPtr, + (LEP_COMMAND_ID)LEP_CID_RAD_RADIO_CAL_VALUES, + (LEP_ATTRIBUTE_T_PTR)&radRadioCalValues, + attributeWordLength); + return(result); +} + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_SDK.c b/grabber_lib/Lepton_SDK/src/LEPTON_SDK.c new file mode 100755 index 0000000..df24ff5 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_SDK.c @@ -0,0 +1,574 @@ +/******************************************************************************* +* +* FILE: LEPTON_SDK.c +* +* DESCRIPTION: Lepton SDK +* +* AUTHOR: +* +* CREATED: 3/1/2012 +* +* HISTORY: 3/1/2012 DWD Initial Draft +* +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ + +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_SDK.h" +#include "LEPTON_I2C_Protocol.h" + + + +#ifdef LEP_USE_DYNAMIC_ALLOCATION + #include "stdlib.h" +#endif + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ +static LEP_RESULT _LEP_DelayCounts(LEP_UINT32 counts); + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ +LEP_SDK_VERSION_T sdkVersion; +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT LEP_GetAttribute(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result = LEP_OK; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Validate input pointer + */ + if( attributePtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Modify the passed-in command ID to add the Get type + */ + commandID |= LEP_GET_TYPE; + + /* Perform Command using the active Port + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_GetAttribute( portDescPtr, + commandID, + attributePtr, + attributeWordLength ); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + +/** + * Sets the value of a camera attribute. + * + * @return + */ +LEP_RESULT LEP_SetAttribute(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result = LEP_OK; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Modify the passed-in command ID to add the Get type + */ + commandID |= LEP_SET_TYPE; + + /* Issue Command to the Active Port + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_SetAttribute( portDescPtr, + commandID, + attributePtr, + attributeWordLength ); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + +LEP_RESULT LEP_RunCommand(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_COMMAND_ID commandID) +{ + LEP_RESULT result = LEP_OK; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Modify the passed-in command ID to add the Run type + */ + commandID |= LEP_RUN_TYPE; + + /* Perform Command + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_RunCommand( portDescPtr, + commandID); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + + +LEP_RESULT LEP_SelectDevice(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PROTOCOL_DEVICE_E device) +{ + LEP_RESULT result = LEP_OK; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Select Device + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + result = LEP_I2C_SelectDevice(portDescPtr, device); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + +/******************************************************************************/ +/** + * Opens a Lepton commnications port of the specified type and + * is assigned the passed ID. + * This function dynamically allocates a new descriptor from the + * system heap. + * + * @param portID LEP_UINT 16 User defined port ID. This + * value is not used by the Lepton SDK but + * provides the ability for + * application-specific use. + * + * @param portType LEP_CAMERA_PORT_E Specifies the Lepton + * Communications Port type. + * + * @param pDescriptor LEP_CAMERA_PORT_DESC_T_PTR Lepton Port + * descriptor. This is a handle to a valid + * Lepton port is fusseccful, NULL otherwise. + * + * @return LEP_RESULT Lepton Error Code. LEP_OK if all goes well, + * otherise and Lepton error code is retunred. + */ +LEP_RESULT LEP_OpenPort(LEP_UINT16 portID, + LEP_CAMERA_PORT_E portType, + LEP_UINT16 portBaudRate, + LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result; + LEP_UINT8 deviceAddress; + + /* Attempt to acquire memory + ** Dynamic creation using malloc() or static allocation + ** Our reference will us dynamic creation + */ +#ifdef LEP_USE_DYNAMIC_ALLOCATION + /* Allocate from the heap + */ + portDescPtr = (LEP_CAMERA_PORT_DESC_T_PTR)malloc( sizeof(LEP_CAMERA_PORT_DESC_T)); +#else + /* Allocate from static memory + */ +#endif + + /* Validate the port descriptor + */ + if( portDescPtr != NULL ) + { + /* Open Port driver + */ + switch( portType ) + { + case LEP_CCI_TWI: + result = LEP_I2C_OpenPort(portID, &portBaudRate, &deviceAddress); + if( result == LEP_OK ) + { + portDescPtr->portBaudRate = portBaudRate; + portDescPtr->portID = portID; + portDescPtr->portType = portType; + portDescPtr->deviceAddress = deviceAddress; + } + +#ifdef LEP_USE_DYNAMIC_ALLOCATION + else + free( portDescPtr); +#endif + + + break; + + case LEP_CCI_SPI: + break; + + default: + break; + } + } + else + result = LEP_ERROR_CREATING_COMM; + + + return(result); +} + +LEP_RESULT LEP_ClosePort(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Close Port driver + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + result = LEP_I2C_ClosePort(portDescPtr); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + + +#ifdef LEP_USE_DYNAMIC_ALLOCATION + free( portDescPtr ); +#endif + + return(result); +} + + +LEP_RESULT LEP_ResetPort(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr) +{ + LEP_RESULT result; + + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + if( portDescPtr->portType == LEP_CCI_TWI ) + { + LEP_I2C_ResetPort( portDescPtr ); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + + +LEP_RESULT LEP_GetPortStatus(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 *status) +{ + LEP_RESULT result; + + + return(result); +} + +LEP_RESULT LEP_DirectReadRegister(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 registerAddress, + LEP_UINT16* regValue) +{ + LEP_RESULT result = LEP_OK; + + + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_DirectReadRegister(portDescPtr, registerAddress, regValue); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + + return(result); +} + +LEP_RESULT LEP_GetDeviceAddress(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT8* deviceAddress) +{ + LEP_RESULT result = LEP_OK; + + if(portDescPtr->portType == LEP_CCI_TWI) + { + result = LEP_I2C_GetDeviceAddress(portDescPtr, deviceAddress); + } + + return(result); +} + + +LEP_RESULT LEP_DirectWriteRegister(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_UINT16 registerAddress, + LEP_UINT16 regValue) +{ + LEP_RESULT result = LEP_OK; + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Issue Command to the Active Port + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_DirectWriteRegister(portDescPtr, registerAddress, regValue); + + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + return(result); +} + +LEP_RESULT LEP_DirectWriteBuffer(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_ATTRIBUTE_T_PTR attributePtr, + LEP_UINT16 attributeWordLength) +{ + LEP_RESULT result; + /* Validate the port descriptor + */ + if( portDescPtr == NULL ) + { + return(LEP_COMM_PORT_NOT_OPEN); + } + + /* Issue Command to the Active Port + */ + if( portDescPtr->portType == LEP_CCI_TWI ) + { + /* Use the Lepton TWI/CCI Port + */ + result = LEP_I2C_DirectWriteBuffer(portDescPtr, + attributePtr, + attributeWordLength ); + } + else if( portDescPtr->portType == LEP_CCI_SPI ) + { + /* Use the Lepton SPI Port + */ + + } + else + result = LEP_COMM_INVALID_PORT_ERROR; + return(result); +} + +LEP_RESULT LEP_GetSDKVersion(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SDK_VERSION_T_PTR sdkVersionPtr) +{ + LEP_RESULT result = LEP_OK; + + if(sdkVersionPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + sdkVersionPtr->major = LEP_SDK_VERSION_MAJOR; + sdkVersionPtr->minor = LEP_SDK_VERSION_MINOR; + sdkVersionPtr->build = LEP_SDK_VERSION_BUILD; + + return(result); +} + +LEP_RESULT LEP_GetCameraBootStatus(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SDK_BOOT_STATUS_E_PTR bootStatusPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 regValue; + + result = LEP_DirectReadRegister(portDescPtr, 0x2, ®Value); + + if(result == LEP_OK && regValue & 4) + { + *bootStatusPtr = LEP_BOOT_STATUS_BOOTED; + } + else + { + *bootStatusPtr = LEP_BOOT_STATUS_NOT_BOOTED; + } + + return(result); +} + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT _LEP_DelayCounts(LEP_UINT32 counts) +{ + LEP_UINT32 a; + while( counts-- ) + { + a=counts; + } + if( a ) + { + return(LEP_TIMEOUT_ERROR) ; + } + return(LEP_OK); +} + + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_SYS.c b/grabber_lib/Lepton_SDK/src/LEPTON_SYS.c new file mode 100755 index 0000000..0291434 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_SYS.c @@ -0,0 +1,746 @@ +/******************************************************************************* +** +** File NAME: LEPTON_SYS.c +** +** AUTHOR: David Dart +** +** CREATED: 5/8/2012 +** +** DESCRIPTION: Lepton SDK System Module Command Interface +** +** HISTORY: 5/8/2012 DWD - Initial Draft +** +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_SDK.h" +#include "LEPTON_SYS.h" + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + + +LEP_RESULT LEP_RunSysPing( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_SYS_PING ); + + return( result ); +} + +LEP_RESULT LEP_GetSysStatus( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_STATUS_T_PTR sysStatusPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* 4 16-bit values */ + + /* Validate Parameter(s) + */ + if( sysStatusPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Status + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_CAM_STATUS, + ( LEP_ATTRIBUTE_T_PTR )sysStatusPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_GetSysFlirSerialNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FLIR_SERIAL_NUMBER_T_PTR sysSerialNumberBufPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* 8 bytes values */ + + /* Validate Parameter(s) + */ + if( sysSerialNumberBufPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Serial Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FLIR_SERIAL_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )sysSerialNumberBufPtr, + attributeWordLength ); + return( result ); +} +#if USE_DEPRECATED_SERIAL_NUMBER_INTERFACE +LEP_RESULT LEP_GetSysCustSerialNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_CUST_SERIAL_NUMBER_T_PTR sysSerialNumberPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /* 32 byte string */ + + if( sysSerialNumberPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_CUST_SERIAL_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )sysSerialNumberPtr, + attributeWordLength ); + + return( result ); +} +#else + +LEP_RESULT LEP_GetSysCustSerialNumber( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_CUST_SERIAL_NUMBER_T_PTR sysCustSNPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; /*32 byte string */ + + if( sysCustSNPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_CUST_SERIAL_NUMBER, + ( LEP_ATTRIBUTE_T_PTR )sysCustSNPtr, + attributeWordLength ); +} +#endif +LEP_RESULT LEP_GetSysCameraUpTime( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_UPTIME_NUMBER_T_PTR sysCameraUpTimePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values */ + + /* Validate Parameter(s) + */ + if( sysCameraUpTimePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Serial Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_CAM_UPTIME, + ( LEP_ATTRIBUTE_T_PTR )sysCameraUpTimePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetSysAuxTemperatureCelcius( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_AUX_TEMPERATURE_CELCIUS_T_PTR auxTemperaturePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_SYS_AUX_TEMPERATURE_KELVIN_T unitsKelvin; + + /* Validate Parameter(s) + */ + if( auxTemperaturePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetSysAuxTemperatureKelvin( portDescPtr, &unitsKelvin ); + *auxTemperaturePtr = ( LEP_SYS_AUX_TEMPERATURE_CELCIUS_T )( ( ( unitsKelvin / 100 ) + ( ( unitsKelvin % 100 ) * .01 ) ) - 273.15 ); + + return( result ); +} + + +LEP_RESULT LEP_GetSysFpaTemperatureCelcius( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FPA_TEMPERATURE_CELCIUS_T_PTR fpaTemperaturePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_SYS_FPA_TEMPERATURE_KELVIN_T unitsKelvin; + + /* Validate Parameter(s) + */ + if( fpaTemperaturePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetSysFpaTemperatureKelvin( portDescPtr, &unitsKelvin ); + *fpaTemperaturePtr = ( LEP_SYS_FPA_TEMPERATURE_CELCIUS_T )( ( ( unitsKelvin / 100 ) + ( ( unitsKelvin % 100 ) * .01 ) ) - 273.15 ); + + return( result ); +} + +LEP_RESULT LEP_GetSysAuxTemperatureKelvin( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_AUX_TEMPERATURE_KELVIN_T_PTR auxTemperaturePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* one 16-bit values */ + + /* Validate Parameter(s) + */ + if( auxTemperaturePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Serial Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_AUX_TEMPERATURE_KELVIN, + ( LEP_ATTRIBUTE_T_PTR )auxTemperaturePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetSysFpaTemperatureKelvin( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FPA_TEMPERATURE_KELVIN_T_PTR fpaTemperaturePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* one 16-bit values */ + + /* Validate Parameter(s) + */ + if( fpaTemperaturePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's Serial Number + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FPA_TEMPERATURE_KELVIN, + ( LEP_ATTRIBUTE_T_PTR )fpaTemperaturePtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetSysTelemetryEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_TELEMETRY_ENABLE_STATE_E_PTR enableStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bits */ + + if( enableStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_TELEMETRY_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR )enableStatePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysTelemetryEnableState( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_TELEMETRY_ENABLE_STATE_E enableState ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bits */ + + if( enableState >= LEP_END_TELEMETRY_ENABLE_STATE ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_TELEMETRY_ENABLE_STATE, + ( LEP_ATTRIBUTE_T_PTR ) & enableState, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_GetSysTelemetryLocation( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_TELEMETRY_LOCATION_E_PTR telemetryLocationPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bits */ + + if( telemetryLocationPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_TELEMETRY_LOCATION, + ( LEP_ATTRIBUTE_T_PTR )telemetryLocationPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysTelemetryLocation( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_TELEMETRY_LOCATION_E telemetryLocation ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bits */ + + if( telemetryLocation >= LEP_END_TELEMETRY_LOCATION ) + { + return( LEP_RANGE_ERROR ); + } + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_TELEMETRY_LOCATION, + ( LEP_ATTRIBUTE_T_PTR ) & telemetryLocation, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_RunFrameAverage( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result; + + /* Run the frame averaging command + */ + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )LEP_CID_SYS_EXECTUE_FRAME_AVERAGE ); + + return( result ); +} + +LEP_RESULT LEP_RunSysAverageFrames( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FRAME_AVERAGE_DIVISOR_E numFrameToAverage ) +{ + LEP_RESULT result = LEP_OK; + + /* Set the requested frames to average + */ + result = LEP_SetSysFramesToAverage( portDescPtr, numFrameToAverage ); + + if( result == LEP_OK ) + { + /* Run the frame averaging command + */ + result = LEP_RunFrameAverage( portDescPtr ); + } + + return( result ); +} + +LEP_RESULT LEP_GetSysFramesToAverage( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FRAME_AVERAGE_DIVISOR_E_PTR numFrameToAveragePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* one 32-bit value enum */ + + /* Validate Parameter(s) + */ + if( numFrameToAveragePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current number of frames to average + ** step + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_NUM_FRAMES_TO_AVERAGE, + ( LEP_ATTRIBUTE_T_PTR )numFrameToAveragePtr, + attributeWordLength ); + + + return( result ); +} + +LEP_RESULT LEP_SetSysFramesToAverage( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FRAME_AVERAGE_DIVISOR_E numFrameToAverage ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + /* Validate Parameter(s) + */ + if( numFrameToAverage >= LEP_SYS_END_FA_DIV ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current number of frames to average + ** step + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_NUM_FRAMES_TO_AVERAGE, + ( LEP_ATTRIBUTE_T_PTR ) & numFrameToAverage, + attributeWordLength ); + + + return( result ); +} + +LEP_RESULT LEP_GetSysSceneStatistics( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_SCENE_STATISTICS_T_PTR sceneStatisticsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* struct contains 4 16-bit values */ + + if( sceneStatisticsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_SCENE_STATISTICS, + ( LEP_ATTRIBUTE_T_PTR )sceneStatisticsPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetSysSceneRoi( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_VIDEO_ROI_T_PTR sceneRoiPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* roi consists of 4 16-bit values */ + + if( sceneRoiPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_SCENE_ROI, + ( LEP_ATTRIBUTE_T_PTR )sceneRoiPtr, + attributeWordLength ); + + return( result ); +} +LEP_RESULT LEP_SetSysSceneRoi( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_VIDEO_ROI_T sceneRoi ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* roi consists of 4 16-bit values */ + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_SCENE_ROI, + ( LEP_ATTRIBUTE_T_PTR ) & sceneRoi, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetSysThermalShutdownCount( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_THERMAL_SHUTDOWN_COUNTS_T_PTR thermalCountsPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 1; /* 1 16-bit value */ + + if( thermalCountsPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_THERMAL_SHUTDOWN_COUNT, + ( LEP_ATTRIBUTE_T_PTR )thermalCountsPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetSysShutterPosition( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_SHUTTER_POSITION_E_PTR shutterPositionPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( shutterPositionPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_SHUTTER_POSITION, + ( LEP_ATTRIBUTE_T_PTR )shutterPositionPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysShutterPosition( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_SHUTTER_POSITION_E shutterPosition ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( shutterPosition >= LEP_SYS_SHUTTER_POSITION_END ) + { + return( LEP_RANGE_ERROR ); + } + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_SHUTTER_POSITION, + ( LEP_ATTRIBUTE_T_PTR ) & shutterPosition, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetSysFfcShutterModeObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FFC_SHUTTER_MODE_OBJ_T_PTR shutterModeObjPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; + + if( shutterModeObjPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FFC_SHUTTER_MODE_OBJ, + ( LEP_ATTRIBUTE_T_PTR )shutterModeObjPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysFfcShutterModeObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FFC_SHUTTER_MODE_OBJ_T shutterModeObj ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FFC_SHUTTER_MODE_OBJ, + ( LEP_ATTRIBUTE_T_PTR ) & shutterModeObj, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_RunSysFFCNormalization( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_SYS_STATUS_E sysStatus = LEP_SYS_STATUS_BUSY; + + result = LEP_RunCommand( portDescPtr, ( LEP_COMMAND_ID )FLR_CID_SYS_RUN_FFC ); + while( sysStatus == LEP_SYS_STATUS_BUSY ) + { + LEP_GetSysFFCStatus( portDescPtr, &sysStatus ); + } + + return( result ); +} + +LEP_RESULT LEP_GetSysFFCStatus( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_STATUS_E_PTR ffcStatusPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if( ffcStatusPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FFC_STATUS, + ( LEP_ATTRIBUTE_T_PTR )ffcStatusPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetSysGainMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_GAIN_MODE_E_PTR gainModePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* enums are 32-bit */ + + if( gainModePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_GAIN_MODE, + ( LEP_ATTRIBUTE_T_PTR )gainModePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysGainMode( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_GAIN_MODE_E gainMode ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_GAIN_MODE, + ( LEP_ATTRIBUTE_T_PTR ) & gainMode, + attributeWordLength ); + + return( result ); +} + + +LEP_RESULT LEP_GetSysGainModeObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_GAIN_MODE_OBJ_T_PTR gainModeObjPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 14; + + if( gainModeObjPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_GAIN_MODE_OBJ, + ( LEP_ATTRIBUTE_T_PTR )gainModeObjPtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_SetSysGainModeObj( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_GAIN_MODE_OBJ_T gainModeObj ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 14; + + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_GAIN_MODE_OBJ, + ( LEP_ATTRIBUTE_T_PTR ) & gainModeObj, + attributeWordLength ); + + return( result ); +} + + + +LEP_RESULT LEP_GetSysFFCStates( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_FFC_STATES_E_PTR ffcStatePtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; + + if( ffcStatePtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_FFC_STATE, + ( LEP_ATTRIBUTE_T_PTR )ffcStatePtr, + attributeWordLength ); + + return( result ); +} + +LEP_RESULT LEP_GetSysBoresightValues( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_SYS_BORESIGHT_VALUES_T_PTR boresightValuesPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 6; + + if( boresightValuesPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_SYS_BORESIGHT_VALUES, + ( LEP_ATTRIBUTE_T_PTR )boresightValuesPtr, + attributeWordLength ); + + return( result ); +} + + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + + diff --git a/grabber_lib/Lepton_SDK/src/LEPTON_VID.c b/grabber_lib/Lepton_SDK/src/LEPTON_VID.c new file mode 100755 index 0000000..fa965f3 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/LEPTON_VID.c @@ -0,0 +1,714 @@ +/******************************************************************************* +** +** File NAME: LEPTON_VID.c +** +** AUTHOR: David Dart +** +** CREATED: 5/4/2012 +** +** DESCRIPTION: Lepton SDK Video Module Command Interface +** +** HISTORY: 5/4/2012 DWD - Initial Draft +** +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +*******************************************************************************/ +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ +#include "LEPTON_SDK.h" +#include "LEPTON_VID.h" + +#if (USE_BORESIGHT_MEASUREMENT_FUNCTIONS == 1) +#include "math.h" +#endif + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + +LEP_RESULT LEP_GetVidPolarity(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_POLARITY_E_PTR vidPolarityPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPolarityPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's Video Polarity + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_POLARITY_SELECT, + (LEP_ATTRIBUTE_T_PTR)vidPolarityPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetVidPolarity(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_POLARITY_E vidPolarity) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPolarity >= LEP_VID_END_POLARITY ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's Video Polarity + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_POLARITY_SELECT, + (LEP_ATTRIBUTE_T_PTR)&vidPolarity, + attributeWordLength); + return( result ); +} + + +LEP_RESULT LEP_GetVidPcolorLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PCOLOR_LUT_E_PTR vidPcolorLutPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPcolorLutPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current Video LUT selection + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LUT_SELECT, + (LEP_ATTRIBUTE_T_PTR)vidPcolorLutPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetVidPcolorLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PCOLOR_LUT_E vidPcolorLut) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPcolorLut >= LEP_VID_END_PCOLOR_LUT ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's current Video LUT selection + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LUT_SELECT, + (LEP_ATTRIBUTE_T_PTR)&vidPcolorLut, + attributeWordLength); + return( result ); +} +LEP_RESULT LEP_GetVidLowGainPcolorLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PCOLOR_LUT_E_PTR vidPcolorLutPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPcolorLutPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current Video LUT selection + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LOW_GAIN_COLOR_LUT, + (LEP_ATTRIBUTE_T_PTR)vidPcolorLutPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetVidLowGainPcolorLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_PCOLOR_LUT_E vidPcolorLut) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidPcolorLut >= LEP_VID_END_PCOLOR_LUT ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's current Video LUT selection + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LOW_GAIN_COLOR_LUT, + (LEP_ATTRIBUTE_T_PTR)&vidPcolorLut, + attributeWordLength); + return( result ); +} + +LEP_RESULT LEP_GetVidUserLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_LUT_BUFFER_T_PTR vidUserLutBufPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 512; /* 512 16-bit values for 1024 byte LUT*/ + + /* Validate Parameter(s) + */ + if( vidUserLutBufPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's User Video LUT + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LUT_TRANSFER, + (LEP_ATTRIBUTE_T_PTR)vidUserLutBufPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetVidUserLut(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_LUT_BUFFER_T_PTR vidUserLutBufPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 512; /* 512 16-bit values for 1024 byte LUT*/ + + /* Validate Parameter(s) + */ + if( vidUserLutBufPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Writing the Camera's User Video LUT + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_LUT_TRANSFER, + (LEP_ATTRIBUTE_T_PTR)vidUserLutBufPtr, + attributeWordLength); + return( result ); +} + + +LEP_RESULT LEP_GetVidFocusCalcEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_CALC_ENABLE_E_PTR vidEnableFocusCalcStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidEnableFocusCalcStatePtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's Video Focus Metric calculation enable + ** state + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_CALC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)vidEnableFocusCalcStatePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetVidFocusCalcEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_CALC_ENABLE_E vidFocusCalcEnableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidFocusCalcEnableState >= LEP_VID_END_FOCUS_CALC_ENABLE ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's Video Focus Metric Calculation enable + ** state + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_CALC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)&vidFocusCalcEnableState, + attributeWordLength); + return( result ); +} + +LEP_RESULT LEP_GetVidBoresightCalcEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_BORESIGHT_CALC_ENABLE_STATE_E_PTR boresightCalcEnableStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* Enums are 32-bit */ + + if(boresightCalcEnableStatePtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_BORESIGHT_CALC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)boresightCalcEnableStatePtr, + attributeWordLength ); + + + return(result); +} + +LEP_RESULT LEP_SetVidBoresightCalcEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_BORESIGHT_CALC_ENABLE_STATE_E boresightCalcEnableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* Enums are 32-bit */ + + if(boresightCalcEnableState >= LEP_VID_END_BORESIGHT_CALC_ENABLE_STATE) + { + return(LEP_RANGE_ERROR); + } + + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_BORESIGHT_CALC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)&boresightCalcEnableState, + attributeWordLength); + + return(result); +} +LEP_RESULT LEP_GetVidBoresightCoordinates(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_BORESIGHT_COORDINATES_T_PTR boresightCoordinatesPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 16; + + if( boresightCoordinatesPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_BORESIGHT_COORDINATES, + (LEP_ATTRIBUTE_T_PTR)boresightCoordinatesPtr, + attributeWordLength ); + + return(result); +} + +LEP_RESULT LEP_GetVidTargetPosition(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_TARGET_POSITION_T_PTR targetPositionPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_VID_BORESIGHT_COORDINATES_T boresightCoordinates; + LEP_VID_BORESIGHT_CALC_ENABLE_STATE_E calcEnableState; + + if(targetPositionPtr == NULL) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } +#if (USE_BORESIGHT_MEASUREMENT_FUNCTIONS == 1) + result = LEP_GetVidBoresightCoordinates(portDescPtr, &boresightCoordinates); + if(result == LEP_OK) + { + LEP_CalcVidBoresightAlignment(boresightCoordinates, targetPositionPtr); + } +#else + return(LEP_FUNCTION_NOT_SUPPORTED); +#endif + + return(result); +} + + +LEP_RESULT LEP_GetVidROI(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_ROI_T_PTR vidROIPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* four 16-bit values */ + + /* Validate Parameter(s) + */ + if( vidROIPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's AGC ROI + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_ROI, + (LEP_ATTRIBUTE_T_PTR)vidROIPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetVidROI(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_ROI_T vidROI) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 4; /* four 16-bit values */ + + /* Perform Command + ** Writing the Camera's AGC ROI + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_ROI, + (LEP_ATTRIBUTE_T_PTR)&vidROI, + attributeWordLength); + return( result ); +} + + +LEP_RESULT LEP_GetVidFocusMetric(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_METRIC_T_PTR vidFocusMetricPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values */ + + /* Validate Parameter(s) + */ + if( vidFocusMetricPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current video Focus Metric calculation + ** result + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_METRIC, + (LEP_ATTRIBUTE_T_PTR)vidFocusMetricPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_GetVidFocusMetricThreshold(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_METRIC_THRESHOLD_T_PTR vidFocusMetricThresholdPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values */ + + /* Validate Parameter(s) + */ + if( vidFocusMetricThresholdPtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current video Focus Metric threshold + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_THRESHOLD, + (LEP_ATTRIBUTE_T_PTR)vidFocusMetricThresholdPtr, + attributeWordLength ); + return( result ); +} + +LEP_RESULT LEP_SetVidFocusMetricThreshold(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FOCUS_METRIC_THRESHOLD_T vidFocusMetricThreshold) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit value*/ + + /* Validate Parameter(s) + */ + + /* Perform Command + ** Writing the Camera's current video Focus Metric threshold + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FOCUS_THRESHOLD, + (LEP_ATTRIBUTE_T_PTR)&vidFocusMetricThreshold, + attributeWordLength); + return( result ); +} + + +LEP_RESULT LEP_GetVidSbNucEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_SBNUC_ENABLE_E_PTR vidSbNucEnableStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidSbNucEnableStatePtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current Scene-Based NUC enable state + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_SBNUC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)vidSbNucEnableStatePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetVidSbNucEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_SBNUC_ENABLE_E vidSbNucEnableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidSbNucEnableState >= LEP_VID_END_SBNUC_ENABLE ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's current Scene-Based NUC enable state + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_SBNUC_ENABLE, + (LEP_ATTRIBUTE_T_PTR)&vidSbNucEnableState, + attributeWordLength); + return( result ); +} + + +LEP_RESULT LEP_GetVidFreezeEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FREEZE_ENABLE_E_PTR vidFreezeEnableStatePtr) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidFreezeEnableStatePtr == NULL ) + { + return(LEP_BAD_ARG_POINTER_ERROR); + } + + /* Perform Command + ** Reading the Camera's current video freeze enable state + */ + result = LEP_GetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FREEZE_ENABLE, + (LEP_ATTRIBUTE_T_PTR)vidFreezeEnableStatePtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetVidFreezeEnableState(LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_FREEZE_ENABLE_E vidFreezeEnableState) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidFreezeEnableState >= LEP_VID_END_FREEZE_ENABLE ) + { + return(LEP_RANGE_ERROR); + } + + /* Perform Command + ** Writing the Camera's current video freeze enable state + */ + result = LEP_SetAttribute( portDescPtr, + (LEP_COMMAND_ID)LEP_CID_VID_FREEZE_ENABLE, + (LEP_ATTRIBUTE_T_PTR)&vidFreezeEnableState, + attributeWordLength); + return( result ); +} + +LEP_RESULT LEP_GetVidVideoOutputFormat( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_VIDEO_OUTPUT_FORMAT_E_PTR vidVideoOutputFormatPtr ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidVideoOutputFormatPtr == NULL ) + { + return( LEP_BAD_ARG_POINTER_ERROR ); + } + + /* Perform Command + ** Reading the Camera's current video output format + */ + result = LEP_GetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_VID_VIDEO_OUTPUT_FORMAT, + ( LEP_ATTRIBUTE_T_PTR )vidVideoOutputFormatPtr, + attributeWordLength ); + return( result ); +} + + +LEP_RESULT LEP_SetVidVideoOutputFormat( LEP_CAMERA_PORT_DESC_T_PTR portDescPtr, + LEP_VID_VIDEO_OUTPUT_FORMAT_E vidVideoOutputFormat ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 attributeWordLength = 2; /* two 16-bit values for 32-bit enum */ + + /* Validate Parameter(s) + */ + if( vidVideoOutputFormat >= LEP_END_VID_VIDEO_OUTPUT_FORMAT ) + { + return( LEP_RANGE_ERROR ); + } + + /* Perform Command + ** Writing the Camera's current video output format + */ + result = LEP_SetAttribute( portDescPtr, + ( LEP_COMMAND_ID )LEP_CID_VID_VIDEO_OUTPUT_FORMAT, + ( LEP_ATTRIBUTE_T_PTR ) & vidVideoOutputFormat, + attributeWordLength ); + return( result ); +} + + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + +#if (USE_BORESIGHT_MEASUREMENT_FUNCTIONS == 1) + +LEP_RESULT LEP_CalcVidBoresightAlignment(LEP_VID_BORESIGHT_COORDINATES_T boresightCoordinates, LEP_VID_TARGET_POSITION_T_PTR targetPositionPtr) +{ + LEP_RESULT result = LEP_OK; + LEP_FLOAT32 top, bot, left, right, rows, cols; + + top = (boresightCoordinates.top_0.col + boresightCoordinates.top_1.col) / 2.0; + bot = (boresightCoordinates.bottom_0.col + boresightCoordinates.bottom_1.col) / 2.0; + left = (boresightCoordinates.left_0.row + boresightCoordinates.left_1.row) / 2.0; + right = (boresightCoordinates.right_0.row + boresightCoordinates.right_1.row) / 2.0; + + rows = boresightCoordinates.bottom_1.row - boresightCoordinates.top_0.row + 1.0; + cols = boresightCoordinates.right_1.col - boresightCoordinates.left_0.col + 1.0; + + /* Both lines are perfect horizontal/vertical */ + if((left == right) && (top == bot)) + { + targetPositionPtr->col = top; + targetPositionPtr->row = left; + targetPositionPtr->rotation = 0.0; + } + /* Line 1 is perfect horizontal and Line 2 has slope */ + else if ((left == right) && (top != bot)) + { + targetPositionPtr->row = left; + targetPositionPtr->col = (LEP_FLOAT32)(bot + ((top - bot) / rows) * left); + targetPositionPtr->rotation = (LEP_FLOAT32)((57.2957802 * atan((top - bot) / rows)) / 2.0); + } + /* Line 1 has slope and Line 2 is perfect vertical */ + else if ((left != right) && (top == bot)) + { + targetPositionPtr->col = top; + targetPositionPtr->row = (LEP_FLOAT32)(right + (right - left) / cols * top / cols); + targetPositionPtr->rotation = (LEP_FLOAT32)((57.2957802 * atan((right - left) / cols)) / 2.0); + } + /* Both lines have slope */ + else + { + targetPositionPtr->col = (LEP_FLOAT32)(((rows - rows * top / (top - bot)) - left) / ((right - left) / cols - rows / (top - bot))); + targetPositionPtr->row = (LEP_FLOAT32)(left + targetPositionPtr->col * (right - left) / cols); + targetPositionPtr->rotation = (LEP_FLOAT32)((57.2957802 * (atan((right - left) / cols) + atan((top - bot) / rows))) / 2.0); + } + + return(result); +} +#endif diff --git a/grabber_lib/Lepton_SDK/src/bbb_I2C.c b/grabber_lib/Lepton_SDK/src/bbb_I2C.c new file mode 100644 index 0000000..d3ad26c --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/bbb_I2C.c @@ -0,0 +1,360 @@ +/******************************************************************************* +** +** File NAME: jova_I2C.c +** +** AUTHOR: Hart Thomson +** +** CREATED: 9/25/2012 +** +** DESCRIPTION: Lepton Device-Specific Driver for the JOVA +** Master I2C +** +** HISTORY: 9/25/2012 HT - Initial Draft +** +** Copyright 2010, 2011, 2012, 2013 FLIR Systems - Commercial Vision Systems +** +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** Redistributions of source code must retain the above copyright notice, this +** list of conditions and the following disclaimer. +** +** Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** +** Neither the name of the Indigo Systems Corporation nor the names of its +** contributors may be used to endorse or promote products derived from this +** software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +*******************************************************************************/ +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ + +#include "LEPTON_Types.h" +#include "LEPTON_ErrorCodes.h" +#include "LEPTON_MACROS.h" +#include "bbb_I2C.h" +#include "LEPTON_I2C_Reg.h" +#include +#include + +#include +#include +#include + +//#define _AVR_STK600_ATXMEGA128A1_BOARD + +//#ifdef _AVR_STK600_ATXMEGA128A1_BOARD +// #include "twiDriver.h" +//#endif + + +/******************************************************************************/ +/** LOCAL DEFINES **/ +/******************************************************************************/ +//Raspi handle; +int leptonDevice; +const LEP_INT32 ADDRESS_SIZE_BYTES = 2; +const LEP_INT32 VALUE_SIZE_BYTES = 2; +float clk_rate; +const LEP_INT32 comm_timeout_ms = 500; + +/******************************************************************************/ +/** LOCAL TYPE DEFINITIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE DATA DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** PRIVATE FUNCTION DECLARATIONS **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC DATA **/ +/******************************************************************************/ + +/******************************************************************************/ +/** EXPORTED PUBLIC FUNCTIONS **/ +/******************************************************************************/ + + +/******************************************************************************/ +/** + * Performs I2C Master Initialization + * + * @param portID LEP_UINT16 User specified port ID tag. Can be used to + * select between multiple cameras + * + * @param BaudRate Clock speed in kHz. Typically this is 400. + * The Device Specific Driver will try to match the desired + * speed. This parameter is updated to the actual speed the + * driver can use. + * + * @return LEP_RESULT 0 if all goes well, errno otherwise + */ +LEP_RESULT DEV_I2C_MasterInit(LEP_UINT16 portID, + LEP_UINT16 *BaudRate) +{ + LEP_RESULT result = LEP_OK; + int bbb_result; + LEP_UINT16 numFreeDevices[5]; + LEP_UINT8 testwrite[12]; + + /* Place Device-Specific Interface here + */ + + //NONE: here we do a bbb_close(0) through 4 + //aa_close(0); aa_close(1); aa_close(2); aa_close(3); aa_close(4); + + + //NONE: here we do a bbb_find_devices(5, numFreeDevices); + //bbb_result = aa_find_devices(5, numFreeDevices); + //handle = aa_open(0); + //aa_i2c_bitrate(handle, 400); + //aa_target_power(handle, AA_TARGET_POWER_BOTH); + + //do it live! + leptonDevice = open("/dev/i2c-1", O_RDWR); + if(leptonDevice < 0) { + //we have problem connecting + result = LEP_ERROR; + } else if(ioctl(leptonDevice, I2C_SLAVE, LEP_I2C_DEVICE_ADDRESS) < 0) { + result = LEP_ERROR; + } + + return(result); +} + +/** + * Closes the I2C driver connection. + * + * @return LEP_RESULT 0 if all goes well, errno otherwise. + */ +LEP_RESULT DEV_I2C_MasterClose() +{ + LEP_RESULT result = LEP_OK; + + /* Place Device-Specific Interface here + */ + LEP_UINT32 handle = 1; + //int return_value = ISLDLL_close(handle); + + return(result); +} + +/** + * Resets the I2C driver back to the READY state. + * + * @return LEP_RESULT 0 if all goes well, errno otherwise. + */ +LEP_RESULT DEV_I2C_MasterReset(void ) +{ + LEP_RESULT result = LEP_OK; + + /* Place Device-Specific Interface here + */ + + + return(result); +} + +LEP_RESULT DEV_I2C_MasterReadData(LEP_UINT16 portID, // User-defined port ID + LEP_UINT8 deviceAddress, // Lepton Camera I2C Device Address + LEP_UINT16 regAddress, // Lepton Register Address + LEP_UINT16 *readDataPtr, // Read DATA buffer pointer + LEP_UINT16 wordsToRead, // Number of 16-bit words to Read + LEP_UINT16 *numWordsRead, // Number of 16-bit words actually Read + LEP_UINT16 *status // Transaction Status + ) +{ + LEP_RESULT result = LEP_OK; + + /* Place Device-Specific Interface here + */ + int bbb_result; + LEP_UINT16 bytesToWrite = ADDRESS_SIZE_BYTES; + LEP_UINT16 bytesToRead = wordsToRead << 1; + LEP_UINT16 bytesActuallyWritten = 0; + LEP_UINT16 bytesActuallyRead = 0; + LEP_UINT16 wordsActuallyRead = 0; + LEP_UINT8* txdata = (LEP_UINT8*)malloc(sizeof(LEP_UINT8)*ADDRESS_SIZE_BYTES); + LEP_UINT8* rxdata = (LEP_UINT8*)malloc(sizeof(LEP_UINT8)*bytesToRead); + LEP_UINT16 *dataPtr; + LEP_UINT16 *writePtr; + + *(LEP_UINT16*)txdata = REVERSE_ENDIENESS_UINT16(regAddress); + + //bbb_result = aa_i2c_write_read(handle, deviceAddress, AA_I2C_NO_FLAGS, + // bytesToWrite, txdata, &bytesActuallyWritten, //write params + // bytesToRead, rxdata, &bytesActuallyRead); //read params + + //DONE: here we do a bbb bbb_i2c_write_read + //this means writing the register, then reading bytes! + + + int writeValue = write(leptonDevice, txdata, bytesToWrite); + if(writeValue < 0) { + //we have error! + bytesActuallyRead = 0; + bbb_result = -1; + } else { + + int readValue = read(leptonDevice, rxdata, bytesToRead); + + if(readValue < 0) { + bytesActuallyRead = 0; + bbb_result = -1; + } else { + bytesActuallyRead = readValue; + bbb_result = LEP_OK; + } + } + + wordsActuallyRead = (LEP_UINT16)(bytesActuallyRead >> 1); + *numWordsRead = wordsActuallyRead; + + dataPtr = (LEP_UINT16*)&rxdata[0]; + writePtr = readDataPtr; + while(wordsActuallyRead--){ + *writePtr++ = REVERSE_ENDIENESS_UINT16(*dataPtr); + dataPtr++; + } + free(txdata); + free(rxdata); + + LEP_UINT8* byteData = (LEP_UINT8*)readDataPtr; + + + if(bbb_result != 0 || bytesActuallyRead != bytesToRead) + { + result = LEP_ERROR_I2C_FAIL; + } + else + { + result = (LEP_RESULT)bbb_result; + } + return(result); +} + +LEP_RESULT DEV_I2C_MasterWriteData(LEP_UINT16 portID, // User-defined port ID + LEP_UINT8 deviceAddress, // Lepton Camera I2C Device Address + LEP_UINT16 regAddress, // Lepton Register Address + LEP_UINT16 *writeDataPtr, // Write DATA buffer pointer + LEP_UINT16 wordsToWrite, // Number of 16-bit words to Write + LEP_UINT16 *numWordsWritten, // Number of 16-bit words actually written + LEP_UINT16 *status) // Transaction Status +{ + LEP_RESULT result = LEP_OK; + + int bbb_result; + + LEP_INT16 bytesOfDataToWrite = (wordsToWrite << 1); + LEP_INT16 bytesToWrite = bytesOfDataToWrite + ADDRESS_SIZE_BYTES; + LEP_INT16 bytesActuallyWritten = 0; + LEP_UINT8* txdata = (LEP_UINT8*)malloc(sizeof(LEP_UINT8)*(int)bytesToWrite); + LEP_UINT16 *dataPtr; + LEP_UINT16 *txPtr; + + *(LEP_UINT16*)txdata = REVERSE_ENDIENESS_UINT16(regAddress); + dataPtr = (LEP_UINT16*)&writeDataPtr[0]; + txPtr = (LEP_UINT16*)&txdata[ADDRESS_SIZE_BYTES]; //Don't overwrite the address bytes + while(wordsToWrite--){ + *txPtr++ = (LEP_UINT16)REVERSE_ENDIENESS_UINT16(*dataPtr); + dataPtr++; + } + + //bbb_result = aa_i2c_write(handle, device_addr, AA_I2C_NO_FLAGS, bytesToWrite, (LEP_UINT8*)writeDataPtr); + + //DONE: here we do bbb_i2c_write_ext + //bbb_result = aa_i2c_write_ext(handle, deviceAddress, AA_I2C_NO_FLAGS, bytesToWrite, (LEP_UINT8*)txdata, (u16*)&bytesActuallyWritten); + + + bytesActuallyWritten = write(leptonDevice, (LEP_UINT8*)txdata, bytesToWrite); + + if(bytesActuallyWritten < 0) { + //if it's -1, we had error, no bytes written or something. just lie and say no bytes written + bytesActuallyWritten = 0; + bbb_result = LEP_ERROR; + } else { + bbb_result = LEP_OK; + } + + *numWordsWritten = (bytesActuallyWritten >> 1); + + result = (LEP_RESULT)bbb_result; + free(txdata); + + if(bbb_result != 0 || bytesActuallyWritten != bytesToWrite) + { + result = LEP_ERROR; + } + return(result); +} + +LEP_RESULT DEV_I2C_MasterReadRegister( LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 regAddress, + LEP_UINT16 *regValue, // Number of 16-bit words actually written + LEP_UINT16 *status + ) +{ + LEP_RESULT result = LEP_OK; + + LEP_UINT16 wordsActuallyRead; + /* Place Device-Specific Interface here + */ + result = DEV_I2C_MasterReadData(portID, deviceAddress, regAddress, regValue, 1 /*1 word*/, &wordsActuallyRead, status); + + return(result); +} + +LEP_RESULT DEV_I2C_MasterWriteRegister( LEP_UINT16 portID, + LEP_UINT8 deviceAddress, + LEP_UINT16 regAddress, + LEP_UINT16 regValue, // Number of 16-bit words actually written + LEP_UINT16 *status + ) +{ + LEP_RESULT result = LEP_OK; + LEP_UINT16 wordsActuallyWritten; + /* Place Device-Specific Interface here + */ + result = DEV_I2C_MasterWriteData(portID, deviceAddress, regAddress, ®Value, 1, &wordsActuallyWritten, status); + + return(result); +} +LEP_RESULT DEV_I2C_MasterStatus(void ) +{ + LEP_RESULT result = LEP_OK; + + /* Place Device-Specific Interface here + */ + + + return(result); +} + + +/******************************************************************************/ +/** PRIVATE MODULE FUNCTIONS **/ +/******************************************************************************/ + + diff --git a/grabber_lib/Lepton_SDK/src/crc16fast.c b/grabber_lib/Lepton_SDK/src/crc16fast.c new file mode 100755 index 0000000..b6c3f70 --- /dev/null +++ b/grabber_lib/Lepton_SDK/src/crc16fast.c @@ -0,0 +1,144 @@ +/**************************************************************************** + + Filename: crc16fast.c + Description: Cyclic Redundancy Check 16 functions + Created: 24-Feb-1999 + +** Copyright 2011,2012,2013,2014 FLIR Systems - Commercial +** Vision Systems. All rights reserved. +** +** Proprietary - PROPRIETARY - FLIR Systems Inc.. +** +** This document is controlled to FLIR Technology Level 2. +** The information contained in this document pertains to a +** dual use product Controlled for export by the Export +** Administration Regulations (EAR). Diversion contrary to +** US law is prohibited. US Department of Commerce +** authorization is not required prior to export or +** transfer to foreign persons or parties unless otherwise +** prohibited. +** +** Redistribution and use in source and binary forms, with +** or without modification, are permitted provided that the +** following conditions are met: +** +** Redistributions of source code must retain the above +** copyright notice, this list of conditions and the +** following disclaimer. +** +** Redistributions in binary form must reproduce the above +** copyright notice, this list of conditions and the +** following disclaimer in the documentation and/or other +** materials provided with the distribution. +** +** Neither the name of the FLIR Systems Corporation nor the +** names of its contributors may be used to endorse or +** promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +** CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +** PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +** COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +** DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +** OF SUCH DAMAGE. +** +****************************************************************************/ + +#include "crc16.h" + +const CRC16 ccitt_16Table[] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; + +/* + * ===== ByteCRC16 ===== + * Calculate (update) the CRC16 for a single 8-bit byte + */ +int ByteCRC16(int value, int crcin) +{ + return (unsigned short)((crcin << 8) ^ ccitt_16Table[((crcin >> 8) ^ (value)) & 255]); +} + +/* + * ===== CalcCRC16Words ===== + * Calculate the CRC for a buffer of 16-bit words. Supports both + * Little and Big Endian formats using conditional compilation. + * Note: minimum count is 1 (0 case not handled) + */ +CRC16 CalcCRC16Words(unsigned int count, short *buffer) { + + int crc = 0; + + do { + + int value = *buffer++; +#ifdef _BIG_ENDIAN + crc = ByteCRC16(value >> 8, crc); + crc = ByteCRC16(value, crc); +#else + crc = ByteCRC16(value, crc); + crc = ByteCRC16(value >> 8, crc); +#endif + } + while (--count); + return (CRC16) crc; +} + +/* + * ===== CalcCRC16Bytes ===== + * Calculate the CRC for a buffer of 8-bit words. + * Note: minimum count is 1 (0 case not handled) + */ +CRC16 CalcCRC16Bytes(unsigned int count, char *buffer) { + + int crc = 0; + + do { + + int value = *buffer++; + crc = ByteCRC16(value, crc); + } + while (--count); + return crc; +} diff --git a/grabber_lib/Makefile b/grabber_lib/Makefile new file mode 100644 index 0000000..739f2c9 --- /dev/null +++ b/grabber_lib/Makefile @@ -0,0 +1,210 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(CMAKE_COMMAND) -E cmake_progress_start /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/CMakeFiles /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib/CMakeFiles/progress.marks + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f CMakeFiles/Makefile2 grabber_lib/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f CMakeFiles/Makefile2 grabber_lib/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f CMakeFiles/Makefile2 grabber_lib/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f CMakeFiles/Makefile2 grabber_lib/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +grabber_lib/CMakeFiles/lepton3_grabber.dir/rule: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f CMakeFiles/Makefile2 grabber_lib/CMakeFiles/lepton3_grabber.dir/rule +.PHONY : grabber_lib/CMakeFiles/lepton3_grabber.dir/rule + +# Convenience name for target. +lepton3_grabber: grabber_lib/CMakeFiles/lepton3_grabber.dir/rule + +.PHONY : lepton3_grabber + +# fast build rule for target. +lepton3_grabber/fast: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/build +.PHONY : lepton3_grabber/fast + +src/Lepton3.o: src/Lepton3.cpp.o + +.PHONY : src/Lepton3.o + +# target to build an object file +src/Lepton3.cpp.o: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.o +.PHONY : src/Lepton3.cpp.o + +src/Lepton3.i: src/Lepton3.cpp.i + +.PHONY : src/Lepton3.i + +# target to preprocess a source file +src/Lepton3.cpp.i: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.i +.PHONY : src/Lepton3.cpp.i + +src/Lepton3.s: src/Lepton3.cpp.s + +.PHONY : src/Lepton3.s + +# target to generate assembly for a file +src/Lepton3.cpp.s: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/Lepton3.cpp.s +.PHONY : src/Lepton3.cpp.s + +src/stopwatch.o: src/stopwatch.cpp.o + +.PHONY : src/stopwatch.o + +# target to build an object file +src/stopwatch.cpp.o: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.o +.PHONY : src/stopwatch.cpp.o + +src/stopwatch.i: src/stopwatch.cpp.i + +.PHONY : src/stopwatch.i + +# target to preprocess a source file +src/stopwatch.cpp.i: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.i +.PHONY : src/stopwatch.cpp.i + +src/stopwatch.s: src/stopwatch.cpp.s + +.PHONY : src/stopwatch.s + +# target to generate assembly for a file +src/stopwatch.cpp.s: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(MAKE) -f grabber_lib/CMakeFiles/lepton3_grabber.dir/build.make grabber_lib/CMakeFiles/lepton3_grabber.dir/src/stopwatch.cpp.s +.PHONY : src/stopwatch.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... lepton3_grabber" + @echo "... src/Lepton3.o" + @echo "... src/Lepton3.i" + @echo "... src/Lepton3.s" + @echo "... src/stopwatch.o" + @echo "... src/stopwatch.i" + @echo "... src/stopwatch.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/grabber_lib/cmake_install.cmake b/grabber_lib/cmake_install.cmake new file mode 100644 index 0000000..d68bbc7 --- /dev/null +++ b/grabber_lib/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/debian/devel/BeagleBoneBlue_Lepton3/Lepton3_BBB/grabber_lib + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() +