using GHelper.Mode; using System.Management; using System.Text.Json; public static class AppConfig { private static string configFile; private static string? _model; private static string? _modelShort; private static string? _bios; private static Dictionary config = new Dictionary(); private static System.Timers.Timer timer = new System.Timers.Timer(1000); static AppConfig() { string startupPath = Application.StartupPath.Trim('\\'); string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper"; string configName = "\\config.json"; if (File.Exists(startupPath + configName)) { configFile = startupPath + configName; } else { configFile = appPath + configName; } if (!System.IO.Directory.Exists(appPath)) System.IO.Directory.CreateDirectory(appPath); if (File.Exists(configFile)) { string text = File.ReadAllText(configFile); try { config = JsonSerializer.Deserialize>(text); } catch { Logger.WriteLine("Broken config: " + text); Init(); } } else { Init(); } timer.Elapsed += Timer_Elapsed; } private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { timer.Stop(); string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true }); var backup = configFile + ".bak"; try { File.WriteAllText(backup, jsonString); } catch (Exception) { Thread.Sleep(100); try { File.WriteAllText(backup, jsonString); } catch (Exception ex) { Logger.WriteLine(ex.Message); } return; } Thread.Sleep(500); if (File.ReadAllText(backup).Contains("}")) { File.Copy(backup, configFile, true); } else { Logger.WriteLine("Error writing config"); } } public static string GetModel() { if (_model is null) { _model = ""; try { using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_ComputerSystem")) { foreach (var process in searcher.Get()) { _model = process["Model"].ToString(); break; } } } catch (Exception ex) { Logger.WriteLine(ex.Message); } } //if (_model.Contains("GA402RK")) _model = "ROG Zephyrus G14 GA403UI"; // Debug Purposes return _model; } public static (string, string) GetBiosAndModel() { if (_bios is not null && _modelShort is not null) return (_bios, _modelShort); using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_BIOS")) { using (ManagementObjectCollection objCollection = objSearcher.Get()) { foreach (ManagementObject obj in objCollection) if (obj["SMBIOSBIOSVersion"] is not null) { string[] results = obj["SMBIOSBIOSVersion"].ToString().Split("."); if (results.Length > 1) { _modelShort = results[0]; _bios = results[1]; } else { _modelShort = obj["SMBIOSBIOSVersion"].ToString(); } } return (_bios, _modelShort); } } } public static string GetModelShort() { string model = GetModel(); int trim = model.LastIndexOf("_"); if (trim > 0) model = model.Substring(0, trim); return model; } public static bool ContainsModel(string contains) { GetModel(); return (_model is not null && _model.ToLower().Contains(contains.ToLower())); } private static void Init() { config = new Dictionary(); config["performance_mode"] = 0; string jsonString = JsonSerializer.Serialize(config); File.WriteAllText(configFile, jsonString); } public static int Get(string name, int empty = -1) { if (config.ContainsKey(name)) { //Debug.WriteLine(name); return int.Parse(config[name].ToString()); } else { //Debug.WriteLine(name + "E"); return empty; } } public static bool Is(string name) { return Get(name) == 1; } public static bool IsNotFalse(string name) { return Get(name) != 0; } public static string GetString(string name, string empty = null) { if (config.ContainsKey(name)) return config[name].ToString(); else return empty; } private static void Write() { timer.Start(); } public static void Set(string name, int value) { config[name] = value; Write(); } public static void Set(string name, string value) { config[name] = value; Write(); } public static void Remove(string name) { config.Remove(name); Write(); } public static void RemoveMode(string name) { Remove(name + "_" + Modes.GetCurrent()); } public static string GgetParamName(AsusFan device, string paramName = "fan_profile") { int mode = Modes.GetCurrent(); string name; switch (device) { case AsusFan.GPU: name = "gpu"; break; case AsusFan.Mid: name = "mid"; break; case AsusFan.XGM: name = "xgm"; break; default: name = "cpu"; break; } return paramName + "_" + name + "_" + mode; } public static byte[] GetFanConfig(AsusFan device) { string curveString = GetString(GgetParamName(device)); byte[] curve = { }; if (curveString is not null) curve = StringToBytes(curveString); return curve; } public static void SetFanConfig(AsusFan device, byte[] curve) { string bitCurve = BitConverter.ToString(curve); Set(GgetParamName(device), bitCurve); } public static byte[] StringToBytes(string str) { String[] arr = str.Split('-'); byte[] array = new byte[arr.Length]; for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16); return array; } public static byte[] GetDefaultCurve(AsusFan device) { int mode = Modes.GetCurrentBase(); byte[] curve; switch (mode) { case 1: if (device == AsusFan.GPU) curve = StringToBytes("14-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F"); else curve = StringToBytes("14-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A"); break; case 2: if (device == AsusFan.GPU) curve = StringToBytes("3C-41-42-46-47-4B-4C-62-08-11-11-1D-1D-26-26-2D"); else curve = StringToBytes("3C-41-42-46-47-4B-4C-62-03-0C-0C-16-16-22-22-29"); break; default: if (device == AsusFan.GPU) curve = StringToBytes("3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A"); else curve = StringToBytes("3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45"); break; } return curve; } public static string GetModeString(string name) { return GetString(name + "_" + Modes.GetCurrent()); } public static int GetMode(string name, int empty = -1) { return Get(name + "_" + Modes.GetCurrent(), empty); } public static bool IsMode(string name) { return Get(name + "_" + Modes.GetCurrent()) == 1; } public static void SetMode(string name, int value) { Set(name + "_" + Modes.GetCurrent(), value); } public static void SetMode(string name, string value) { Set(name + "_" + Modes.GetCurrent(), value); } public static bool IsAlly() { return ContainsModel("RC71"); } public static bool NoMKeys() { return (ContainsModel("Z13") && !IsARCNM()) || ContainsModel("FX706") || ContainsModel("FA706") || ContainsModel("FA506") || ContainsModel("FX506") || ContainsModel("Duo") || ContainsModel("FX505"); } public static bool IsARCNM() { return ContainsModel("GZ301VIC"); } public static bool IsTUF() { return ContainsModel("TUF"); } public static bool IsProArt() { return ContainsModel("ProArt"); } public static bool IsVivoZenbook() { return ContainsModel("Vivobook") || ContainsModel("Zenbook"); } // Devices with bugged bios command to change brightness public static bool SwappedBrightness() { return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC"); } public static bool IsDUO() { return ContainsModel("Duo") || ContainsModel("GX550") || ContainsModel("GX650"); } // G14 2020 has no aura, but media keys instead public static bool NoAura() { return ContainsModel("GA401I") && !ContainsModel("GA401IHR"); } public static bool IsSingleColor() { return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("GA502IU"); } public static bool IsSlash() { return ContainsModel("GA403") || ContainsModel("GU605"); } public static bool IsInputBacklight() { return ContainsModel("GA503") || IsSlash(); } public static bool IsInvertedFNLock() { return ContainsModel("M140"); } public static bool IsOLED() { return ContainsModel("OLED") || IsSlash() || ContainsModel("M7600") || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M350") || ContainsModel("K650") || ContainsModel("UM53") || ContainsModel("K660") || ContainsModel("UX84") || ContainsModel("M650") || ContainsModel("K340") || ContainsModel("K350") || ContainsModel("M140") || ContainsModel("UM340"); } public static bool IsNoOverdrive() { return Is("no_overdrive") || IsOLED(); } public static bool IsNoSleepEvent() { return ContainsModel("FX505"); } public static bool IsStrix() { return ContainsModel("Strix") || ContainsModel("Scar") || ContainsModel("G703G"); } public static bool IsStrixLimitedRGB() { return (ContainsModel("G614JV_") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513R") || ContainsModel("G713PV") || ContainsModel("G513IE") || ContainsModel("G713RC") || ContainsModel("G513QM") || ContainsModel("G531G")) && !Is("per_key_rgb"); } public static bool IsNoAirplaneMode() { return ContainsModel("FX506"); } public static bool NoWMI() { return ContainsModel("GL704G") || ContainsModel("GM501G"); } public static bool IsNoDirectRGB() { return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || IsSlash(); } public static bool IsStrixNumpad() { return ContainsModel("G713R"); } public static bool IsZ13() { return ContainsModel("Z13"); } public static bool IsS17() { return ContainsModel("S17"); } public static bool HasTabletMode() { return ContainsModel("X16") || ContainsModel("X13"); } public static bool IsX13() { return ContainsModel("X13"); } public static bool IsG14AMD() { return ContainsModel("GA402R"); } public static bool DynamicBoost5() { return ContainsModel("GZ301ZE"); } public static bool DynamicBoost15() { return ContainsModel("FX507ZC4"); } public static bool DynamicBoost20() { return ContainsModel("GU605"); } public static bool IsAdvantageEdition() { return ContainsModel("13QY"); } public static bool NoAutoUltimate() { return ContainsModel("G614") || ContainsModel("GU604") || ContainsModel("FX507") || ContainsModel("G513") || ContainsModel("FA617") || ContainsModel("G834") || ContainsModel("GA403") || ContainsModel("GU605"); } public static bool IsManualModeRequired() { if (!IsMode("auto_apply_power")) return false; return Is("manual_mode") || ContainsModel("GU604") || ContainsModel("G733") || ContainsModel("FX507Z"); } public static bool IsFanScale() { if (!ContainsModel("GU604")) return false; try { var (bios, model) = GetBiosAndModel(); return (Int32.Parse(bios) < 312); } catch { return false; } } public static bool IsSwappedFans() { if (!ContainsModel("GA503R")) return false; try { var (bios, model) = GetBiosAndModel(); var biosVersion = Int32.Parse(bios); if (ContainsModel("GA503RM") && biosVersion == 317) return true; if ((ContainsModel("GA503RS") || ContainsModel("GA503RW")) && biosVersion == 316) return true; return false; } catch { return false; } } public static bool IsResetRequired() { return ContainsModel("GA403"); } public static bool IsFanRequired() { return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA403") || ContainsModel("G634J") || ContainsModel("G834J") || ContainsModel("G614J") || ContainsModel("G814J") || ContainsModel("FX507V"); } public static bool IsAMDLight() { return ContainsModel("GA402X") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X"); } public static bool IsPowerRequired() { return ContainsModel("FX507") || ContainsModel("FX517") || ContainsModel("FX707"); } public static bool IsGPUFix() { return Is("gpu_fix") || (ContainsModel("GA402X") && IsNotFalse("gpu_fix")); } public static bool IsForceSetGPUMode() { return Is("gpu_mode_force_set") || ContainsModel("503"); } public static bool IsNoGPUModes() { return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly(); } public static bool IsHardwareTouchpadToggle() { return ContainsModel("FA507"); } public static bool IsIntelHX() { return ContainsModel("G814") || ContainsModel("G614") || ContainsModel("G834") || ContainsModel("G634"); } public static bool IsNoFNV() { return ContainsModel("FX507") || ContainsModel("FX707"); } public static bool IsROG() { return ContainsModel("ROG"); } public static bool IsASUS() { return ContainsModel("ROG") || ContainsModel("TUF") || ContainsModel("Vivobook") || ContainsModel("Zenbook"); } public static bool IsBWIcon() { return Is("bw_icon"); } }