Developer Application Interface (ARC API) v3.6.2
ARC, Inc. GenII/III Application Interface
CArcPCIe.h
Go to the documentation of this file.
1// +------------------------------------------------------------------------------------------------------------------+
2// | FILE: CArcPCIe.h |
3// +------------------------------------------------------------------------------------------------------------------+
4// | PURPOSE: This file defines the ARC-66 PCIe device class. |
5// | |
6// | AUTHOR: Scott Streit DATE: ? |
7// | |
8// | Copyright Astronomical Research Cameras, Inc. All rights reserved. |
9// +------------------------------------------------------------------------------------------------------------------+
12#pragma once
13
14#ifdef _WINDOWS
15 #pragma warning( disable: 4251 )
16#endif
17
18#include <string_view>
19#include <filesystem>
20#include <charconv>
21#include <string>
22#include <vector>
23#include <memory>
24#include <list>
25
26#include <CArcDeviceDllMain.h>
27#include <CArcBase.h>
28#include <CArcPCIBase.h>
29#include <ArcDefs.h>
30
31
32namespace arc
33{
34 namespace gen3
35 {
36
37 namespace device
38 {
39
47 typedef enum class PCIeRegs : std::uint32_t
48 {
49 LCL_CFG_BAR = 0x00,
50 DEV_REG_BAR = 0x02
51 } ePCIeRegs;
52
53
97 typedef enum class PCIeRegOffsets : std::uint32_t
98 {
99 REG_CMD_HEADER = 0x00,
100 REG_CMD_COMMAND = 0x04,
101 REG_CMD_ARG0 = 0x08,
102 REG_CMD_ARG1 = 0x0C,
103 REG_CMD_ARG2 = 0x10,
104 REG_CMD_ARG3 = 0x14,
105 REG_CMD_ARG4 = 0x18,
106 REG_CTLR_SPECIAL_CMD = 0x1C,
107 REG_RESET = 0x20,
108 REG_INIT_IMG_ADDR = 0x38,
109 REG_FIBER_2X_CTRL = 0x5C,
110 REG_STATUS = 0x60,
111 REG_CMD_REPLY = 0x64,
112 REG_CTLR_ARG1 = 0x68,
113 REG_CTLR_ARG2 = 0x6C,
114 REG_PIXEL_COUNT = 0x70,
115 REG_FRAME_COUNT = 0x74,
116 REG_ID_LO = 0x78,
117 REG_ID_HI = 0x7C
118 } ePCIeRegOffsets;
119
120
128 typedef enum class RegCmds : std::uint32_t
129 {
130 CONTROLLER_GET_ID = 0x09,
131 CONTROLLER_RESET = 0x0B
132 } eRegCmds;
133
134
142 typedef enum class Fiber2x : std::uint32_t
143 {
144 FIBER_2X_DISABLE,
145 FIBER_2X_ENABLE
146 } eFiber2x;
147
148
159 typedef enum class Fiber : std::uint32_t
160 {
161 FIBER_A,
162 FIBER_B
163 } eFiber;
164
165 } // end device namespace
166
167
174 class GEN3_CARCDEVICE_API CArcPCIe : public CArcPCIBase
175 {
176 public:
177
180 CArcPCIe( void );
181
184 virtual ~CArcPCIe( void );
185
189 constexpr std::string_view toString( void );
190
191 // PCI(e) configuration space access
192 // +-------------------------------------------------+
193
199 std::uint32_t getCfgSpByte( const std::uint32_t uiOffset );
200
206 std::uint32_t getCfgSpWord( const std::uint32_t uiOffset );
207
213 std::uint32_t getCfgSpDWord( const std::uint32_t uiOffset );
214
220 void setCfgSpByte( const std::uint32_t uiOffset, const std::uint32_t uiValue );
221
227 void setCfgSpWord( const std::uint32_t uiOffset, const std::uint32_t uiValue );
228
234 void setCfgSpDWord( const std::uint32_t uiOffset, const std::uint32_t uiValue );
235
241 void getCfgSp( void );
242
249 void getBarSp( void );
250
251
252 // Device access
253 // +-------------------------------------------------+
254
258 static void findDevices( void );
259
263 static std::uint32_t deviceCount( void ) noexcept;
264
268 static const std::weak_ptr<std::string[]> getDeviceStringList( void ) noexcept;
269
273 bool isOpen( void ) noexcept;
274
279 void open( const std::uint32_t uiDeviceNumber = 0 );
280
287 void open( const std::uint32_t uiDeviceNumber, const std::uint32_t uiBytes );
288
297 void open( const std::uint32_t uiDeviceNumber, const std::uint32_t uiRows, const std::uint32_t uiCols );
298
301 void close( void );
302
306 void reset( void );
307
312 bool getCommonBufferProperties( void );
313
319 void mapCommonBuffer( std::size_t uiBytes = 0 );
320
324 void unMapCommonBuffer( void );
325
330 std::uint32_t getId( void );
331
337 std::uint32_t getStatus( void );
338
342 void clearStatus( void );
343
348 void set2xFOTransmitter( bool bOnOff );
349
354 void loadDeviceFile( const std::filesystem::path& tFile );
355
356
357 // Setup & General commands
358 // +-------------------------------------------------+
359
367 std::uint32_t command( const std::initializer_list<const std::uint32_t>& tCmdList );
368
373 std::uint32_t getControllerId( void );
374
378 void resetController( void );
379
384 bool isControllerConnected( void );
385
390 bool isFiberConnected( arc::gen3::device::eFiber eFiberId = arc::gen3::device::eFiber::FIBER_A );
391
392 // Expose commands
393 // +-------------------------------------------------+
394
398 void stopExposure( void );
399
404 bool isReadout( void );
405
410 std::uint32_t getPixelCount( void );
411
416 std::uint32_t getCRPixelCount( void );
417
422 std::uint32_t getFrameCount( void );
423
424 // PCIe only methods
425 // +-------------------------------------------------+
426
433 void writeBar( arc::gen3::device::ePCIeRegs eBar, const std::uint32_t uiOffset, const std::uint32_t uiValue );
434
441 std::uint32_t readBar( arc::gen3::device::ePCIeRegs eBar, const std::uint32_t uiOffset );
442
448 std::uint32_t readReply( double fTimeOutSecs = 1.5 );
449
450 // PCIe Board ID Constant
451 // +-------------------------------------------------+
452
454 static constexpr auto ID = static_cast< std::uint32_t >( 0x41524336 );
455
456 // Driver ioctl commands
457 // +-----------------------------------------------------------------------------+
458
460 static constexpr auto ARC_READ_BAR = static_cast< std::uint32_t >( 0x01 );
461
463 static constexpr auto ARC_WRITE_BAR = static_cast< std::uint32_t >( 0x02 );
464
466 static constexpr auto ARC_BAR_SIZE = static_cast< std::uint32_t >( 0x03 );
467
469 static constexpr auto ARC_READ_CFG_8 = static_cast< std::uint32_t >( 0x04 );
470
472 static constexpr auto ARC_READ_CFG_16 = static_cast< std::uint32_t >( 0x05 );
473
475 static constexpr auto ARC_READ_CFG_32 = static_cast< std::uint32_t >( 0x06 );
476
478 static constexpr auto ARC_WRITE_CFG_8 = static_cast< std::uint32_t >( 0x07 );
479
481 static constexpr auto ARC_WRITE_CFG_16 = static_cast< std::uint32_t >( 0x08 );
482
484 static constexpr auto ARC_WRITE_CFG_32 = static_cast< std::uint32_t >( 0x09 );
485
487 static constexpr auto ARC_BUFFER_PROP = static_cast< std::uint32_t >( 0x0A );
488
490 static constexpr auto ARC_MEM_MAP = static_cast< std::uint32_t >( 0x0C );
491
493 static constexpr auto ARC_MEM_UNMAP = static_cast< std::uint32_t >( 0x0D );
494
495 // +----------------------------------------------------------------------------
496 // | Status register definitions and functions
497 // +----------------------------------------------------------------------------
498
500 static constexpr auto PCIe_STATUS_CLEAR_ALL = static_cast< std::uint32_t >( 0x7F );
501
506 std::function<bool( const std::uint32_t )> fnPCIeStatusReplyRecvd;
507
512 std::function<bool( const std::uint32_t )> fnPCIeStatusControllerReset;
513
518 std::function<bool( const std::uint32_t )> fnPCIeStatusReadout;
519
524 std::function<bool( const std::uint32_t )> fnPCIeStatusIdle;
525
530 std::function<bool( const std::uint32_t )> fnPCIeStatusCmdSent;
531
536 std::function<bool( const std::uint32_t )> fnPCIeStatusImageReadTimeOut;
537
542 std::function<bool( const std::uint32_t )> fnPCIeStatusHeaderError;
543
548 std::function<bool( const std::uint32_t )> fnPCIeStatusFiber2xReceiver;
549
554 std::function<bool( const std::uint32_t )> fnPCIeStatusFiberAConnected;
555
560 std::function<bool( const std::uint32_t )> fnPCIeStatusFiberBConnected;
561
562 protected:
563
565 static constexpr auto ARC_MIN_BAR = static_cast< std::uint32_t >( 0 );
566
568 static constexpr auto ARC_MAX_BAR = static_cast< std::uint32_t >( 5 );
569
577 std::uint32_t getContinuousImageSize( const std::uint32_t uiImageSize );
578
586 std::uint32_t smallCamDLoad( const std::uint32_t uiBoardId, const std::vector<std::uint32_t>* pvData );
587
596 void loadGen23ControllerFile( const std::filesystem::path& tFilename, bool bValidate, bool* pAbort = nullptr );
597
600 void setByteSwapping( void );
601
605 void getLocalConfiguration( void );
606
611 std::function<std::uint32_t( const std::uint16_t )> m_fnValidDeviceVendorId;
612
618 std::function<void( const std::uint32_t )> m_fnVerify24Bits;
619
621 static std::unique_ptr<std::vector<arc::gen3::arcDev_t>> m_pvDevList;
622
624 static std::shared_ptr<std::string[]> m_psDevList;
625 };
626
627 } // end gen3 namespace
628} // end arc namespace
Definition: CArcPCIBase.h:95
Definition: CArcPCIe.h:175
std::function< bool(const std::uint32_t)> fnPCIeStatusReadout
Definition: CArcPCIe.h:518
std::function< void(const std::uint32_t)> m_fnVerify24Bits
Definition: CArcPCIe.h:618
std::function< bool(const std::uint32_t)> fnPCIeStatusIdle
Definition: CArcPCIe.h:524
static std::unique_ptr< std::vector< arc::gen3::arcDev_t > > m_pvDevList
Definition: CArcPCIe.h:621
static std::shared_ptr< std::string[]> m_psDevList
Definition: CArcPCIe.h:624
std::function< bool(const std::uint32_t)> fnPCIeStatusHeaderError
Definition: CArcPCIe.h:542
std::function< std::uint32_t(const std::uint16_t)> m_fnValidDeviceVendorId
Definition: CArcPCIe.h:611
std::function< bool(const std::uint32_t)> fnPCIeStatusControllerReset
Definition: CArcPCIe.h:512
std::function< bool(const std::uint32_t)> fnPCIeStatusFiber2xReceiver
Definition: CArcPCIe.h:548
std::function< bool(const std::uint32_t)> fnPCIeStatusImageReadTimeOut
Definition: CArcPCIe.h:536
std::function< bool(const std::uint32_t)> fnPCIeStatusFiberBConnected
Definition: CArcPCIe.h:560
std::function< bool(const std::uint32_t)> fnPCIeStatusCmdSent
Definition: CArcPCIe.h:530
std::function< bool(const std::uint32_t)> fnPCIeStatusFiberAConnected
Definition: CArcPCIe.h:554
std::function< bool(const std::uint32_t)> fnPCIeStatusReplyRecvd
Definition: CArcPCIe.h:506