Files
front_linux/LFtid1056/pqdif_semantic_ids.h

348 lines
12 KiB
C
Raw Normal View History

#pragma once
#include <cstdint>
#include <cstddef>
#include <string>
#include <unordered_map>
#include <vector>
#include <cstring>
#include "pqdif/include/pqdif_ph.h"
#include "pqdif/include/pqdif_id.h"
namespace pqdif_sem
{
// ============================================================================
// ˵<><CBB5>
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD><CDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB1A3>ԭʼ<D4AD>ֶ<EFBFBD>ֵ<EFBFBD><D6B5>UINT4 / GUID<49><44>
// ӳ<><D3B3><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼֵ<CABC><D6B5><EFBFBD>ͳɡ<CDB3><C9A1><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ============================================================================
// ------------------------------
// GUID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ------------------------------
inline bool GuidEqual(const GUID& a, const GUID& b)
{
return std::memcmp(&a, &b, sizeof(GUID)) == 0;
}
struct GuidHash
{
std::size_t operator()(const GUID& g) const noexcept
{
const unsigned char* p = reinterpret_cast<const unsigned char*>(&g);
std::size_t h = 1469598103934665603ull; // FNV-1a <20><><EFBFBD><EFBFBD>
for (std::size_t i = 0; i < sizeof(GUID); ++i)
{
h ^= static_cast<std::size_t>(p[i]);
h *= 1099511628211ull;
}
return h;
}
};
std::string GuidToString(const GUID& g);
// ============================================================================
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID ö<>٣<EFBFBD><D9A3><EFBFBD>Դ<EFBFBD><D4B4>PDF <20><> B.2 / B.3 / B.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pqdif_id.h <20><><EFBFBD>к궨<D0BA>
// ============================================================================
// ------------------------------
// 1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagPhaseID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
// ------------------------------
enum class PhaseId : uint32_t
{
None = ID_PHASE_NONE,
AN = ID_PHASE_AN,
BN = ID_PHASE_BN,
CN = ID_PHASE_CN,
NG = ID_PHASE_NG,
AB = ID_PHASE_AB,
BC = ID_PHASE_BC,
CA = ID_PHASE_CA,
RES = ID_PHASE_RES,
NET = ID_PHASE_NET,
Total = ID_PHASE_TOTAL,
LnAve = ID_PHASE_LN_AVE,
LlAve = ID_PHASE_LL_AVE,
Worst = ID_PHASE_WORST,
Plus = ID_PHASE_PLUS,
Minus = ID_PHASE_MINUS,
General1 = ID_PHASE_GENERAL_1,
General2 = ID_PHASE_GENERAL_2,
General3 = ID_PHASE_GENERAL_3,
General4 = ID_PHASE_GENERAL_4,
General5 = ID_PHASE_GENERAL_5,
General6 = ID_PHASE_GENERAL_6,
General7 = ID_PHASE_GENERAL_7,
General8 = ID_PHASE_GENERAL_8,
General9 = ID_PHASE_GENERAL_9,
General10 = ID_PHASE_GENERAL_10,
General11 = ID_PHASE_GENERAL_11,
General12 = ID_PHASE_GENERAL_12,
General13 = ID_PHASE_GENERAL_13,
General14 = ID_PHASE_GENERAL_14,
General15 = ID_PHASE_GENERAL_15,
General16 = ID_PHASE_GENERAL_16
};
// ------------------------------
// 2) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagQuantityMeasuredID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD>û<EFBFBD><C3BB> Frequency<63><79>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> characteristic <20><><EFBFBD>
// ------------------------------
enum class QuantityMeasuredId : uint32_t
{
None = ID_QM_NONE,
Voltage = ID_QM_VOLTAGE,
Current = ID_QM_CURRENT,
Power = ID_QM_POWER,
Energy = ID_QM_ENERGY,
Temperature = ID_QM_TEMPERATURE,
Pressure = ID_QM_PRESSURE,
Charge = ID_QM_CHARGE,
EField = ID_QM_EFIELD,
MField = ID_QM_MFIELD,
Velocity = ID_QM_VELOCITY,
Bearing = ID_QM_BEARING,
Force = ID_QM_FORCE,
Torque = ID_QM_TORQUE,
Position = ID_QM_POSITION,
FluxLinkage = ID_QM_FLUXLINKAGE,
FluxDensity = ID_QM_FLUXDENSITY,
Status = ID_QM_STATUS
};
// ------------------------------
// 3) <20><>λ<EFBFBD><CEBB>tagQuantityUnitsID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
// ------------------------------
enum class QuantityUnitsId : uint32_t
{
None = ID_QU_NONE,
Timestamp = ID_QU_TIMESTAMP,
Seconds = ID_QU_SECONDS,
Cycles = ID_QU_CYCLES,
Volts = ID_QU_VOLTS,
Amps = ID_QU_AMPS,
VA = ID_QU_VA,
Watts = ID_QU_WATTS,
Vars = ID_QU_VARS,
Ohms = ID_QU_OHMS,
Siemens = ID_QU_SIEMENS,
VoltsPerAmp = ID_QU_VOLTSPERAMP,
Joules = ID_QU_JOULES,
Hertz = ID_QU_HERTZ,
Celcius = ID_QU_CELCIUS,
Degrees = ID_QU_DEGREES,
Db = ID_QU_DB,
Percent = ID_QU_PERCENT,
PerUnit = ID_QU_PERUNIT,
Samples = ID_QU_SAMPLES,
VarHours = ID_QU_VARHOURS,
WattHours = ID_QU_WATTHOURS,
VaHours = ID_QU_VAHOURS,
Mps = ID_QU_MPS,
Mph = ID_QU_MPH,
Bars = ID_QU_BARS,
Pascals = ID_QU_PASCALS,
Newtons = ID_QU_NEWTONS,
NewtonMeters = ID_QU_NEWTONMETERS,
Rpm = ID_QU_RPM,
RadPerSec = ID_QU_RADPERSEC,
Meters = ID_QU_METERS,
WeberTurns = ID_QU_WEBERTURNS,
Teslas = ID_QU_TESLAS,
Webers = ID_QU_WEBERS,
VoltsPerVolt = ID_QU_VOLTSPERVOLT,
AmpsPerAmp = ID_QU_AMPSPERAMP,
AmpsPerVolt = ID_QU_AMPSPERVOLT
};
// ------------------------------
// 4) <20><><EFBFBD>д洢<D0B4><E6B4A2>ʽ<EFBFBD><CABD>tagStorageMethodID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
// ------------------------------
enum class StorageMethodId : uint32_t
{
Values = ID_SERIES_METHOD_VALUES,
Scaled = ID_SERIES_METHOD_SCALED,
Increment = ID_SERIES_METHOD_INCREMENT
};
// ------------------------------
// 5) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>tagTriggerMethodID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> UINT4
// <20><>Դ<EFBFBD><D4B4>PDF <20><> B.3 / B.4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>pqdif/include/pqdif_id.h
// ------------------------------
enum class TriggerMethodId : uint32_t
{
None = ID_TRIGGER_METH_NONE,
Channel = ID_TRIGGER_METH_CHANNEL,
Periodic = ID_TRIGGER_METH_PERIODIC,
External = ID_TRIGGER_METH_EXTERNAL,
PeriodicStats = ID_TRIGGER_METH_PERIODIC_STATS
};
// ============================================================================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
// ============================================================================
struct UIntSemanticEntry
{
uint32_t raw_value; // ԭʼ UINT4 ֵ
const char* standard_name; // <20><>׼<EFBFBD><D7BC><>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID_PHASE_AN
const char* display_name; // <20><><EFBFBD><EFBFBD>չʾ<D5B9><CABE>
const char* source_tag; // <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>׼<EFBFBD>ֶΣ<D6B6><CEA3><EFBFBD><EFBFBD><EFBFBD> tagPhaseID
const char* comment; // <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
};
// ============================================================================
// <20><><EFBFBD><EFBFBD>GUID <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> GUID ֵ<><D6B5><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pqdif_id.h <20><><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><EFBFBD>ܻ<EFBFBD><DCBB>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD> pqdif ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>
// ============================================================================
enum class GuidSemanticField
{
QuantityType, // tagQuantityTypeID
ValueType, // tagValueTypeID
QuantityCharacteristic, // tagQuantityCharacteristicID
DisturbanceCategory // tagDisturbanceCategoryID
};
struct GuidSemanticEntry
{
GUID raw_guid; // ԭʼ GUID ֵ
GuidSemanticField field; // <20><><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
const char* standard_name; // <20><>׼<EFBFBD><D7BC><>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID_QT_VALUELOG
const char* display_name; // <20><><EFBFBD><EFBFBD>չʾ<D5B9><CABE>
const char* source_tag; // <20><>Ӧ<EFBFBD>ı<EFBFBD>׼<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>
const char* comment; // <20><><EFBFBD><EFBFBD>˵<EFBFBD><CBB5>
};
// ============================================================================
// <20>ġ<EFBFBD><C4A1>̶<EFBFBD><CCB6><EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݹ̶<DDB9><CCB6><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>̶<EFBFBD><CCB6><EFBFBD>registry ֻ<>Dz<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ============================================================================
extern const UIntSemanticEntry kPhaseTable[];
extern const std::size_t kPhaseTableSize;
extern const UIntSemanticEntry kQuantityMeasuredTable[];
extern const std::size_t kQuantityMeasuredTableSize;
extern const UIntSemanticEntry kQuantityUnitsTable[];
extern const std::size_t kQuantityUnitsTableSize;
extern const UIntSemanticEntry kStorageMethodTable[];
extern const std::size_t kStorageMethodTableSize;
extern const UIntSemanticEntry kTriggerMethodTable[];
extern const std::size_t kTriggerMethodTableSize;
extern const GuidSemanticEntry kQuantityTypeTable[];
extern const std::size_t kQuantityTypeTableSize;
extern const GuidSemanticEntry kValueTypeTable[];
extern const std::size_t kValueTypeTableSize;
extern const GuidSemanticEntry kQuantityCharacteristicTable[];
extern const std::size_t kQuantityCharacteristicTableSize;
extern const GuidSemanticEntry kDisturbanceCategoryTable[];
extern const std::size_t kDisturbanceCategoryTableSize;
// ============================================================================
// <20><EFBFBD><E5A1A2>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>
// ============================================================================
const UIntSemanticEntry* FindUIntSemantic(
const UIntSemanticEntry* table,
std::size_t table_size,
uint32_t raw_value);
const UIntSemanticEntry* FindPhase(uint32_t raw_value);
const UIntSemanticEntry* FindQuantityMeasured(uint32_t raw_value);
const UIntSemanticEntry* FindQuantityUnits(uint32_t raw_value);
const UIntSemanticEntry* FindStorageMethod(uint32_t raw_value);
const UIntSemanticEntry* FindTriggerMethod(uint32_t raw_value);
std::string FindPhaseName(uint32_t raw_value);
std::string FindQuantityMeasuredName(uint32_t raw_value);
std::string FindQuantityUnitsName(uint32_t raw_value);
std::string FindStorageMethodName(uint32_t raw_value);
std::string FindStorageMethodFlagsName(uint32_t raw_value);
std::string FindTriggerMethodName(uint32_t raw_value);
// ============================================================================
// <20><><EFBFBD><EFBFBD>GUID ע<><D7A2><EFBFBD><EFBFBD>
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD>ݹ̶<DDB9><CCB6><EFBFBD>registry ֻ<>ǰѹ̶<D1B9><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF>ٲ<EFBFBD>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ============================================================================
class GuidSemanticRegistry
{
public:
GuidSemanticRegistry();
const GuidSemanticEntry* Find(GuidSemanticField field, const GUID& raw_guid) const;
std::string FindName(GuidSemanticField field, const GUID& raw_guid, const char* fallback = "UNKNOWN_GUID") const;
private:
struct Key
{
GuidSemanticField field;
GUID guid;
};
struct KeyHash
{
std::size_t operator()(const Key& k) const noexcept
{
std::size_t h1 = std::hash<int>{}(static_cast<int>(k.field));
std::size_t h2 = GuidHash{}(k.guid);
return h1 ^ (h2 << 1);
}
};
struct KeyEq
{
bool operator()(const Key& a, const Key& b) const noexcept
{
return a.field == b.field && GuidEqual(a.guid, b.guid);
}
};
std::unordered_map<Key, const GuidSemanticEntry*, KeyHash, KeyEq> map_;
};
const GuidSemanticRegistry& GetGuidSemanticRegistry();
// ============================================================================
// <20>ߡ<EFBFBD>ͳ<EFBFBD><CDB3>ӳ<EFBFBD><EFBFBD><E4B3A3> helper
// ----------------------------------------------------------------------------
// <20><><EFBFBD><EFBFBD>ֻ<EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>Դ<EFBFBD>Ҷ<EFBFBD>ͳ<EFBFBD><CDB3>ӳ<EFBFBD><EFBFBD>á<EFBFBD><C3A1><EFBFBD><EFBFBD>жϡ<D0B6>
// <20><><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD> helper<65><72>
// ============================================================================
bool IsQuantityTypeValueLog(const GUID& raw_guid);
bool IsValueTypeTime(const GUID& raw_guid);
bool IsValueTypeVal(const GUID& raw_guid);
bool IsValueTypeMin(const GUID& raw_guid);
bool IsValueTypeMax(const GUID& raw_guid);
bool IsValueTypeAvg(const GUID& raw_guid);
bool IsValueTypeInterval(const GUID& raw_guid);
bool IsCharacteristicFrequency(const GUID& raw_guid);
bool IsCharacteristicRms(const GUID& raw_guid);
bool IsCharacteristicTotalThd(const GUID& raw_guid);
bool IsUnitHertz(uint32_t raw_value);
bool IsTriggerPeriodicStats(uint32_t raw_value);
} // namespace pqdif_sem#pragma once