public static TmServerFeatures GetTmServerFeatures(int tmCid) { var capabilitiesBuf = new byte[16]; if (Native.TmcGetServerCaps(tmCid, ref capabilitiesBuf) == 0) { return(TmServerFeatures.Empty); } return(new TmServerFeatures(IsCapabilityEnabled(capabilitiesBuf, TmNativeDefs.ServerCap.Comtrade), IsCapabilityEnabled(capabilitiesBuf, TmNativeDefs.ServerCap.MicroSeries), IsImpulseArchiveEnabled(), AreTechObjectsEnabled())); bool IsCapabilityEnabled(byte[] capabilities, TmNativeDefs.ServerCap capability) { var capabilityByte = (byte)capability; return(((capabilities[capabilityByte / 8] >> (capabilityByte % 8)) & 1) > 0); } bool IsImpulseArchiveEnabled() { var stats = new TmNativeDefs.TM_AAN_STATS(); return(Native.TmcAanGetStats(tmCid, ref stats, 0)); } bool AreTechObjectsEnabled() { return(true); var tobPtr = Native.TmcTechObjEnumValues(tmCid, uint.MaxValue, uint.MaxValue, IntPtr.Zero, out var count); if (tobPtr == IntPtr.Zero) { return(false); } Native.TmcFreeMemory(tobPtr); return(count > 0); } }