mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #5501 from FearlessTobi/port-1064-3948
Port yuzu-emu/yuzu#1064 and yuzu-emu/yuzu#3948: Changes to Telemetry and CPU feature detection
This commit is contained in:
		
						commit
						9ff97270cf
					
				
					 17 changed files with 137 additions and 89 deletions
				
			
		|  | @ -382,7 +382,7 @@ int main(int argc, char** argv) { | |||
|         break; // Expected case
 | ||||
|     } | ||||
| 
 | ||||
|     system.TelemetrySession().AddField(Telemetry::FieldType::App, "Frontend", "SDL"); | ||||
|     system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); | ||||
| 
 | ||||
|     if (use_multiplayer) { | ||||
|         if (auto member = Network::GetRoomMember().lock()) { | ||||
|  |  | |||
|  | @ -52,7 +52,8 @@ void CompatDB::Submit() { | |||
|         back(); | ||||
|         LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId()); | ||||
|         Core::System::GetInstance().TelemetrySession().AddField( | ||||
|             Telemetry::FieldType::UserFeedback, "Compatibility", compatibility->checkedId()); | ||||
|             Common::Telemetry::FieldType::UserFeedback, "Compatibility", | ||||
|             compatibility->checkedId()); | ||||
| 
 | ||||
|         button(NextButton)->setEnabled(false); | ||||
|         button(NextButton)->setText(tr("Submitting")); | ||||
|  |  | |||
|  | @ -190,7 +190,20 @@ GMainWindow::GMainWindow() | |||
|     LOG_INFO(Frontend, "Citra Version: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, | ||||
|              Common::g_scm_desc); | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
|     LOG_INFO(Frontend, "Host CPU: {}", Common::GetCPUCaps().cpu_string); | ||||
|     const auto& caps = Common::GetCPUCaps(); | ||||
|     std::string cpu_string = caps.cpu_string; | ||||
|     if (caps.avx || caps.avx2 || caps.avx512) { | ||||
|         cpu_string += " | AVX"; | ||||
|         if (caps.avx512) { | ||||
|             cpu_string += "512"; | ||||
|         } else if (caps.avx2) { | ||||
|             cpu_string += '2'; | ||||
|         } | ||||
|         if (caps.fma || caps.fma4) { | ||||
|             cpu_string += " | FMA"; | ||||
|         } | ||||
|     } | ||||
|     LOG_INFO(Frontend, "Host CPU: {}", cpu_string); | ||||
| #endif | ||||
|     LOG_INFO(Frontend, "Host OS: {}", QSysInfo::prettyProductName().toStdString()); | ||||
|     UpdateWindowTitle(); | ||||
|  | @ -989,7 +1002,7 @@ bool GMainWindow::LoadROM(const QString& filename) { | |||
| 
 | ||||
|     game_path = filename; | ||||
| 
 | ||||
|     system.TelemetrySession().AddField(Telemetry::FieldType::App, "Frontend", "Qt"); | ||||
|     system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "Qt"); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,9 +3,16 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <cstring> | ||||
| #include "common/assert.h" | ||||
| #include "common/scm_rev.h" | ||||
| #include "common/telemetry.h" | ||||
| 
 | ||||
| namespace Telemetry { | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
| #include "common/x64/cpu_detect.h" | ||||
| #endif | ||||
| 
 | ||||
| namespace Common::Telemetry { | ||||
| 
 | ||||
| void FieldCollection::Accept(VisitorInterface& visitor) const { | ||||
|     for (const auto& field : fields) { | ||||
|  | @ -37,4 +44,48 @@ template class Field<std::string>; | |||
| template class Field<const char*>; | ||||
| template class Field<std::chrono::microseconds>; | ||||
| 
 | ||||
| } // namespace Telemetry
 | ||||
| void AppendBuildInfo(FieldCollection& fc) { | ||||
|     const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; | ||||
|     fc.AddField(FieldType::App, "Git_IsDirty", is_git_dirty); | ||||
|     fc.AddField(FieldType::App, "Git_Branch", Common::g_scm_branch); | ||||
|     fc.AddField(FieldType::App, "Git_Revision", Common::g_scm_rev); | ||||
|     fc.AddField(FieldType::App, "BuildDate", Common::g_build_date); | ||||
|     fc.AddField(FieldType::App, "BuildName", Common::g_build_name); | ||||
| } | ||||
| 
 | ||||
| void AppendCPUInfo(FieldCollection& fc) { | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSSE3", Common::GetCPUCaps().ssse3); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE41", Common::GetCPUCaps().sse4_1); | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2); | ||||
| #else | ||||
|     fc.AddField(FieldType::UserSystem, "CPU_Model", "Other"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void AppendOSInfo(FieldCollection& fc) { | ||||
| #ifdef __APPLE__ | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Apple"); | ||||
| #elif defined(_WIN32) | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Windows"); | ||||
| #elif defined(__linux__) || defined(linux) || defined(__linux) | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Linux"); | ||||
| #else | ||||
|     fc.AddField(FieldType::UserSystem, "OsPlatform", "Unknown"); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| } // namespace Common::Telemetry
 | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ | |||
| #include <string> | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
| namespace Telemetry { | ||||
| namespace Common::Telemetry { | ||||
| 
 | ||||
| /// Field type, used for grouping fields together in the final submitted telemetry log
 | ||||
| enum class FieldType : u8 { | ||||
|  | @ -55,8 +55,8 @@ public: | |||
|     Field(FieldType type, std::string name, T value) | ||||
|         : name(std::move(name)), type(type), value(std::move(value)) {} | ||||
| 
 | ||||
|     Field(const Field& other) = default; | ||||
|     Field& operator=(const Field& other) = default; | ||||
|     Field(const Field&) = default; | ||||
|     Field& operator=(const Field&) = default; | ||||
| 
 | ||||
|     Field(Field&&) = default; | ||||
|     Field& operator=(Field&& other) = default; | ||||
|  | @ -184,4 +184,16 @@ struct NullVisitor : public VisitorInterface { | |||
|     } | ||||
| }; | ||||
| 
 | ||||
| } // namespace Telemetry
 | ||||
| /// Appends build-specific information to the given FieldCollection,
 | ||||
| /// such as branch name, revision hash, etc.
 | ||||
| void AppendBuildInfo(FieldCollection& fc); | ||||
| 
 | ||||
| /// Appends CPU-specific information to the given FieldCollection,
 | ||||
| /// such as instruction set extensions, etc.
 | ||||
| void AppendCPUInfo(FieldCollection& fc); | ||||
| 
 | ||||
| /// Appends OS-specific information to the given FieldCollection,
 | ||||
| /// such as platform name, etc.
 | ||||
| void AppendOSInfo(FieldCollection& fc); | ||||
| 
 | ||||
| } // namespace Common::Telemetry
 | ||||
|  |  | |||
|  | @ -110,6 +110,11 @@ static CPUCaps Detect() { | |||
|                 caps.bmi1 = true; | ||||
|             if ((cpu_id[1] >> 8) & 1) | ||||
|                 caps.bmi2 = true; | ||||
|             // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP)
 | ||||
|             if ((cpu_id[1] >> 16) & 1 && (cpu_id[1] >> 28) & 1 && (cpu_id[1] >> 31) & 1 && | ||||
|                 (cpu_id[1] >> 17) & 1 && (cpu_id[1] >> 30) & 1) { | ||||
|                 caps.avx512 = caps.avx2; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,6 +18,7 @@ struct CPUCaps { | |||
|     bool sse4_2; | ||||
|     bool avx; | ||||
|     bool avx2; | ||||
|     bool avx512; | ||||
|     bool bmi1; | ||||
|     bool bmi2; | ||||
|     bool fma; | ||||
|  |  | |||
|  | @ -519,14 +519,13 @@ void System::RegisterImageInterface(std::shared_ptr<Frontend::ImageInterface> im | |||
| void System::Shutdown(bool is_deserializing) { | ||||
|     // Log last frame performance stats
 | ||||
|     const auto perf_results = GetAndResetPerfStats(); | ||||
|     telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_EmulationSpeed", | ||||
|     constexpr auto performance = Common::Telemetry::FieldType::Performance; | ||||
| 
 | ||||
|     telemetry_session->AddField(performance, "Shutdown_EmulationSpeed", | ||||
|                                 perf_results.emulation_speed * 100.0); | ||||
|     telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Framerate", | ||||
|                                 perf_results.game_fps); | ||||
|     telemetry_session->AddField(Telemetry::FieldType::Performance, "Shutdown_Frametime", | ||||
|                                 perf_results.frametime * 1000.0); | ||||
|     telemetry_session->AddField(Telemetry::FieldType::Performance, "Mean_Frametime_MS", | ||||
|                                 perf_stats->GetMeanFrametime()); | ||||
|     telemetry_session->AddField(performance, "Shutdown_Framerate", perf_results.game_fps); | ||||
|     telemetry_session->AddField(performance, "Shutdown_Frametime", perf_results.frametime * 1000.0); | ||||
|     telemetry_session->AddField(performance, "Mean_Frametime_MS", perf_stats->GetMeanFrametime()); | ||||
| 
 | ||||
|     // Shutdown emulation session
 | ||||
|     VideoCore::Shutdown(); | ||||
|  |  | |||
|  | @ -230,8 +230,8 @@ void Module::APTInterface::GetSharedFont(Kernel::HLERequestContext& ctx) { | |||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); | ||||
| 
 | ||||
|     // Log in telemetry if the game uses the shared font
 | ||||
|     apt->system.TelemetrySession().AddField(Telemetry::FieldType::Session, "RequiresSharedFont", | ||||
|                                             true); | ||||
|     apt->system.TelemetrySession().AddField(Common::Telemetry::FieldType::Session, | ||||
|                                             "RequiresSharedFont", true); | ||||
| 
 | ||||
|     if (!apt->shared_font_loaded) { | ||||
|         // On real 3DS, font loading happens on booting. However, we load it on demand to coordinate
 | ||||
|  |  | |||
|  | @ -199,7 +199,8 @@ ResultStatus AppLoader_NCCH::Load(std::shared_ptr<Kernel::Process>& process) { | |||
|     } | ||||
| 
 | ||||
|     auto& system = Core::System::GetInstance(); | ||||
|     system.TelemetrySession().AddField(Telemetry::FieldType::Session, "ProgramId", program_id); | ||||
|     system.TelemetrySession().AddField(Common::Telemetry::FieldType::Session, "ProgramId", | ||||
|                                        program_id); | ||||
| 
 | ||||
|     if (auto room_member = Network::GetRoomMember().lock()) { | ||||
|         Network::GameInfo game_info; | ||||
|  |  | |||
|  | @ -2,16 +2,13 @@ | |||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include <cryptopp/osrng.h> | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "common/scm_rev.h" | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
| #include "common/x64/cpu_detect.h" | ||||
| #endif | ||||
| #include "core/core.h" | ||||
| #include "core/settings.h" | ||||
| #include "core/telemetry_session.h" | ||||
|  | @ -23,6 +20,8 @@ | |||
| 
 | ||||
| namespace Core { | ||||
| 
 | ||||
| namespace Telemetry = Common::Telemetry; | ||||
| 
 | ||||
| static u64 GenerateTelemetryId() { | ||||
|     u64 telemetry_id{}; | ||||
|     CryptoPP::AutoSeededRandomPool rng; | ||||
|  | @ -117,46 +116,11 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { | |||
|     } | ||||
| 
 | ||||
|     // Log application information
 | ||||
|     const bool is_git_dirty{std::strstr(Common::g_scm_desc, "dirty") != nullptr}; | ||||
|     AddField(Telemetry::FieldType::App, "Git_IsDirty", is_git_dirty); | ||||
|     AddField(Telemetry::FieldType::App, "Git_Branch", Common::g_scm_branch); | ||||
|     AddField(Telemetry::FieldType::App, "Git_Revision", Common::g_scm_rev); | ||||
|     AddField(Telemetry::FieldType::App, "BuildDate", Common::g_build_date); | ||||
|     AddField(Telemetry::FieldType::App, "BuildName", Common::g_build_name); | ||||
|     Telemetry::AppendBuildInfo(field_collection); | ||||
| 
 | ||||
|     // Log user system information
 | ||||
| #ifdef ARCHITECTURE_x86_64 | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_BrandString", | ||||
|              Common::GetCPUCaps().brand_string); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSSE3", | ||||
|              Common::GetCPUCaps().ssse3); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE41", | ||||
|              Common::GetCPUCaps().sse4_1); | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Extension_x64_SSE42", | ||||
|              Common::GetCPUCaps().sse4_2); | ||||
| #else | ||||
|     AddField(Telemetry::FieldType::UserSystem, "CPU_Model", "Other"); | ||||
| #endif | ||||
| #ifdef __APPLE__ | ||||
|     AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Apple"); | ||||
| #elif defined(_WIN32) | ||||
|     AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Windows"); | ||||
| #elif defined(__linux__) || defined(linux) || defined(__linux) | ||||
|     AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Linux"); | ||||
| #else | ||||
|     AddField(Telemetry::FieldType::UserSystem, "OsPlatform", "Unknown"); | ||||
| #endif | ||||
|     Telemetry::AppendCPUInfo(field_collection); | ||||
|     Telemetry::AppendOSInfo(field_collection); | ||||
| 
 | ||||
|     // Log user configuration information
 | ||||
|     AddField(Telemetry::FieldType::UserConfig, "Audio_SinkId", Settings::values.sink_id); | ||||
|  |  | |||
|  | @ -53,7 +53,7 @@ public: | |||
|      * @param value Value for the field to add. | ||||
|      */ | ||||
|     template <typename T> | ||||
|     void AddField(Telemetry::FieldType type, const char* name, T value) { | ||||
|     void AddField(Common::Telemetry::FieldType type, const char* name, T value) { | ||||
|         field_collection.AddField(type, name, std::move(value)); | ||||
|     } | ||||
| 
 | ||||
|  | @ -64,7 +64,8 @@ public: | |||
|     bool SubmitTestcase(); | ||||
| 
 | ||||
| private: | ||||
|     Telemetry::FieldCollection field_collection; ///< Tracks all added fields for the session
 | ||||
|     /// Tracks all added fields for the session
 | ||||
|     Common::Telemetry::FieldCollection field_collection; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -1527,8 +1527,8 @@ vec4 secondary_fragment_color = vec4(0.0); | |||
|         // Blend the fog
 | ||||
|         out += "last_tex_env_out.rgb = mix(fog_color.rgb, last_tex_env_out.rgb, fog_factor);\n"; | ||||
|     } else if (state.fog_mode == TexturingRegs::FogMode::Gas) { | ||||
|         Core::System::GetInstance().TelemetrySession().AddField(Telemetry::FieldType::Session, | ||||
|                                                                 "VideoCore_Pica_UseGasMode", true); | ||||
|         Core::System::GetInstance().TelemetrySession().AddField( | ||||
|             Common::Telemetry::FieldType::Session, "VideoCore_Pica_UseGasMode", true); | ||||
|         LOG_CRITICAL(Render_OpenGL, "Unimplemented gas mode"); | ||||
|         out += "discard; }"; | ||||
|         return {std::move(out)}; | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ inline GLenum WrapMode(Pica::TexturingRegs::TextureConfig::WrapMode mode) { | |||
| 
 | ||||
|     if (index > 3) { | ||||
|         Core::System::GetInstance().TelemetrySession().AddField( | ||||
|             Telemetry::FieldType::Session, "VideoCore_Pica_UnsupportedTextureWrapMode", | ||||
|             Common::Telemetry::FieldType::Session, "VideoCore_Pica_UnsupportedTextureWrapMode", | ||||
|             static_cast<u32>(index)); | ||||
|         LOG_WARNING(Render_OpenGL, "Using texture wrap mode {}", index); | ||||
|     } | ||||
|  |  | |||
|  | @ -1215,12 +1215,10 @@ VideoCore::ResultStatus RendererOpenGL::Init() { | |||
|     LOG_INFO(Render_OpenGL, "GL_RENDERER: {}", gpu_model); | ||||
| 
 | ||||
|     auto& telemetry_session = Core::System::GetInstance().TelemetrySession(); | ||||
|     telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_Vendor", | ||||
|                                std::string(gpu_vendor)); | ||||
|     telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_Model", | ||||
|                                std::string(gpu_model)); | ||||
|     telemetry_session.AddField(Telemetry::FieldType::UserSystem, "GPU_OpenGL_Version", | ||||
|                                std::string(gl_version)); | ||||
|     constexpr auto user_system = Common::Telemetry::FieldType::UserSystem; | ||||
|     telemetry_session.AddField(user_system, "GPU_Vendor", std::string(gpu_vendor)); | ||||
|     telemetry_session.AddField(user_system, "GPU_Model", std::string(gpu_model)); | ||||
|     telemetry_session.AddField(user_system, "GPU_OpenGL_Version", std::string(gl_version)); | ||||
| 
 | ||||
|     if (!strcmp(gpu_vendor, "GDI Generic")) { | ||||
|         return VideoCore::ResultStatus::ErrorGenericDrivers; | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ | |||
| 
 | ||||
| namespace WebService { | ||||
| 
 | ||||
| namespace Telemetry = Common::Telemetry; | ||||
| 
 | ||||
| struct TelemetryJson::Impl { | ||||
|     Impl(std::string host, std::string username, std::string token) | ||||
|         : host{std::move(host)}, username{std::move(username)}, token{std::move(token)} {} | ||||
|  |  | |||
|  | @ -15,25 +15,25 @@ namespace WebService { | |||
|  * Implementation of VisitorInterface that serialized telemetry into JSON, and submits it to the | ||||
|  * Citra web service | ||||
|  */ | ||||
| class TelemetryJson : public Telemetry::VisitorInterface { | ||||
| class TelemetryJson : public Common::Telemetry::VisitorInterface { | ||||
| public: | ||||
|     TelemetryJson(std::string host, std::string username, std::string token); | ||||
|     ~TelemetryJson() override; | ||||
| 
 | ||||
|     void Visit(const Telemetry::Field<bool>& field) override; | ||||
|     void Visit(const Telemetry::Field<double>& field) override; | ||||
|     void Visit(const Telemetry::Field<float>& field) override; | ||||
|     void Visit(const Telemetry::Field<u8>& field) override; | ||||
|     void Visit(const Telemetry::Field<u16>& field) override; | ||||
|     void Visit(const Telemetry::Field<u32>& field) override; | ||||
|     void Visit(const Telemetry::Field<u64>& field) override; | ||||
|     void Visit(const Telemetry::Field<s8>& field) override; | ||||
|     void Visit(const Telemetry::Field<s16>& field) override; | ||||
|     void Visit(const Telemetry::Field<s32>& field) override; | ||||
|     void Visit(const Telemetry::Field<s64>& field) override; | ||||
|     void Visit(const Telemetry::Field<std::string>& field) override; | ||||
|     void Visit(const Telemetry::Field<const char*>& field) override; | ||||
|     void Visit(const Telemetry::Field<std::chrono::microseconds>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<bool>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<double>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<float>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<u8>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<u16>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<u32>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<u64>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<s8>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<s16>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<s32>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<s64>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<std::string>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<const char*>& field) override; | ||||
|     void Visit(const Common::Telemetry::Field<std::chrono::microseconds>& field) override; | ||||
| 
 | ||||
|     void Complete() override; | ||||
|     bool SubmitTestcase() override; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue