obs-studio/build_dependencies/aja/include/ajalibraries/ajantv2/includes/ntv2mbcontroller.h

186 lines
4.7 KiB
C
Raw Normal View History

2023-03-04 18:33:16 +01:00
/* SPDX-License-Identifier: MIT */
/**
@file ntv2mbcontroller.h
@brief Declares the CNTV2MBController class.
@copyright (C) 2015-2021 AJA Video Systems, Inc. All rights reserved.
**/
#ifndef NTV2MBCONTROLLER_H
#define NTV2MBCONTROLLER_H
#include "ntv2card.h"
#include "ntv2mailbox.h"
#include <iostream>
#include <vector>
enum eMBCmd
{
MB_CMD_SET_NET = 0,
MB_CMD_GET_MAC_FROM_ARP_TABLE = 3,
MB_CMD_SEND_ARP_REQ = 4,
MB_CMD_UNKNOWN = 5,
MB_CMD_SET_IGMP_VERSION = 6,
MB_CMD_FETCH_GM_INFO = 7,
MB_CMD_TAKE_SDP = 8,
MB_CMD_FETCH_SDP = 9,
MB_CMD_DISABLE_NET_IF = 10,
MB_CMD_FETCH_SFP_INFO = 11,
MB_CMD_SET_LLDP_INFO = 12,
MB_CMD_GET_LLDP_INFO = 13
};
enum eNTV2PacketInterval
{
PACKET_INTERVAL_125uS,
PACKET_INTERVAL_1mS
};
enum eSFP
{
SFP_1,
SFP_2,
SFP_MAX_NUM_SFPS,
SFP_INVALID = SFP_MAX_NUM_SFPS
};
#define NTV2_IS_VALID_SFP(__sfp__) (((__sfp__) >= SFP_1) && ((__sfp__) < SFP_INVALID))
enum eArpState
{
ARP_ERROR,
ARP_VALID,
ARP_INCOMPLETE,
ARP_NOT_FOUND
};
typedef enum
{
eIGMPVersion_2,
eIGMPVersion_3,
eIGMPVersion_Default = eIGMPVersion_3
} eIGMPVersion_t;
typedef struct
{
uint8_t mac[6];
} MACAddr;
typedef struct
{
uint8_t data[64];
} SFPMSAData;
struct SFPStatus
{
bool SFP_present; // true indicates SFP plugged in
bool SFP_rxLoss; // true indicates loss of signal
bool SFP_txFault; // true indicates tx fault
bool SFP_linkUp; // true indicates link is up
};
typedef enum
{
PTP_NO_PTP,
PTP_ERROR,
PTP_NOT_LOCKED,
PTP_LOCKING,
PTP_LOCKED
} PTPLockStatus;
struct PTPStatus
{
uint8_t PTP_gmId[8]; // GrandMasterID
uint8_t PTP_masterId[8]; // MasterID
PTPLockStatus PTP_LockedState; // locked state
};
// IGMP Control Block
#define IGMPCB_REG_STATE 0
#define IGMPCB_REG_MCAST_ADDR 1
#define IGMPCB_REG_SRC_ADDR 2
#define IGMPCB_SIZE 3
#define IGMPCB_STATE_USED BIT(0)
#define IGMPCB_STATE_ENABLED BIT(1)
#define IGMPCB_STATE_BUSY BIT(31) // ignore when busy
#define S2022_LINK_A_ACTIVE BIT(31)
#define S2022_LINK_B_ACTIVE BIT(30)
#define S2022_DUAL_LINK BIT(29)
class IPVNetConfig
{
public:
IPVNetConfig() { init(); }
void init();
bool operator == ( const IPVNetConfig &other );
bool operator != ( const IPVNetConfig &other );
uint32_t ipc_ip;
uint32_t ipc_subnet;
uint32_t ipc_gateway;
};
class AJAExport CNTV2MBController : public CNTV2MailBox
{
public:
CNTV2MBController(CNTV2Card & device);
protected:
// all these methods block until response received or timeout
bool SetMBNetworkConfiguration(eSFP port, std::string ipaddr, std::string netmask,std::string gateway);
bool DisableNetworkInterface(eSFP port);
bool GetRemoteMAC(std::string remote_IPAddress, eSFP port, NTV2Stream stream, std::string & MACaddress);
bool SetIGMPVersion(uint32_t version);
void SetIGMPGroup(eSFP port, NTV2Stream stream, uint32_t mcast_addr, uint32_t src_addr, bool enable);
void UnsetIGMPGroup(eSFP port, NTV2Stream stream);
void EnableIGMPGroup(eSFP port, NTV2Stream stream, bool enable);
bool SetTxLinkState(NTV2Channel channel, bool sfp1Enable, bool sfp2Enable);
bool GetTxLinkState(NTV2Channel channel, bool & sfp1Enable, bool & sfp2Enable);
bool SetRxLinkState(NTV2Channel channel, bool sfp1Enable, bool sfp2Enable);
bool GetRxLinkState(NTV2Channel channel, bool & sfp1Enable, bool & sfp2Enable);
bool SetDualLinkMode(bool enable);
bool GetDualLinkMode(bool & enable);
bool SetRxMatch(NTV2Channel channel, eSFP link, uint8_t match);
bool GetRxMatch(NTV2Channel channel, eSFP link, uint8_t & match);
bool SetSFPActive(eSFP sfp);
bool SetSFPInactive(eSFP sfp);
bool GetSFPActive(eSFP sfp);
bool SetTxFormat(NTV2Channel chan, NTV2VideoFormat fmt);
bool GetTxFormat(NTV2Channel chan, NTV2VideoFormat & fmt);
uint64_t GetNTPTimestamp();
bool PushSDP(std::string filename, std::stringstream & sdpstream);
bool GetSDP(std::string url, std::string & sdp);
bool GetSFPInfo(eSFP port, SFPMSAData & sfpdata);
bool SetLLDPInfo(std::string sysname);
bool GetLLDPInfo(std::string &chassisId0, std::string &portId0,
std::string &chassisId1, std::string &portId1);
private:
eArpState GetRemoteMACFromArpTable(std::string remote_IPAddress, eSFP port, NTV2Stream stream, std::string & MACaddress);
bool SendArpRequest(std::string remote_IPAddress, eSFP port);
void splitResponse(const std::string response, std::vector<std::string> & results);
bool getDecimal(const std::string & resp, const std::string & parm, uint32_t & result);
bool getHex(const std::string & resp, const std::string & parm, uint32_t &result);
bool getString(const std::string & resp, const std::string & parm, std::string & result);
uint32_t getIGMPCBOffset(eSFP port, NTV2Stream stream);
private:
};
#endif // NTV2MBCONTROLLER_H