15 #pragma warning( disable: 4251 )
19#include <initializer_list>
20#include <unordered_map>
40#include <CArcDeviceDllMain.h>
41#include <CArcStringList.h>
42#include <CArcAlertPacket.h>
43#include <CArcCommandPacket.h>
44#include <CArcPacketFactory.h>
45#include <CArcPacket.h>
46#include <CArcStatusPacket.h>
47#include <CArcDLoadPacket.h>
48#include <CArcImageAssembler.h>
49#include <CArcImagePacket.h>
50#include <CArcPCIeBase.h>
51#include <CArcSystem.h>
53#include <ArcDeviceIOControl.h>
54#include <CArcDebugStreamBuffer.h>
55#include <ArcFlashMemoryDefs.h>
56#include <ArcSysState.h>
57#include <ArcConcepts.h>
58#include <CArcBoardMap.h>
165 #if __cpp_lib_optional
166 using optionalAlertFunction_t = std::optional<
const std::function<void(
const std::string& )>*>;
234 #ifdef ARC_DEBUG_READOUT
248 static const std::string
version(
void )
noexcept;
265 void open(
const std::uint32_t uiDeviceNumber = 0,
const bool bMapBuffer =
true );
305 void setup(
const std::filesystem::path& tCtlrFile,
const std::uint32_t uiHdwTestCnt = 1234,
bool* pStop =
nullptr );
312 void loadFile(
const std::filesystem::path& tCtlrFile,
bool* pStop =
nullptr );
346 #if __cpp_lib_optional
351 arc::gen4::optionalAlertFunction_t getAlertHandler(
void )
const;
378 void setImageDimensions(
const std::uint32_t uiCols,
const std::uint32_t uiRows,
const std::uint32_t uwChannelCount );
402 std::array tArgsArray { args ... };
406 for ( std::size_t i = 0; i < (
sizeof...( args ) ); i++ )
408 pCommandPacket->add(
static_cast< std::uint32_t
>( tArgsArray[ i ] ) );
411 return command( pCommandPacket.get() );
424 std::array<std::uint32_t,
sizeof...( Args )> tArgsArray { std::forward<const Args>( args )... };
428 pCommandPacket->add(
static_cast< std::uint32_t
>( tCmd ) );
430 for ( std::size_t i = 0; i < tArgsArray.size(); i++ )
432 pCommandPacket->add(
static_cast< std::uint32_t
>( tArgsArray[ i ] ) );
435 return command( pCommandPacket.get() );
453 void command(
const std::vector<std::uint32_t>& vCmdList, std::uint32_t uiExpectedReply );
472 void command(
const std::vector<std::any>& vCmdList,
const std::uint32_t uiExpectedReply );
523 std::
size_t getImageBufferCount(
void ) const noexcept;
533 std::uint64_t setImageBufferSize( const std::uint32_t uiColumns, const std::uint32_t uiRows ) noexcept;
542 std::uint64_t setImageBufferSize( const std::uint64_t uiSize ) noexcept;
547 std::uint64_t getImageBufferSize(
void ) const noexcept;
554 bool setImageBufferFill( const std::uint32_t uiValue =
arc::gen4::
CArcDevice::NO_FILL_VALUE ) const noexcept;
570 void enableCommandLogging( const
bool bEnable = true );
587 void flashMemoryReadFirmwareBlock( const std::filesystem::path& tOutFile,
bool* pStop =
nullptr, const
fileProgressListener_t& fnProgressListener =
nullptr );
596 void flashMemoryWriteFirmwareBlock( const std::filesystem::path& tInFile,
bool* pStop =
nullptr, const
fileProgressListener_t& fnProgressListener =
nullptr );
604 const std::
string flashMemoryReadIdBlock( const std::uint32_t uiBoardNumber );
612 const std::
string flashMemoryReadUserBlock( const std::uint32_t uiBoardNumber );
620 void flashMemoryWriteUserBlock( const std::uint32_t uiBoardNumber, const std::
string& sText );
628 void flashMemoryErase( const std::uint32_t uiBoardNumber, const
arc::gen4::
flashMemoryId_e eBlockId );
637 std::uint32_t readBAR( const std::uint32_t uiBAR, const std::uint32_t uiAddress ) const;
646 void writeBAR( const std::uint32_t uiBAR, const std::uint32_t uiAddress, const std::uint32_t uiValue ) const;
653 const std::
string dumpBARs(
void ) const;
676 std::function<
float(
void )> fnReadElapsedTime;
682 std::function<std::uint32_t(
void )> fnGetPixelCount;
687 std::function<
void(
void)> fnResetPixelCounter;
690 std::function<
void(
void)> fnVerifyDeviceIsOpen;
693 static constexpr auto NOPARAM = static_cast< std::uint32_t >( 0xFFFFFFFF );
696 static constexpr auto ARC420_BOARD_NUMBER = static_cast< std::uint32_t >( 0x8 );
699 static constexpr auto ARC480_BOARD_NUMBER = static_cast< std::uint32_t >( 0x3F );
702 static constexpr auto NO_FILL_VALUE = static_cast< std::uint32_t >( 65536 );
705 static constexpr auto ARC420_SYNTHETIC_DIMENSION = static_cast< std::uint32_t >( 2048 );
708 static constexpr auto ARC420_SYNTHETIC_CHANNEL_COUNT = static_cast< std::uint32_t >( 16 );
723 std::unique_ptr<std::uint8_t[]> readFileBytes( const std::filesystem::path& tFilePath, std::uint32_t& uiFileLength );
737 void clearCommandAbort(
void ) const;
743 bool commandAborted(
void ) const;
757 void readOut( std::uint32_t& uiBufferIndex, const std::uint32_t uiReadCount, const
readListener_t fnReadListener );
763 void readAlerts( const std::chrono::milliseconds freqMS ) const;
771 void flashMemoryWriteIdBlock( std::uint32_t uiBoardNumber, const std::
string& sText );
784 std::unique_ptr<std::uint8_t[]> flashMemoryReadFirmwareBlock( std::uint32_t& uiDataLength,
bool* pStop, std::function<
void( std::uint32_t, std::uint32_t )> fProgressListener );
791 std::function<std::uint32_t( const std::
size_t )> fnCommonBufferByteCount;
798 std::function<
bool( const std::
size_t )> fnCommonBufferDirty;
805 std::function<
bool( const std::
size_t )> fnCommonBufferOverflow;
812 std::function<
bool( const std::
size_t )> fnCommonBufferComplete;
819 std::function<
void( std::
size_t, std::uint32_t )> fnClearCommonBufferStatus;
824 std::function<
void(
void )> fnClearPacketBuffers;
834 std::function<std::tuple<
bool,std::uint32_t>(
void)> fnImageAddressError;
841 virtual
bool readConfigSpace8( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
848 virtual
bool readConfigSpace16( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
855 virtual
bool readConfigSpace32( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
862 virtual
bool readConfigSpace64( std::uint64_t uiAddress, std::uint64_t* pRegValue ) const noexcept override;
869 virtual
bool writeConfigSpace8( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
876 virtual
bool writeConfigSpace16( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
883 virtual
bool writeConfigSpace32( const std::uint32_t uiAddress, const std::uint32_t uiValue ) const noexcept override;
886 static std::unique_ptr<const std::array<std::uint32_t,2>> m_pCommonBufferStatusRegisters;
889 static std::unique_ptr<const std::array<std::uint32_t, 2>> m_pCommonBufferStatusByteCountRegisters;
892 static const std::
string m_sVersion;
895 static const std::
string m_sToString;
907 std::uint64_t m_uiBufferSize;
916 static std::unique_ptr<std::vector<
arcDev_t>> m_pvDevList;
928 std::thread* m_pAlertThread;
934 mutable std::uint32_t m_uiFillValue;
937 mutable std::mutex m_oCmdMutex;
940 mutable std::mutex m_oCmdAbortMutex;
943 mutable std::atomic_bool m_abCmdAbort;
946 std::atomic_bool m_abStopAlertCapture;
949 std::unique_ptr<std::stop_source> m_pExposeStopSource;
952 bool m_bFlashMemoryBlockAccess;
955 static constexpr auto ELAPSED_TIMEOUT_COUNT = static_cast< std::uint32_t >( 20 );
958 static constexpr auto READ_TIMEOUT_COUNT = static_cast< std::uint32_t >( 100 );
961 std::chrono::high_resolution_clock::time_point m_cTimeArr[ 4 ];
973 auto BARtoStream( std::ostream& oss,
const std::string& sRegName,
const std::uint32_t uiAddress,
const std::size_t uiDotLength = 40 ) const-> std::uint32_t;
979 std::function<
bool(
void)> fnAlertReceived;
982 static constexpr auto DEFAULT_IMAGE_COLUMN_DIMENSION = static_cast< std::uint32_t >( 4400 );
985 static constexpr auto DEFAULT_IMAGE_ROW_DIMENSION = static_cast< std::uint32_t >( 4400 );
988 static constexpr auto BFM = static_cast< std::uint32_t >( 0x0042464D );
991 static constexpr auto MAX_BAR = static_cast< std::uint32_t >( 5 );
994 static constexpr auto FLASH_MEMORY_FIRMWARE_STARTADDR = static_cast< std::uint32_t >( 0 );
997 static constexpr auto FLASH_MEMORY_FIRMWARE_BLOCKSIZE = static_cast< std::uint32_t >( 0x2FFFF );
1000 static constexpr auto FLASH_MEMORY_NETWORK_MAC_ADDR = static_cast< std::uint32_t >( 0x30000 );
1003 static constexpr auto FLASH_MEMORY_NETWORK_STARTADDR = static_cast< std::uint32_t >( 0x31000 );
1006 static constexpr auto FLASH_MEMORY_NETWORK_MAC_SIZE = static_cast< std::int32_t >( 6 );
1009 static constexpr auto FLASH_MEMORY_NETWORK_IP_SIZE = static_cast< std::int32_t >( 4 );
1012 static constexpr auto FLASH_MEMORY_NETWORK_PORT_SIZE = static_cast< std::int32_t >( 2 );
1015 static constexpr auto FLASH_MEMORY_NETWORK_DATA_SIZE = static_cast< std::int32_t >(
1016 FLASH_MEMORY_NETWORK_IP_SIZE +
1017 FLASH_MEMORY_NETWORK_PORT_SIZE +
1018 FLASH_MEMORY_NETWORK_IP_SIZE +
1019 FLASH_MEMORY_NETWORK_IP_SIZE +
1020 FLASH_MEMORY_NETWORK_IP_SIZE +
1021 FLASH_MEMORY_NETWORK_IP_SIZE +
1022 FLASH_MEMORY_NETWORK_IP_SIZE +
1023 FLASH_MEMORY_NETWORK_PORT_SIZE );
1026 static constexpr auto FLASH_MEMORY_NETWORK_IP_OFFSET = static_cast< std::int32_t >( 0 );
1029 static constexpr auto FLASH_MEMORY_NETWORK_PORT_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_IP_OFFSET + FLASH_MEMORY_NETWORK_IP_SIZE );
1032 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 );
1035 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 );
1038 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 );
1041 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 );
1044 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 );
1047 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 );
1050 static constexpr auto FLASH_MEMORY_END_OFFSET = static_cast< std::int32_t >( FLASH_MEMORY_NETWORK_HOST_PORT_OFFSET + FLASH_MEMORY_NETWORK_PORT_SIZE );
1053 static constexpr auto FLASH_MEMORY_ARC420_ID_STARTADDR = static_cast< std::uint32_t >( 0x32000 );
1056 static constexpr auto FLASH_MEMORY_ARC420_MAX_ID_CHARACTERS = static_cast< std::uint32_t >( 4096 );
1059 static constexpr auto FLASH_MEMORY_ID_STARTADDR = static_cast< std::uint32_t >( 0x38000 );
1062 static constexpr auto FLASH_MEMORY_MAX_ID_CHARACTERS = static_cast< std::uint32_t >( 0x7FFF );
1065 static constexpr auto FLASH_MEMORY_ARC420_USER_STARTADDR = static_cast< std::uint32_t >( 0x38000 );
1068 static constexpr auto FLASH_MEMORY_ARC420_MAX_USER_CHARACTERS = static_cast< std::uint32_t >( 4096 );
1071 static constexpr auto FLASH_MEMORY_USER_STARTADDR = static_cast< std::uint32_t >( 0 );
1074 static constexpr auto FLASH_MEMORY_MAX_USER_CHARACTERS = static_cast< std::uint32_t >( 0x37FFF );
1077 static constexpr auto EXPOSE_RET_HANDLE_TIME = static_cast< std::uint32_t >( 310 );
1080 static constexpr auto EXPOSE_RET_BAIL_TIME = static_cast<
float >( 0.3f );
1082 #ifdef ARC_DEBUG_READOUT
1084 std::shared_ptr<std::ostream> m_pDbgOS;
void stopExpose(void) noexcept
void mapCommonBuffer(void)
void commandAbort(void) const
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::uint32_t > &vCmdList, std::uint32_t uiExpectedReply)
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 command(const std::vector< std::any > &vCmdList, const std::uint32_t uiExpectedReply)
void verifyColumnChannelCount(const std::uint32_t uiCols, const std::uint32_t uwChannelCount)
arc::gen4::pStatusPacket_t command(arc::gen4::cmds_e tCmd, const Args ... args)
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 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)