Define new protocol messages
This commit is contained in:
parent
70480cd626
commit
a7a1549fe5
2 changed files with 149 additions and 7 deletions
130
src/protocol.cpp
130
src/protocol.cpp
|
@ -153,6 +153,14 @@ MESSAGES (with connection)
|
||||||
| 1 byte licence type |
|
| 1 byte licence type |
|
||||||
+---------------------+
|
+---------------------+
|
||||||
|
|
||||||
|
- PROTMESSID_CLM_REQ_CHANNEL_LEVEL_LIST: Opt in or out of the channel level list
|
||||||
|
|
||||||
|
+---------------+
|
||||||
|
| 1 byte option |
|
||||||
|
+---------------+
|
||||||
|
|
||||||
|
option is boolean, true to opt in, false to opt out
|
||||||
|
|
||||||
|
|
||||||
// #### COMPATIBILITY OLD VERSION, TO BE REMOVED ####
|
// #### COMPATIBILITY OLD VERSION, TO BE REMOVED ####
|
||||||
- PROTMESSID_OPUS_SUPPORTED: Informs that OPUS codec is supported
|
- PROTMESSID_OPUS_SUPPORTED: Informs that OPUS codec is supported
|
||||||
|
@ -276,6 +284,27 @@ CONNECTION LESS MESSAGES
|
||||||
|
|
||||||
note: does not have any data -> n = 0
|
note: does not have any data -> n = 0
|
||||||
|
|
||||||
|
- PROTMESSID_CLM_CHANNEL_LEVEL_LIST: The channel level list
|
||||||
|
|
||||||
|
+----------------------------------+
|
||||||
|
| ( ( n + 1 ) / 2 ) * 4 bit values |
|
||||||
|
+----------------------------------+
|
||||||
|
|
||||||
|
n is number of connected clients
|
||||||
|
|
||||||
|
the values are the maximum channel levels for a client frame converted
|
||||||
|
to the range of CMultiColorLEDBar in 4 bits, two entries per byte
|
||||||
|
with the earlier channel in the lower half of the byte
|
||||||
|
|
||||||
|
where an odd number of clients is connected, there will be four unused
|
||||||
|
upper bits in the final byte, containing 0xF (which is out of range)
|
||||||
|
|
||||||
|
the server may compute them message when any client has used
|
||||||
|
PROTMESSID_CLM_REQ_CHANNEL_LEVEL_LIST to opt in
|
||||||
|
|
||||||
|
the server may issue to message only to a client that has used
|
||||||
|
PROTMESSID_CLM_REQ_CHANNEL_LEVEL_LIST to opt in
|
||||||
|
|
||||||
|
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*
|
*
|
||||||
|
@ -549,6 +578,10 @@ if ( rand() < ( RAND_MAX / 2 ) ) return false;
|
||||||
case PROTMESSID_LICENCE_REQUIRED:
|
case PROTMESSID_LICENCE_REQUIRED:
|
||||||
bRet = EvaluateLicenceRequiredMes ( vecbyMesBodyData );
|
bRet = EvaluateLicenceRequiredMes ( vecbyMesBodyData );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROTMESSID_REQ_CHANNEL_LEVEL_LIST:
|
||||||
|
bRet = EvaluateReqChannelLevelListMes ( vecbyMesBodyData );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// immediately send acknowledge message
|
// immediately send acknowledge message
|
||||||
|
@ -634,6 +667,10 @@ if ( rand() < ( RAND_MAX / 2 ) ) return false;
|
||||||
case PROTMESSID_CLM_REQ_CONN_CLIENTS_LIST:
|
case PROTMESSID_CLM_REQ_CONN_CLIENTS_LIST:
|
||||||
bRet = EvaluateCLReqConnClientsListMes ( InetAddr );
|
bRet = EvaluateCLReqConnClientsListMes ( InetAddr );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PROTMESSID_CLM_CHANNEL_LEVEL_LIST:
|
||||||
|
bRet = EvaluateCLChannelLevelListMes ( InetAddr, vecbyMesBodyData );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1234,6 +1271,40 @@ void CProtocol::CreateOpusSupportedMes()
|
||||||
CVector<uint8_t> ( 0 ) );
|
CVector<uint8_t> ( 0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CProtocol::CreateReqChannelLevelListMes ( const bool bRCL )
|
||||||
|
{
|
||||||
|
CVector<uint8_t> vecData ( 1 ); // 1 byte of data
|
||||||
|
int iPos = 0; // init position pointer
|
||||||
|
PutValOnStream ( vecData, iPos,
|
||||||
|
static_cast<uint32_t> ( bRCL ), 1 );
|
||||||
|
|
||||||
|
CreateAndSendMessage ( PROTMESSID_REQ_CHANNEL_LEVEL_LIST, vecData );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CProtocol::EvaluateReqChannelLevelListMes ( const CVector<uint8_t>& vecData )
|
||||||
|
{
|
||||||
|
int iPos = 0; // init position pointer
|
||||||
|
|
||||||
|
// check size
|
||||||
|
if ( vecData.Size() != 1 )
|
||||||
|
{
|
||||||
|
return true; // return error code
|
||||||
|
}
|
||||||
|
|
||||||
|
// extract opt in / out for channel levels
|
||||||
|
uint32_t val = GetValFromStream ( vecData, iPos, 1 );
|
||||||
|
|
||||||
|
if ( val != 0 && val != 1 )
|
||||||
|
{
|
||||||
|
return true; // return error code
|
||||||
|
}
|
||||||
|
|
||||||
|
// invoke message action
|
||||||
|
emit ReqChannelLevelList ( static_cast<bool> ( val ) );
|
||||||
|
|
||||||
|
return false; // no error
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Connection less messages ----------------------------------------------------
|
// Connection less messages ----------------------------------------------------
|
||||||
void CProtocol::CreateCLPingMes ( const CHostAddress& InetAddr, const int iMs )
|
void CProtocol::CreateCLPingMes ( const CHostAddress& InetAddr, const int iMs )
|
||||||
|
@ -1936,6 +2007,65 @@ bool CProtocol::EvaluateCLReqConnClientsListMes ( const CHostAddress& InetAddr )
|
||||||
return false; // no error
|
return false; // no error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CProtocol::CreateCLChannelLevelListMes ( const CHostAddress& InetAddr,
|
||||||
|
const CVector<uint16_t>& vecLevelList,
|
||||||
|
const int iNumClients )
|
||||||
|
{
|
||||||
|
// This must be a multiple of bytes at four bits per client
|
||||||
|
const int iNumBytes = ( iNumClients + 1 ) / 2;
|
||||||
|
CVector<uint8_t> vecData( iNumBytes );
|
||||||
|
int iPos = 0; // init position pointer
|
||||||
|
|
||||||
|
for ( int i = 0, j = 0; i < iNumClients; i += 2 /* pack two per byte */, j++ )
|
||||||
|
{
|
||||||
|
uint16_t levelLo = vecLevelList[i] & 0x0F;
|
||||||
|
uint16_t levelHi = ( i + 1 < iNumClients ) ? vecLevelList[i + 1] & 0x0F : 0x0F;
|
||||||
|
uint8_t byte = static_cast<uint8_t> ( levelLo | ( levelHi << 4 ) );
|
||||||
|
|
||||||
|
PutValOnStream ( vecData, iPos,
|
||||||
|
static_cast<uint32_t> ( byte ), 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateAndImmSendConLessMessage ( PROTMESSID_CLM_CHANNEL_LEVEL_LIST,
|
||||||
|
vecData,
|
||||||
|
InetAddr );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CProtocol::EvaluateCLChannelLevelListMes ( const CHostAddress& InetAddr,
|
||||||
|
const CVector<uint8_t>& vecData )
|
||||||
|
{
|
||||||
|
int iPos = 0; // init position pointer
|
||||||
|
const int iDataLen = vecData.Size(); // four bits per channel, 2 channels per byte
|
||||||
|
// may have one too many entries, last being 0xF
|
||||||
|
int iVecLen = iDataLen * 2; // one ushort per channel
|
||||||
|
|
||||||
|
CVector<uint16_t> vecLevelList ( iVecLen );
|
||||||
|
|
||||||
|
for (int i = 0, j = 0; i < iDataLen; i++, j += 2 )
|
||||||
|
{
|
||||||
|
uint8_t byte = static_cast<uint8_t> ( GetValFromStream ( vecData, iPos, 1 ) );
|
||||||
|
uint16_t levelLo = byte & 0x0F;
|
||||||
|
uint16_t levelHi = ( byte >> 4 ) & 0x0F;
|
||||||
|
|
||||||
|
vecLevelList[j] = levelLo;
|
||||||
|
|
||||||
|
if ( levelHi != 0x0F )
|
||||||
|
{
|
||||||
|
vecLevelList[j + 1] = levelHi;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vecLevelList.resize ( iVecLen - 1 );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// invoke message action
|
||||||
|
emit CLChannelLevelListReceived ( InetAddr, vecLevelList );
|
||||||
|
|
||||||
|
return false; // no error
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* Message generation and parsing *
|
* Message generation and parsing *
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#define PROTMESSID_CHANNEL_INFOS 25 // set channel infos
|
#define PROTMESSID_CHANNEL_INFOS 25 // set channel infos
|
||||||
#define PROTMESSID_OPUS_SUPPORTED 26 // tells that OPUS codec is supported
|
#define PROTMESSID_OPUS_SUPPORTED 26 // tells that OPUS codec is supported
|
||||||
#define PROTMESSID_LICENCE_REQUIRED 27 // licence required
|
#define PROTMESSID_LICENCE_REQUIRED 27 // licence required
|
||||||
|
#define PROTMESSID_REQ_CHANNEL_LEVEL_LIST 28 // request the channel level list
|
||||||
|
|
||||||
// message IDs of connection less messages (CLM)
|
// message IDs of connection less messages (CLM)
|
||||||
// DEFINITION -> start at 1000, end at 1999, see IsConnectionLessMessageID
|
// DEFINITION -> start at 1000, end at 1999, see IsConnectionLessMessageID
|
||||||
|
@ -71,6 +72,7 @@
|
||||||
#define PROTMESSID_CLM_REQ_VERSION_AND_OS 1012 // request version number and operating system
|
#define PROTMESSID_CLM_REQ_VERSION_AND_OS 1012 // request version number and operating system
|
||||||
#define PROTMESSID_CLM_CONN_CLIENTS_LIST 1013 // channel infos for connected clients
|
#define PROTMESSID_CLM_CONN_CLIENTS_LIST 1013 // channel infos for connected clients
|
||||||
#define PROTMESSID_CLM_REQ_CONN_CLIENTS_LIST 1014 // request the connected clients list
|
#define PROTMESSID_CLM_REQ_CONN_CLIENTS_LIST 1014 // request the connected clients list
|
||||||
|
#define PROTMESSID_CLM_CHANNEL_LEVEL_LIST 1015 // channel level list
|
||||||
|
|
||||||
// lengths of message as defined in protocol.cpp file
|
// lengths of message as defined in protocol.cpp file
|
||||||
#define MESS_HEADER_LENGTH_BYTE 7 // TAG (2), ID (2), cnt (1), length (2)
|
#define MESS_HEADER_LENGTH_BYTE 7 // TAG (2), ID (2), cnt (1), length (2)
|
||||||
|
@ -102,6 +104,7 @@ public:
|
||||||
void CreateReqNetwTranspPropsMes();
|
void CreateReqNetwTranspPropsMes();
|
||||||
void CreateLicenceRequiredMes ( const ELicenceType eLicenceType );
|
void CreateLicenceRequiredMes ( const ELicenceType eLicenceType );
|
||||||
void CreateOpusSupportedMes();
|
void CreateOpusSupportedMes();
|
||||||
|
void CreateReqChannelLevelListMes ( const bool bRCL );
|
||||||
|
|
||||||
void CreateCLPingMes ( const CHostAddress& InetAddr, const int iMs );
|
void CreateCLPingMes ( const CHostAddress& InetAddr, const int iMs );
|
||||||
void CreateCLPingWithNumClientsMes ( const CHostAddress& InetAddr,
|
void CreateCLPingWithNumClientsMes ( const CHostAddress& InetAddr,
|
||||||
|
@ -123,6 +126,9 @@ public:
|
||||||
void CreateCLConnClientsListMes ( const CHostAddress& InetAddr,
|
void CreateCLConnClientsListMes ( const CHostAddress& InetAddr,
|
||||||
const CVector<CChannelInfo>& vecChanInfo );
|
const CVector<CChannelInfo>& vecChanInfo );
|
||||||
void CreateCLReqConnClientsListMes ( const CHostAddress& InetAddr );
|
void CreateCLReqConnClientsListMes ( const CHostAddress& InetAddr );
|
||||||
|
void CreateCLChannelLevelListMes ( const CHostAddress& InetAddr,
|
||||||
|
const CVector<uint16_t>& vecLevelList,
|
||||||
|
const int iNumClients );
|
||||||
|
|
||||||
static bool ParseMessageFrame ( const CVector<uint8_t>& vecbyData,
|
static bool ParseMessageFrame ( const CVector<uint8_t>& vecbyData,
|
||||||
const int iNumBytesIn,
|
const int iNumBytesIn,
|
||||||
|
@ -216,6 +222,7 @@ protected:
|
||||||
bool EvaluateNetwTranspPropsMes ( const CVector<uint8_t>& vecData );
|
bool EvaluateNetwTranspPropsMes ( const CVector<uint8_t>& vecData );
|
||||||
bool EvaluateReqNetwTranspPropsMes();
|
bool EvaluateReqNetwTranspPropsMes();
|
||||||
bool EvaluateLicenceRequiredMes ( const CVector<uint8_t>& vecData );
|
bool EvaluateLicenceRequiredMes ( const CVector<uint8_t>& vecData );
|
||||||
|
bool EvaluateReqChannelLevelListMes ( const CVector<uint8_t>& vecData );
|
||||||
|
|
||||||
bool EvaluateCLPingMes ( const CHostAddress& InetAddr,
|
bool EvaluateCLPingMes ( const CHostAddress& InetAddr,
|
||||||
const CVector<uint8_t>& vecData );
|
const CVector<uint8_t>& vecData );
|
||||||
|
@ -236,6 +243,8 @@ protected:
|
||||||
bool EvaluateCLConnClientsListMes ( const CHostAddress& InetAddr,
|
bool EvaluateCLConnClientsListMes ( const CHostAddress& InetAddr,
|
||||||
const CVector<uint8_t>& vecData );
|
const CVector<uint8_t>& vecData );
|
||||||
bool EvaluateCLReqConnClientsListMes ( const CHostAddress& InetAddr );
|
bool EvaluateCLReqConnClientsListMes ( const CHostAddress& InetAddr );
|
||||||
|
bool EvaluateCLChannelLevelListMes ( const CHostAddress& InetAddr,
|
||||||
|
const CVector<uint8_t>& vecData );
|
||||||
|
|
||||||
int iOldRecID;
|
int iOldRecID;
|
||||||
int iOldRecCnt;
|
int iOldRecCnt;
|
||||||
|
@ -270,6 +279,7 @@ signals:
|
||||||
void NetTranspPropsReceived ( CNetworkTransportProps NetworkTransportProps );
|
void NetTranspPropsReceived ( CNetworkTransportProps NetworkTransportProps );
|
||||||
void ReqNetTranspProps();
|
void ReqNetTranspProps();
|
||||||
void LicenceRequired ( ELicenceType eLicenceType );
|
void LicenceRequired ( ELicenceType eLicenceType );
|
||||||
|
void ReqChannelLevelList ( bool bOptIn );
|
||||||
|
|
||||||
void CLPingReceived ( CHostAddress InetAddr,
|
void CLPingReceived ( CHostAddress InetAddr,
|
||||||
int iMs );
|
int iMs );
|
||||||
|
@ -291,4 +301,6 @@ signals:
|
||||||
void CLConnClientsListMesReceived ( CHostAddress InetAddr,
|
void CLConnClientsListMesReceived ( CHostAddress InetAddr,
|
||||||
CVector<CChannelInfo> vecChanInfo );
|
CVector<CChannelInfo> vecChanInfo );
|
||||||
void CLReqConnClientsList ( CHostAddress InetAddr );
|
void CLReqConnClientsList ( CHostAddress InetAddr );
|
||||||
|
void CLChannelLevelListReceived ( CHostAddress InetAddr,
|
||||||
|
CVector<uint16_t> vecLevelList );
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue