obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2mailbox.h
Ward Nakchbandi b48576284b first commit
2023-03-04 20:33:16 +03:00

109 lines
2.9 KiB
C++

/* SPDX-License-Identifier: MIT */
/**
@file ntv2mailbox.h
@brief Declares the CNTV2MailBox class.
@copyright (C) 2014-2021 AJA Video Systems, Inc. All rights reserved.
**/
#ifndef CNTV2MAILBOX_H
#define CNTV2MAILBOX_H
#include "ntv2card.h"
#include "ntv2enums.h"
#include "ntv2registers2022.h"
#include <stdint.h>
#define MB_tWRDATA 0 // 0x00
#define MB_tRDDATA 2 // 0x08
#define MB_tSTATUS 4 // 0x10
#define MB_tERROR 5 // 0x14
#define MB_tSIT 6 // 0x18 // send interrupt threshold
#define MB_tRIT 6 // 0x18 // receive interrupt threshold
#define MB_tIS 8 // 0x20 // interrupt status register
#define MB_tIE 9 // 0x24 // interrupt enable register
#define MB_tIP 10 // 0x28 // interrupt pending register
#define MBS_RX_EMPTY BIT(0)
#define MBS_TX_FULL BIT(1)
#define MBS_SEND_LT_TA BIT(2) // send level <= SIT
#define MBS_RCV_GT_TA BIT(3) // receive level > RIT
#define MBE_RX_EMPTY BIT(1)
#define MBE_TX_FULL BIT(2)
#define MB_RX_INT BIT(1)
#define FIFO_SIZE 1024 // 32-bit words
#define MB_TIMEOUT 50 // milliseconds
#define SEQNUM_MIN 1
#define SEQNUM_MAX 500
class AJAExport CNTV2MailBox
{
public:
CNTV2MailBox(CNTV2Card & device);
~CNTV2MailBox();
bool sendMsg(char * msg, uint32_t timeout); // returns response
bool sendMsg(uint32_t timeout);
void getError(std::string & error);
void getResponse(std::string & response);
bool WriteChannelRegister (ULWord reg, ULWord value, ULWord mask = 0xFFFFFFFF, ULWord shift = 0x0);
bool ReadChannelRegister (const ULWord inReg, ULWord & outValue, const ULWord inMask = 0xFFFFFFFF, const ULWord inShift = 0x0);
inline bool ReadChannelRegister (ULWord inReg, ULWord *pOutValue, ULWord mask = 0xFFFFFFFF, ULWord shift = 0x0) {return pOutValue ? ReadChannelRegister (inReg, *pOutValue, mask, shift) : false;}
void SetChannel(ULWord channelOffset, ULWord channelNumber);
bool AcquireMailbox();
void ReleaseMailbox();
protected:
bool rcvMsg(uint32_t timeout);
bool writeMB(uint32_t val, uint32_t timeout = MB_TIMEOUT);
bool readMB(uint32_t & val, uint32_t timeout = MB_TIMEOUT);
bool waitSOM(uint32_t timeout);
bool waitRxReady(uint32_t timeout);
bool waitTxReady(uint32_t timeout);
bool rxReady();
uint32_t getStatus();
uint32_t getFeatures();
CNTV2Card &mDevice;
NTV2IpError mIpErrorCode;
std::string mIpInternalErrorString;
private:
void startTimer();
uint64_t getElapsedTime();
int64_t getSystemCounter();
int64_t getSystemFrequency();
uint64_t getSystemMilliseconds();
uint32_t nextSeqNum() {if (++_seqNum > SEQNUM_MAX) return SEQNUM_MIN; else return _seqNum;}
uint32_t currentSeqNum() {return _seqNum;}
uint32_t chanOffset;
uint32_t chanNumber;
uint32_t bOffset; // base offset
protected:
uint32_t txBuf[FIFO_SIZE+1]; // CNTV2MBController needs access to this
private:
uint32_t rxBuf[FIFO_SIZE+1];
uint64_t _startTime;
uint32_t _seqNum;
};
#endif // CNTV2MAILBOX_H