15 #pragma warning( disable: 4251 )
19#include <initializer_list>
20#include <unordered_map>
41#include <CArcDeviceDllMain.h>
43#include <CArcStringList.h>
44#include <CArcAlertPacket.h>
45#include <CArcCommandPacket.h>
46#include <CArcPacketFactory.h>
47#include <CArcPacket.h>
48#include <CArcStatusPacket.h>
49#include <CArcDLoadPacket.h>
50#include <CArcImageAssembler.h>
51#include <CArcImagePacket.h>
52#include <CArcPCIeBase.h>
53#include <CArcSystem.h>
55#include <ArcDeviceIOControl.h>
56#include <CArcDebugStreamBuffer.h>
57#include <ArcFlashMemoryDefs.h>
58#include <ArcSysState.h>
59#include <ArcConcepts.h>
60#include <CArcBoardMap.h>
167 #if __cpp_lib_optional
168 using optionalAlertFunction_t = std::optional<
const std::function<void(
const std::string& )>*>;
236 #ifdef ARC_DEBUG_READOUT
250 static const std::string
version(
void )
noexcept;
267 void open(
const std::uint32_t uiDeviceNumber = 0,
const bool bMapBuffer =
true );
307 void setup(
const std::filesystem::path& tCtlrFile,
const std::uint32_t uiHdwTestCnt = 1234,
bool* pStop =
nullptr );
314 void loadFile(
const std::filesystem::path& tCtlrFile,
bool* pStop =
nullptr );
348 #if __cpp_lib_optional
353 arc::gen4::optionalAlertFunction_t getAlertHandler(
void )
const;
380 void setImageDimensions(
const std::uint32_t uiCols,
const std::uint32_t uiRows,
const std::uint32_t uwChannelCount );
404 std::array tArgsArray { args ... };
408 for ( std::size_t i = 0; i < (
sizeof...( args ) ); i++ )
410 pCommandPacket->add(
static_cast< std::uint32_t
>( tArgsArray[ i ] ) );
413 return command( pCommandPacket.get() );
426 std::array<std::uint32_t,
sizeof...( Args )> tArgsArray { std::forward<const Args>( args )... };
430 pCommandPacket->add(
static_cast< std::uint32_t
>( eCmd ) );
432 for ( std::size_t i = 0; i < tArgsArray.size(); i++ )
434 pCommandPacket->add(
static_cast< std::uint32_t
>( tArgsArray[ i ] ) );
437 return command( pCommandPacket.get() );
454 void command(
const std::vector<std::uint32_t>& vCmdList,
const std::uint32_t uiExpectedStatus );
480 void command(
const std::vector<std::any>& vCmdList,
const std::uint32_t uiExpectedStatus );
540 std::
size_t getImageBufferCount(
void ) const noexcept;
550 std::uint64_t setImageBufferSize( const std::uint32_t uiColumns, const std::uint32_t uiRows ) noexcept;
559 std::uint64_t setImageBufferSize( const std::uint64_t uiSize ) noexcept;
564 std::uint64_t getImageBufferSize(
void ) const noexcept;
571 bool setImageBufferFill( const std::uint32_t uiValue =
arc::gen4::
CArcDevice::NO_FILL_VALUE ) const noexcept;
587 void enableCommandLogging( const
bool bEnable = true );
604 void flashMemoryReadFirmwareBlock( const std::filesystem::path& tOutFile,
bool* pStop =
nullptr, const
fileProgressListener_t& fnProgressListener =
nullptr );
613 void flashMemoryWriteFirmwareBlock( const std::filesystem::path& tInFile,
bool* pStop =
nullptr, const
fileProgressListener_t& fnProgressListener =
nullptr );
621 const std::
string flashMemoryReadIdBlock( const std::uint32_t uiBoardNumber );
629 const std::
string flashMemoryReadUserBlock( const std::uint32_t uiBoardNumber );
637 void flashMemoryWriteUserBlock( const std::uint32_t uiBoardNumber, std::string_view svText );
645 void flashMemoryErase( const std::uint32_t uiBoardNumber, const
arc::gen4::
flashMemoryId_e eBlockId );
656 std::uint32_t readBAR( const std::uint32_t uiBAR, const std::uint32_t uiAddress ) const;
665 void writeBAR( const std::uint32_t uiBAR, const std::uint32_t uiAddress, const std::uint32_t uiValue ) const;
672 const std::
string dumpBARs(
void ) const;
695 std::function<
float(
void )> fnReadElapsedTime;
701 std::function<std::uint32_t(
void )> fnGetPixelCount;
706 std::function<
void(
void)> fnResetPixelCounter;
709 std::function<
void(
void)> fnVerifyDeviceIsOpen;
712 static constexpr auto NOPARAM = static_cast< std::uint32_t >( 0xFFFFFFFF );
715 static constexpr auto ARC420_BOARD_NUMBER = static_cast< std::uint32_t >( 0x8 );
718 static constexpr auto ARC480_BOARD_NUMBER = static_cast< std::uint32_t >( 0x3F );
721 static constexpr auto NO_FILL_VALUE = static_cast< std::uint32_t >( 65536 );
724 static constexpr auto ARC420_SYNTHETIC_DIMENSION = static_cast< std::uint32_t >( 2048 );
727 static constexpr auto ARC420_SYNTHETIC_CHANNEL_COUNT = static_cast< std::uint32_t >( 16 );
730 static constexpr auto ARC420_WG_TABLE_LENGTH = static_cast<std::uint32_t>( 1024 );
736 static constexpr auto ARC440_CHANNEL_COUNT = static_cast< std::uint32_t >( 16 );
739 static constexpr auto ARC430_DC_BIAS_COUNT = static_cast< std::uint32_t >( 12 );
755 void clearCommandAbort(
void ) const;
761 bool commandAborted(
void ) const;
775 void readOut( std::uint32_t& uiBufferIndex, const std::uint32_t uiReadCount, const
readListener_t fnReadListener );
781 void readAlerts( const std::chrono::milliseconds freqMS ) const;
789 void flashMemoryWriteIdBlock( std::uint32_t uiBoardNumber, std::string_view svText );
802 std::unique_ptr<std::uint8_t[]> flashMemoryReadFirmwareBlock( std::uint32_t& uiDataLength,
bool* pStop, std::function<
void( std::uint32_t, std::uint32_t )> fProgressListener );
809 std::function<std::uint32_t( const std::
size_t )> fnCommonBufferByteCount;
816 std::function<
bool( const std::
size_t )> fnCommonBufferDirty;
823 std::function<
bool( const std::
size_t )> fnCommonBufferOverflow;
830 std::function<
bool( const std::
size_t )> fnCommonBufferComplete;
837 std::function<
void( std::
size_t, std::uint32_t )> fnClearCommonBufferStatus;
842 std::function<
void(
void )> fnClearPacketBuffers;
852 std::function<std::tuple<
bool,std::uint32_t>(
void)> fnImageAddressError;
859 virtual
bool readConfigSpace8( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
866 virtual
bool readConfigSpace16( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
873 virtual
bool readConfigSpace32( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
880 virtual
bool readConfigSpace64( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
887 virtual
bool writeConfigSpace8( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
894 virtual
bool writeConfigSpace16( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
901 virtual
bool writeConfigSpace32( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
904 static std::unique_ptr<const std::array<std::uint32_t,2>> m_pCommonBufferStatusRegisters;
907 static std::unique_ptr<const std::array<std::uint32_t, 2>> m_pCommonBufferStatusByteCountRegisters;
910 static const std::
string m_sVersion;
913 static const std::
string m_sToString;
925 std::uint64_t m_uiBufferSize;
934 static std::unique_ptr<std::vector<
arcDev_t>> m_pvDevList;
946 std::thread* m_pAlertThread;
952 mutable std::uint32_t m_uiFillValue;
955 mutable std::mutex m_oCmdMutex;
958 mutable std::mutex m_oCmdAbortMutex;
961 mutable std::atomic_bool m_abCmdAbort;
964 std::atomic_bool m_abStopAlertCapture;
967 std::unique_ptr<std::stop_source> m_pExposeStopSource;
970 bool m_bFlashMemoryBlockAccess;
973 static constexpr auto ELAPSED_TIMEOUT_COUNT = static_cast< std::uint32_t >( 20 );
976 static constexpr auto READ_TIMEOUT_COUNT = static_cast< std::uint32_t >( 100 );
979 std::chrono::high_resolution_clock::time_point m_cTimeArr[ 4 ];
991 auto BARtoStream( std::ostream& oss,
const std::string& sRegName,
const std::uint32_t uiAddress,
const std::size_t uiDotLength = 40 ) const-> std::uint32_t;
997 std::function<
bool(
void)> fnAlertReceived;
1000 static constexpr auto DEFAULT_IMAGE_COLUMN_DIMENSION = static_cast< std::uint32_t >( 4400 );
1003 static constexpr auto DEFAULT_IMAGE_ROW_DIMENSION = static_cast< std::uint32_t >( 4400 );
1006 static constexpr auto BFM = static_cast< std::uint32_t >( 0x0042464D );
1009 static constexpr auto MAX_BAR = static_cast< std::uint32_t >( 5 );
1012 static constexpr auto FLASH_MEMORY_FIRMWARE_STARTADDR = static_cast< std::uint32_t >( 0 );
1015 static constexpr auto FLASH_MEMORY_FIRMWARE_BLOCKSIZE = static_cast< std::uint32_t >( 0x2FFFF );
1018 static constexpr auto FLASH_MEMORY_NETWORK_MAC_ADDR = static_cast< std::uint32_t >( 0x30000 );
1021 static constexpr auto FLASH_MEMORY_NETWORK_STARTADDR = static_cast< std::uint32_t >( 0x31000 );
1024 static constexpr auto FLASH_MEMORY_NETWORK_MAC_SIZE = static_cast< std::int32_t >( 6 );
1027 static constexpr auto FLASH_MEMORY_NETWORK_IP_SIZE = static_cast< std::int32_t >( 4 );
1030 static constexpr auto FLASH_MEMORY_NETWORK_PORT_SIZE = static_cast< std::int32_t >( 2 );
1033 static constexpr auto FLASH_MEMORY_NETWORK_DATA_SIZE = static_cast< std::int32_t >(
1034 FLASH_MEMORY_NETWORK_IP_SIZE +
1035 FLASH_MEMORY_NETWORK_PORT_SIZE +
1036 FLASH_MEMORY_NETWORK_IP_SIZE +
1037 FLASH_MEMORY_NETWORK_IP_SIZE +
1038 FLASH_MEMORY_NETWORK_IP_SIZE +
1039 FLASH_MEMORY_NETWORK_IP_SIZE +
1040 FLASH_MEMORY_NETWORK_IP_SIZE +
1041 FLASH_MEMORY_NETWORK_PORT_SIZE );
1044 static constexpr auto FLASH_MEMORY_NETWORK_IP_OFFSET = static_cast< std::int32_t >( 0 );
1047 static constexpr auto FLASH_MEMORY_NETWORK_PORT_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_IP_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1050 static constexpr auto FLASH_MEMORY_NETWORK_HOST_IP_0_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_PORT_OFFSET + FLASH_MEMORY_NETWORK_PORT_SIZE );
1053 static constexpr auto FLASH_MEMORY_NETWORK_HOST_IP_1_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_IP_0_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1056 static constexpr auto FLASH_MEMORY_NETWORK_HOST_IP_2_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_IP_1_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1059 static constexpr auto FLASH_MEMORY_NETWORK_HOST_IP_3_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_IP_2_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1062 static constexpr auto FLASH_MEMORY_NETWORK_HOST_IP_4_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_IP_3_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1065 static constexpr auto FLASH_MEMORY_NETWORK_HOST_PORT_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_IP_4_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1068 static constexpr auto FLASH_MEMORY_END_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_PORT_OFFSET + FLASH_MEMORY_NETWORK_PORT_SIZE );
1071 static constexpr auto FLASH_MEMORY_ARC420_ID_STARTADDR = static_cast< std::uint32_t >( 0x32000 );
1074 static constexpr auto FLASH_MEMORY_ARC420_MAX_ID_CHARACTERS = static_cast< std::uint32_t >( 4096 );
1077 static constexpr auto FLASH_MEMORY_ID_STARTADDR = static_cast< std::uint32_t >( 0x38000 );
1080 static constexpr auto FLASH_MEMORY_MAX_ID_CHARACTERS = static_cast< std::uint32_t >( 0x7FFF );
1083 static constexpr auto FLASH_MEMORY_ARC420_USER_STARTADDR = static_cast< std::uint32_t >( 0x38000 );
1086 static constexpr auto FLASH_MEMORY_ARC420_MAX_USER_CHARACTERS = static_cast< std::uint32_t >( 4096 );
1089 static constexpr auto FLASH_MEMORY_USER_STARTADDR = static_cast< std::uint32_t >( 0 );
1092 static constexpr auto FLASH_MEMORY_MAX_USER_CHARACTERS = static_cast< std::uint32_t >( 0x37FFF );
1095 static constexpr auto EXPOSE_RET_HANDLE_TIME = static_cast< std::uint32_t >( 310 );
1098 static constexpr auto EXPOSE_RET_BAIL_TIME = static_cast<
float >( 0.3f );
1100 #ifdef ARC_DEBUG_READOUT
1102 std::shared_ptr<std::ostream> m_pDbgOS;
void stopExpose(void) noexcept
void command(const std::vector< std::uint32_t > &vCmdList, const arc::gen4::status_e eExpectedStatus)
void mapCommonBuffer(void)
void commandAbort(void) const
arc::gen4::pStatusPacket_t command(const arc::gen4::cmds_e eCmd, const Args ... args)
void command(const std::vector< std::any > &vCmdList, const std::uint32_t uiExpectedStatus)
arc::gen4::pStatusPacket_t command(uint32Type auto const ... args)
bool isOpen(void) const noexcept
arc::gen4::pStringList_t getExposeModeList(void)
arc::gen4::pImageBuffer_t getImageBuffer(const std::uint16_t uwIndex=0) const noexcept
arc::gen4::pStatusPacket_t command(const std::vector< std::any > &vCmdList)
const std::string toString(void) const noexcept
arc::gen4::pCommonBufferList_t getCommonBuffers(void) const noexcept
CArcDevice(CArcDevice &&)=delete
arc::gen4::pSysState_t getSystemState(void)
void loadFile(const std::filesystem::path &tCtlrFile, bool *pStop=nullptr)
void setImageDimensions(const std::uint32_t uiCols, const std::uint32_t uiRows, const std::uint32_t uwChannelCount)
virtual ~CArcDevice(void)=default
void registerAlertHandler(alertHandler_t fnAlertHandler, std::chrono::milliseconds freqMS=std::chrono::milliseconds(1000))
CArcDevice & operator=(const CArcDevice &)=delete
CArcDevice(const CArcDevice &)=delete
arc::gen4::pStringList_t getCommandList(void)
arc::gen4::pStatusPacket_t command(const arc::gen4::CArcCommandPacket *pCmd) const
CArcDevice & operator=(CArcDevice &&)=delete
static const std::vector< arcDev_t > & findDevices(void)
std::unique_ptr< arc::gen4::CArcBoardMap > getBoardMap(void)
arc::gen4::pStatusPacket_t command(const std::vector< std::uint32_t > &vCmdList)
void open(const std::uint32_t uiDeviceNumber=0, const bool bMapBuffer=true)
void command(const std::vector< std::any > &vCmdList, const arc::gen4::status_e eExpectedStatus)
void setImageDimensions(const std::uint32_t uiCols, const std::uint32_t uiRows)
void setup(const std::filesystem::path &tCtlrFile, const std::uint32_t uiHdwTestCnt=1234, bool *pStop=nullptr)
void verifyColumnChannelCount(const std::uint32_t uiCols, const std::uint32_t uwChannelCount)
arc::gen4::pImageBuffer_t expose(const std::uint32_t uiExpTime, const exposeListener_t fnExposeListener=nullptr, const readListener_t fnReadListener=nullptr, pSysState_t pSysState=nullptr)
static const std::string version(void) noexcept
void command(const std::vector< std::uint32_t > &vCmdList, const std::uint32_t uiExpectedStatus)
void close(void) noexcept
const std::vector< arc::gen4::pImageBuffer_t > & getImageBufferList(void) const
void unMapCommonBuffer(void)
static CArcPacketFactory & getInstance(void) noexcept
std::unique_ptr< CArcCommandPacket > cmdPacket(const std::uint8_t uiId=0) const
std::shared_ptr< arc::gen4::CArcImageAssembler > pImageAssembler_t
std::unique_ptr< arc::gen4::CArcStringList > pStringList_t
constexpr auto ARC440_INVALID_CHANNEL_ADDRESS
std::function< void(std::uint32_t, float)> readListener_t
std::function< void(float)> exposeListener_t
std::function< void(const std::uint32_t, const std::uint32_t)> fileProgressListener_t
std::array< std::unique_ptr< arc::gen4::commonBuffer_t >, iCommonBufferListCount > commonBufferList_t
std::weak_ptr< arc::gen4::CArcLog > pLogger_t
std::unique_ptr< arc::gen4::CArcStatusPacket > pStatusPacket_t
std::shared_ptr< sysState_t > pSysState_t
std::function< void(const std::string &)> alertHandler_t
** Convenience ( compact ) definition for command log handler
constexpr auto iCommonBufferListCount
std::unique_ptr< commonBufferList_t > pCommonBufferList_t
std::shared_ptr< arc::gen4::imageBuffer_t > pImageBuffer_t
std::uint8_t * pVirtualAddress
const std::string toString(void) const
std::uint64_t u64PhysicalAddress
std::unique_ptr< std::uint8_t > pVirtualAddress
const std::string toString(void) const
imageBuffer_t(const std::uint64_t u64Size)