From c92207b72cb889ef98128aa71062db41e4ea1a2c Mon Sep 17 00:00:00 2001 From: sayezz Date: Fri, 11 Feb 2022 15:12:59 +0100 Subject: [PATCH] WMF update - Removed precompiled headers - Using newer Windwos SDK - Introduced FLIRLepton Types - Added FLIR Uptime - Added FLIR Cam Status - Added multi camera usage --- mediafoundation/PureThermal/Device.cpp | 110 +++++-- mediafoundation/PureThermal/Device.h | 47 ++- mediafoundation/PureThermal/LEPTON_Types.h | 286 ++++++++++++++++++ mediafoundation/PureThermal/PureThermal.cpp | 12 +- .../PureThermal/PureThermal.vcxproj | 28 +- .../PureThermal/PureThermal.vcxproj.filters | 7 +- .../PureThermal/image_160x120_Y16.dat | Bin 0 -> 38400 bytes mediafoundation/PureThermal/pch.cpp | 1 - mediafoundation/PureThermal/pch.h | 32 -- 9 files changed, 442 insertions(+), 81 deletions(-) create mode 100644 mediafoundation/PureThermal/LEPTON_Types.h create mode 100644 mediafoundation/PureThermal/image_160x120_Y16.dat delete mode 100644 mediafoundation/PureThermal/pch.cpp delete mode 100644 mediafoundation/PureThermal/pch.h diff --git a/mediafoundation/PureThermal/Device.cpp b/mediafoundation/PureThermal/Device.cpp index 1c2784b..0fdddb0 100644 --- a/mediafoundation/PureThermal/Device.cpp +++ b/mediafoundation/PureThermal/Device.cpp @@ -1,7 +1,5 @@ -#include "pch.h" #include "Device.h" - template void SafeRelease(T** object) { @@ -14,6 +12,9 @@ void SafeRelease(T** object) Device::Device() + : flir_status(new LEP_STATUS_T) + , _selectedDeviceID("N/A") + , flir_uptime_ms(0) { if (!SelectDevice()) { @@ -48,14 +49,30 @@ Device::~Device() } +/* + Check the FLIR LEPTON® Software Interface Description Document (IDD) for more information: + https://cdn.sparkfun.com/assets/0/6/d/2/e/16465-FLIRLepton-SoftwareIDD.pdf +*/ void Device::PrintDeviceInfo() { + // Version LepOemSwVersion version{}; - char flir_pn[32]; - char flir_sn[8]; SetGetExtensionUnit(_xuLepOem, 9, KSPROPERTY_TYPE_GET, &version, sizeof(version)); - SetGetExtensionUnit(_xuLepOem, 8, KSPROPERTY_TYPE_GET, flir_pn, sizeof(flir_pn)); - SetGetExtensionUnit(_xuLepSys, 3, KSPROPERTY_TYPE_GET, flir_sn, sizeof(flir_sn)); + + // Part Number + LEP_OEM_PART_NUMBER_T_PTR flir_pn = new LEP_OEM_PART_NUMBER_T;// aka char flir_pn[32]; + SetGetExtensionUnit(_xuLepOem, 8, KSPROPERTY_TYPE_GET, flir_pn, sizeof(flir_pn->value)); + + // Serial Number + LEP_UINT64 flir_sn; // aka char flir_sn[8]; + SetGetExtensionUnit(_xuLepSys, 3, KSPROPERTY_TYPE_GET, &flir_sn, sizeof(flir_sn)); + //since we have a 64 bit value we need to check every byte for it self + char flir_sn_char[8]; + memcpy(flir_sn_char, &flir_sn, 8); + + //Uptime + SetGetExtensionUnit(_xuLepSys, 4, KSPROPERTY_TYPE_GET, &flir_uptime_ms, sizeof(flir_uptime_ms)); + std::cout << "Version gpp: " << static_cast(version.gpp_major) << "." @@ -65,17 +82,20 @@ void Device::PrintDeviceInfo() << static_cast(version.dsp_major) << "." << static_cast(version.dsp_minor) << "." << static_cast(version.dsp_build) << "\n" - << "FLIR part#: " << flir_pn << "\n" + << "FLIR part#: " << std::string(flir_pn->value) << "\n" << "FLIR serial#: "; - for (size_t i = 0; i < sizeof(flir_sn); ++i) + for (size_t i = 0; i < sizeof(flir_sn_char); ++i) { if (i != 0) { std::cout << "-"; } - std::cout << static_cast(flir_sn[i]); + std::cout << static_cast(flir_sn_char[i]); } - std::cout << "\n"; + + std::cout << "\nFLIR uptime: " << flir_uptime_ms * 0.001 << " seconds" << std::endl; + + std::cout << "\nCam status: " << GetFLIRStatus() << std::endl; } @@ -161,25 +181,39 @@ bool Device::SelectDevice() hr = MFEnumDeviceSources(pVideoConfig, &_availableVideoDevices, &_numberOfAvailableVideoDevices); CheckResult(hr, "Device enumeration"); - for (UINT32 i = 0; i < _numberOfAvailableVideoDevices; ++i) - { - UINT32 cchName; - WCHAR* szDevicePath; - hr = _availableVideoDevices[i]->GetAllocatedString( - MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, - &szDevicePath, &cchName); - auto sDevicePath = WCharToString(szDevicePath); - CoTaskMemFree(szDevicePath); - CheckResult(hr, "Get video device path"); - if (sDevicePath.find("vid_1e4e&pid_0100") != std::string::npos) + if (_numberOfAvailableVideoDevices > 0) { + for (UINT32 i = 0; i < _numberOfAvailableVideoDevices; ++i) { - _selectedDeviceIndex = i; - break; + UINT32 cchName; + WCHAR* szDevicePath; + hr = _availableVideoDevices[i]->GetAllocatedString( + MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, + &szDevicePath, &cchName); + auto sDevicePath = WCharToString(szDevicePath); + CoTaskMemFree(szDevicePath); + CheckResult(hr, "Get video device path"); + std::istringstream f(sDevicePath); + std::vector deviceIds; + std::string id; + while (std::getline(f, id, '&')) { + deviceIds.push_back(id); + } + + if (sDevicePath.find("vid_1e4e&pid_0100") != std::string::npos) + { + std::cout << "ID for device " << i << ": " + deviceIds[3] << std::endl; + + _selectedDeviceIndex = i; + _selectedDeviceID = deviceIds[3]; + } } + }else{ + return false; } if (_selectedDeviceIndex != (std::numeric_limits::max)()) { + std::cout << std::endl << "Using PureThermal device with index " << _selectedDeviceIndex << " and ID: "<< _selectedDeviceID << std::endl << std::endl; return true; } else @@ -515,3 +549,33 @@ HRESULT Device::OnReadSample(HRESULT status, DWORD streamIndex, DWORD streamFlag return hr; } + +std::string Device::GetFLIRStatus() { + + SetGetExtensionUnit(_xuLepSys, 2, KSPROPERTY_TYPE_GET, flir_status, sizeof(flir_status)); + std::string status = "N/A"; + switch (flir_status->camStatus) { + case LEP_SYSTEM_READY: + status = "Ready"; + break; + case LEP_SYSTEM_INITIALIZING: + status = "Initializing"; + break; + case LEP_SYSTEM_IN_LOW_POWER_MODE: + status = "In low power mode"; + break; + case LEP_SYSTEM_GOING_INTO_STANDBY: + status = "Going into standby"; + break; + case LEP_SYSTEM_FLAT_FIELD_IN_PROCESS: + status = "Flat field in process"; + break; + case LEP_SYSTEM_END_STATES: + status = "End states"; + break; + default: + status = "N/A"; + } + + return status; +} diff --git a/mediafoundation/PureThermal/Device.h b/mediafoundation/PureThermal/Device.h index b2144b6..397f65e 100644 --- a/mediafoundation/PureThermal/Device.h +++ b/mediafoundation/PureThermal/Device.h @@ -1,6 +1,34 @@ #pragma once -#include "pch.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "LEPTON_Types.h" class Device : public IMFSourceReaderCallback @@ -34,6 +62,19 @@ class Device : public IMFSourceReaderCallback STDMETHODIMP OnEvent(DWORD, IMFMediaEvent *); STDMETHODIMP OnFlush(DWORD); + /* + Returns the camera status as a string. Status is based on FLIR LEP_SYSTEM_STATUS_STATES_E_TAG and can be: + + LEP_SYSTEM_READY -> Ready + LEP_SYSTEM_INITIALIZING -> Initializing + LEP_SYSTEM_IN_LOW_POWER_MODE -> In low power mode + LEP_SYSTEM_GOING_INTO_STANDBY -> Going into standby + LEP_SYSTEM_FLAT_FIELD_IN_PROCESS -> Flat field in process + + Default is "N/A" + */ + std::string GetFLIRStatus(); + private: using XuGuid = std::array; using FourCC = std::array; @@ -68,6 +109,7 @@ class Device : public IMFSourceReaderCallback IMFActivate** _availableVideoDevices{ nullptr }; UINT32 _numberOfAvailableVideoDevices{ 0 }; UINT32 _selectedDeviceIndex{ (std::numeric_limits::max)() }; + std::string _selectedDeviceID; CComPtr _presentationDescriptor{ nullptr }; CComPtr _streamDescriptor{ nullptr }; @@ -83,4 +125,7 @@ class Device : public IMFSourceReaderCallback std::mutex _deviceMutex; std::condition_variable _deviceCondition; std::atomic _frameRequested{ false }; + + LEP_STATUS_T_PTR flir_status; + LEP_UINT32 flir_uptime_ms; //in Milliseconds }; diff --git a/mediafoundation/PureThermal/LEPTON_Types.h b/mediafoundation/PureThermal/LEPTON_Types.h new file mode 100644 index 0000000..8127f26 --- /dev/null +++ b/mediafoundation/PureThermal/LEPTON_Types.h @@ -0,0 +1,286 @@ +#pragma once +/******************************************************************************* +** +** File NAME: LEPTON_Types.h +** +** AUTHOR: pwolf +** +** CREATED: 2/01/2011 +** +** DESCRIPTION: typedefs for coding style/conventions +** +** HISTORY: 2/01/2012 PW - 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. +** +*******************************************************************************/ +#ifndef _LEPTON_TYPES_H_ +#define _LEPTON_TYPES_H_ + + + + +/******************************************************************************/ +/** INCLUDE FILES **/ +/******************************************************************************/ + +#if defined(_WIN32) || defined (_WIN64) +#include +#define WINDOWSS 1; +#else +#include +#include +#endif + +/******************************************************************************/ +/** EXPORTED DEFINES **/ +/******************************************************************************/ +#define LEP_FAILURE -1 +#define LEP_SUCCESS 0 +#define LEP_TRUE 1 +#define LEP_FALSE 0 +#define LEP_NULL 0 + +/******************************************************************************/ +/** EXPORTED TYPE DEFINITIONS **/ +/******************************************************************************/ + +#ifdef _STDINT_H +typedef uint8_t LEP_UINT8; +typedef uint8_t LEP_UCHAR; +typedef int8_t LEP_INT8; +typedef char LEP_CHAR8; + +typedef uint16_t LEP_UINT16; +typedef uint16_t LEP_USHORT; +typedef int16_t LEP_INT16; +typedef short LEP_SHORT; + +typedef uint32_t LEP_UINT32; +typedef uint32_t LEP_UINT; +typedef int32_t LEP_INT32; +typedef int LEP_INT; + +typedef uint64_t LEP_UINT64; +typedef uint64_t LEP_ULONG64; +typedef uint32_t LEP_ULONG32; +typedef uint32_t LEP_ULONG; +typedef int64_t LEP_LONG32; +typedef long LEP_LONG; + +typedef float LEP_FLOAT32; +typedef double LEP_FLOAT64; +#else +typedef unsigned char LEP_UINT8; +typedef unsigned char LEP_UCHAR; +typedef signed char LEP_INT8; +typedef char LEP_CHAR8; + +typedef unsigned short LEP_UINT16; +typedef unsigned short LEP_USHORT; +typedef signed short LEP_INT16; +typedef short LEP_SHORT; + +typedef unsigned int LEP_UINT32; +typedef unsigned int LEP_UINT; +typedef signed int LEP_INT32; +typedef int LEP_INT; + +typedef unsigned long long LEP_UINT64; +typedef unsigned long long LEP_ULONG64; +typedef unsigned long LEP_ULONG32; +typedef unsigned long LEP_ULONG; +typedef signed long LEP_LONG32; +typedef long LEP_LONG; + +typedef float LEP_FLOAT32; +typedef double LEP_FLOAT64; +#endif + + +#ifdef _STDBOOL_H +typedef bool LEP_BOOL, *LEP_BOOL_PTR; +#else +typedef unsigned char LEP_BOOL, *LEP_BOOL_PTR; +#endif + +/* NULL +*/ +#ifndef NULL +#define NULL '\0' +#endif + + +typedef LEP_UINT16 LEP_COMMAND_ID; +typedef LEP_UINT16 LEP_ATTRIBUTE_T, *LEP_ATTRIBUTE_T_PTR; + +#define LEP_GET_TYPE 0x0000 +#define LEP_SET_TYPE 0x0001 +#define LEP_RUN_TYPE 0x0002 + +#define LEP_OEM_MAX_PART_NUMBER_CHAR_SIZE 32 + +typedef enum +{ + LEP_LSB_FIRST = 0, + LEP_MSB_FIRST + +}LEP_BYTE_ORDER_T, *LEP_BYTE_ORDER_T_PTR; + +typedef enum +{ + LEP_READY = 0, + LEP_BUSY, + LEP_WAITING + +}LEP_OPERATION_STATE; + +typedef enum +{ + LEP_DISABLED = 0, + LEP_ENABLED + +}LEP_ENABLE_STATE; + +typedef enum +{ + LEP_OFF = 0, + LEP_ON + +}LEP_ON_STATE; + + +/* Lepton physical tranport interfaces +*/ +typedef enum LEP_CAMERA_PORT_E_TAG +{ + LEP_CCI_TWI = 0, + LEP_CCI_SPI, + LEP_END_CCI_PORTS +}LEP_CAMERA_PORT_E, *LEP_CAMERA_PORT_E_PTR; + +/* Device entries +*/ +typedef enum LEP_PROTOCOL_DEVICE_E_TAG +{ + /* I2C Devices */ + AARDVARK_I2C = 0, + DEV_BOARD_FTDI_V2, + //C232HM_DDHSL_0, + TCP_IP, + + /* SPI Devices */ + + LEP_END_PROTOCOL_DEVICE, +} LEP_PROTOCOL_DEVICE_E, *LEP_PROTOCOL_DEVICE_E_PTR; + +/* Lepton supported TWI clock rates +*/ +typedef enum LEP_TWI_CLOCK_RATE_T_TAG +{ + LEP_TWI_CLOCK_100KHZ = 0, + LEP_TWI_CLOCK_400KHZ, + LEP_TWI_CLOCK_1MHZ, + LEP_END_TWI_CLOCK_RATE + +}LEP_TWI_CLOCK_RATE_T, *LEP_TWI_CLOCK_RATE_T_PTR; + +/* Lepton supported SPI clock rates +*/ +typedef enum LEP_SPI_CLOCK_RATE_T_TAG +{ + LEP_SPI_CLOCK_2MHZ = 0, + LEP_SPI_CLOCK_10MHZ, + LEP_SPI_CLOCK_20MHZ, + LEP_END_SPI_CLOCK_RATE + +}LEP_SPI_CLOCK_RATE_T, *LEP_SPI_CLOCK_RATE_T_PTR; + +/* Communications Port Descriptor Type +*/ +typedef struct LEP_CAMERA_PORT_DESC_T_TAG +{ + LEP_UINT16 portID; + LEP_CAMERA_PORT_E portType; + LEP_UINT16 portBaudRate; + LEP_UINT8 deviceAddress; +}LEP_CAMERA_PORT_DESC_T, *LEP_CAMERA_PORT_DESC_T_PTR; + +/* SYS Camera System Status Enum + Captures basic camera operation +*/ +typedef enum LEP_SYSTEM_STATUS_STATES_E_TAG +{ + LEP_SYSTEM_READY = 0, + LEP_SYSTEM_INITIALIZING, + LEP_SYSTEM_IN_LOW_POWER_MODE, + LEP_SYSTEM_GOING_INTO_STANDBY, + LEP_SYSTEM_FLAT_FIELD_IN_PROCESS, + LEP_SYSTEM_FLAT_FIELD_IMMINENT, + LEP_SYSTEM_THERMAL_SHUTDOWN_IMMINENT, + + LEP_SYSTEM_END_STATES + +}LEP_SYSTEM_STATUS_STATES_E, *LEP_SYSTEM_STATUS_STATES_E_PTR; +typedef unsigned short LEP_UINT16; + +typedef struct +{ + LEP_SYSTEM_STATUS_STATES_E camStatus; + LEP_UINT16 commandCount; + LEP_UINT16 reserved; +}LEP_STATUS_T, *LEP_STATUS_T_PTR; + +typedef struct LEP_OEM_PART_NUMBER_T_TAG +{ + LEP_CHAR8 value[LEP_OEM_MAX_PART_NUMBER_CHAR_SIZE]; +} LEP_OEM_PART_NUMBER_T, *LEP_OEM_PART_NUMBER_T_PTR; +#endif // _FLIR_TYPES_H_ + + diff --git a/mediafoundation/PureThermal/PureThermal.cpp b/mediafoundation/PureThermal/PureThermal.cpp index 7532017..e364308 100644 --- a/mediafoundation/PureThermal/PureThermal.cpp +++ b/mediafoundation/PureThermal/PureThermal.cpp @@ -1,5 +1,4 @@ -#include "pch.h" -#include "Device.h" +#include "Device.h" double KelvinToCelsius(std::uint16_t kelvin) @@ -25,12 +24,10 @@ int main() Device pureThermal{}; if (!pureThermal) { - std::cout << "\nDid not find \"PureThermal\" device\n"; + std::cout << "\nDid not find any \"PureThermal\" device\n"; } else - { - std::cout << "\nFound \"PureThermal\" device\n\n"; - + { pureThermal.PrintDeviceInfo(); std::cout << "\nPress any key to perform an FFC..." << std::endl; @@ -39,7 +36,7 @@ int main() std::cout << "Press any key to capture a frame..." << std::endl; std::cin.get(); - auto frame = pureThermal.GetFrame(); + Device::Frame frame = pureThermal.GetFrame(); if (!(frame.data.empty())) { std::stringstream fileName; @@ -64,6 +61,7 @@ int main() { std::cout << "Y16 format not supported" << std::endl; } + } } diff --git a/mediafoundation/PureThermal/PureThermal.vcxproj b/mediafoundation/PureThermal/PureThermal.vcxproj index 1077f3b..7b33961 100644 --- a/mediafoundation/PureThermal/PureThermal.vcxproj +++ b/mediafoundation/PureThermal/PureThermal.vcxproj @@ -23,7 +23,7 @@ {738CA9D8-B6CD-469D-BBF8-FEF33E010780} Win32Proj PureThermal - 10.0.17134.0 + 10.0.17763.0 @@ -100,18 +100,23 @@ - Use + NotUsing Level3 Disabled true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - pch.h + + + + Console true mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + @@ -136,7 +141,7 @@ - Use + NotUsing Level3 MaxSpeed true @@ -144,7 +149,10 @@ true NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true - pch.h + + + + Console @@ -152,20 +160,16 @@ true true mf.lib;mfplat.lib;mfreadwrite.lib;mfuuid.lib;shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + + - + - - Create - Create - Create - Create - diff --git a/mediafoundation/PureThermal/PureThermal.vcxproj.filters b/mediafoundation/PureThermal/PureThermal.vcxproj.filters index 2b554ae..5580df5 100644 --- a/mediafoundation/PureThermal/PureThermal.vcxproj.filters +++ b/mediafoundation/PureThermal/PureThermal.vcxproj.filters @@ -15,17 +15,14 @@ - + Header Files - + Header Files - - Source Files - Source Files diff --git a/mediafoundation/PureThermal/image_160x120_Y16.dat b/mediafoundation/PureThermal/image_160x120_Y16.dat new file mode 100644 index 0000000000000000000000000000000000000000..c592cb7900fd6a5e39c73249570c56da3af91c16 GIT binary patch literal 38400 zcmeIu0Sy2E0K%a6Pi+qe5hx58Fkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 hV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>Yx*IWU$000961 literal 0 HcmV?d00001 diff --git a/mediafoundation/PureThermal/pch.cpp b/mediafoundation/PureThermal/pch.cpp deleted file mode 100644 index bcb5590..0000000 --- a/mediafoundation/PureThermal/pch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "pch.h" diff --git a/mediafoundation/PureThermal/pch.h b/mediafoundation/PureThermal/pch.h deleted file mode 100644 index d5d3368..0000000 --- a/mediafoundation/PureThermal/pch.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef PCH_H -#define PCH_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif //PCH_H