legatt 32f4597c4d Base frontend module
- Naming style migrated to camel-case
- P7lib logger sources added
- Vcpkg manifest, CMake presets and build moved to root
- SDL2, Vulkan and RmlUi dependencies added
- Logger LOG macro added
- Logger  configuration
- SDL2 window configuration
- Vulkan configuration
- RmlUi configuration
- SDL event loop
2025-08-08 00:07:32 +03:00

224 lines
7.6 KiB
C++

////////////////////////////////////////////////////////////////////////////////
// /
// 2012-2020 (c) Baical /
// /
// This library is free software; you can redistribute it and/or /
// modify it under the terms of the GNU Lesser General Public /
// License as published by the Free Software Foundation; either /
// version 3.0 of the License, or (at your option) any later version. /
// /
// This library is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /
// Lesser General Public License for more details. /
// /
// You should have received a copy of the GNU Lesser General Public /
// License along with this library. /
// /
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// This file provide trace functionality /
////////////////////////////////////////////////////////////////////////////////
#ifndef TELEMETRY_H
#define TELEMETRY_H
////////////////////////////////////////////////////////////////////////////////
//CP7Tel_Counter
class CP7Tel_Counter
{
private:
tBOOL m_bInitialized;
public:
tXCHAR *m_pName;
tBOOL m_bDelivered;
sP7Tel_Counter_v2 *m_pHeader;
tUINT16 m_wSeqN;
tUINT32 m_uHash;
CP7Tel_Counter *pTreeNext;
CP7Tel_Counter(tUINT16 i_wID,
tUINT8 i_bOn,
tDOUBLE i_dbMin,
tDOUBLE i_dbAlarmMin,
tDOUBLE i_dbMax,
tDOUBLE i_dbAlarmMax,
const tXCHAR *i_pName,
tUINT32 i_uHash
);
~CP7Tel_Counter();
static tUINT32 Get_Hash(const tXCHAR *i_pName);
tBOOL Has_Name(const tXCHAR *i_pName);
tBOOL Is_Initialized();
void Enable(tUINT16 i_wOn);
};//CP7Tel_Counter
////////////////////////////////////////////////////////////////////////////////
//sCounterMap
struct sCounterMap
{
CP7Tel_Counter *pCounter;
sCounterMap(CP7Tel_Counter *i_pCounter)
: pCounter(i_pCounter)
{
}
~sCounterMap()
{
pCounter = NULL;
}
};//sCounterMap
////////////////////////////////////////////////////////////////////////////////
//CCounters_Tree
class CCounters_Tree:
public CRBTree<sCounterMap*, tUINT32>
{
public:
CCounters_Tree()
: CRBTree<sCounterMap*, tUINT32>(16, TRUE)
{
}
protected:
////////////////////////////////////////////////////////////////////////////
//Return
//TRUE - if (i_pKey < i_pData::key)
//FALSE - otherwise
tBOOL Is_Key_Less(tUINT32 i_uKey, sCounterMap *i_pData)
{
return (i_uKey < i_pData->pCounter->m_uHash) ? TRUE : FALSE;
}
////////////////////////////////////////////////////////////////////////////
//Return
//TRUE - if (i_pKey == i_pData::key)
//FALSE - otherwise
tBOOL Is_Qual(tUINT32 i_uKey, sCounterMap *i_pData)
{
return (i_uKey == i_pData->pCounter->m_uHash) ? TRUE : FALSE;
}
};//CCounters_Tree
////////////////////////////////////////////////////////////////////////////////
//CP7Telemetry
class CP7Telemetry
: public IP7_Telemetry
{
//put volatile variables at the top, to obtain 32 bit alignment.
//Project has 8 bytes alignment by default
tINT32 volatile m_lReference;
IP7_Client *m_pClient;
tUINT32 m_dwChannel_ID;
tBOOL m_bInitialized;
tBOOL m_bActive;
tLOCK m_sCS;
sP7Tel_Info m_sHeader_Info;
sP7Tel_Utc_Offs_V2 m_sHeader_Utc;
sP7Tel_Value_v2 m_sValue;
CCounters_Tree m_cCounters_Map;
CBList<CP7Tel_Counter*> m_pCounters;
tBOOL m_bIsHeaderDelivered;
sP7C_Status m_sStatus;
sP7C_Data_Chunk *m_pChunks;
tUINT32 m_dwChunks_Max_Count;
tBOOL m_bIs_Channel;
CShared::hShared m_hShared;
stTelemetry_Conf m_sConf;
CMEvent m_cOnConnect_Event;
tBOOL m_bOnConnect_Thread;
CThShell::tTHREAD m_hOnConnect_Thread;
public:
CP7Telemetry(IP7_Client *i_pClient, const tXCHAR *i_pName, const stTelemetry_Conf *i_pConf);
virtual ~CP7Telemetry();
tBOOL Is_Initialized();
//IP7C_Channel--------------------------------------------------------------
IP7C_Channel::eType Get_Type() { return IP7C_Channel::eTelemetry; }
void On_Init(sP7C_Channel_Info *i_pInfo);
void On_Receive(tUINT32 i_dwChannel, tUINT8 *i_pBuffer, tUINT32 i_dwSize, tBOOL i_bBigEndian);
void On_Status(tUINT32 i_dwChannel, const sP7C_Status *i_pStatus);
void On_Flush(tUINT32 i_dwChannel, tBOOL *io_pCrash);
virtual tINT32 Add_Ref()
{
return ATOMIC_INC(&m_lReference);
}
virtual tINT32 Release()
{
tINT32 l_lResult = ATOMIC_DEC(&m_lReference);
if ( 0 >= l_lResult )
{
delete this;
}
return l_lResult;
}
//IP7_Telemetry-------------------------------------------------------------
virtual tBOOL Create(const tXCHAR *i_pName,
tDOUBLE i_dbMin,
tDOUBLE i_dbAlarmMin,
tDOUBLE i_dbMax,
tDOUBLE i_dbAlarmMax,
tBOOL i_bOn,
tUINT16 *o_pID
);
virtual tBOOL Find(const tXCHAR *i_pName, tUINT16 *o_pID);
virtual tBOOL Add(tUINT16 i_bID, tDOUBLE i_llValue);
virtual tBOOL Set_Enable(tUINT16 i_wID, tBOOL i_bEnable);
virtual tBOOL Get_Enable(tUINT16 i_wID);
virtual tDOUBLE Get_Min(tUINT16 i_wID);
virtual tDOUBLE Get_Max(tUINT16 i_wID);
virtual const tXCHAR *Get_Name(tUINT16 i_wID);
virtual tUINT16 Get_Count();
virtual tBOOL Share(const tXCHAR *i_pName);
private:
void Flush();
static THSHELL_RET_TYPE THSHELL_CALL_TYPE Static_OnConnect_Routine(void *i_pContext)
{
CP7Telemetry *l_pRoutine = static_cast<CP7Telemetry *>(i_pContext);
if (l_pRoutine)
{
l_pRoutine->OnConnect_Routine();
}
CThShell::Cleanup();
return THSHELL_RET_OK;
}
void OnConnect_Routine();
};//CP7Telemetry
#endif //TELEMETRY_H