summaryrefslogtreecommitdiff
path: root/converter/converter.cpp
diff options
context:
space:
mode:
authora1xd <[email protected]>2020-10-11 21:48:56 -0400
committera1xd <[email protected]>2020-10-11 21:48:56 -0400
commitab8744e2ee6f0c10e560728977e75ccd79e17d09 (patch)
tree332413d7129b8bba3e1d65e334f69644441f2cba /converter/converter.cpp
parentraise default scale cap from 9 to 128 (diff)
downloadrawaccel-ab8744e2ee6f0c10e560728977e75ccd79e17d09.tar.xz
rawaccel-ab8744e2ee6f0c10e560728977e75ccd79e17d09.zip
refactor converter
Diffstat (limited to 'converter/converter.cpp')
-rw-r--r--converter/converter.cpp187
1 files changed, 106 insertions, 81 deletions
diff --git a/converter/converter.cpp b/converter/converter.cpp
index 3aff02c..e91da13 100644
--- a/converter/converter.cpp
+++ b/converter/converter.cpp
@@ -45,83 +45,111 @@ static inline void trim(std::string& s) {
}
bool yes() {
- bool b;
- while (wchar_t c = _getwch()) {
- if (c == 'y') {
- b = true;
- break;
- }
- else if (c == 'n') {
- b = false;
- break;
- }
+ for (;;) {
+ wchar_t c = _getwch();
+ if (c == 'y') return true;
+ else if (c == 'n') return false;
}
- return b;
}
-bool try_convert(const fs::path& fp) {
- std::vector<std::pair<std::string, double>> kv_pairs;
+using ia_settings_t = std::vector<std::pair<std::string, double>>;
+
+ia_settings_t parse_ia_settings(const fs::path fp) {
+ ia_settings_t kv_pairs;
- {
- std::ifstream ifs(fp);
- std::string line;
+ std::ifstream ifs(fp);
+ std::string line;
- while (std::getline(ifs, line)) {
- if (line.empty()) continue;
+ while (std::getline(ifs, line)) {
+ if (line.empty()) continue;
- auto delim_pos = line.find('=');
- if (delim_pos == std::string::npos) continue;
+ auto delim_pos = line.find('=');
+ if (delim_pos == std::string::npos) continue;
- std::string key(line.substr(0, delim_pos));
- trim(key);
+ std::string key(line.substr(0, delim_pos));
+ trim(key);
- auto val_pos = line.find_first_not_of(" \t", delim_pos + 1);
- if (val_pos == std::string::npos) continue;
+ auto val_pos = line.find_first_not_of(" \t", delim_pos + 1);
+ if (val_pos == std::string::npos) continue;
- double val = 0;
+ double val = 0;
- auto [p, ec] = std::from_chars(&line[val_pos], &line[0] + line.size(), val);
+ auto [p, ec] = std::from_chars(&line[val_pos], &line[0] + line.size(), val);
- if (ec == std::errc()) {
+ if (ec == std::errc()) {
+ kv_pairs.emplace_back(key, val);
+ }
+ else if (key == "AccelMode") {
+ std::string mode_val = line.substr(val_pos);
+ rtrim(mode_val);
+ auto it = std::find(IA_MODES.begin(), IA_MODES.end(), mode_val);
+ if (it != IA_MODES.end()) {
+ val = static_cast<double>(std::distance(IA_MODES.begin(), it));
kv_pairs.emplace_back(key, val);
}
- else if (key == "AccelMode") {
- std::string mode_val = line.substr(val_pos);
- rtrim(mode_val);
- auto it = std::find(IA_MODES.begin(), IA_MODES.end(), mode_val);
- if (it != IA_MODES.end()) {
- val = static_cast<double>(std::distance(IA_MODES.begin(), it));
- kv_pairs.emplace_back(key, val);
- }
- }
}
}
- auto get = [&](auto... keys) -> std::optional<double> {
- auto it = std::find_if(kv_pairs.begin(), kv_pairs.end(), [=](auto&& p) {
+ return kv_pairs;
+}
+
+auto make_extractor(const ia_settings_t& ia_settings) {
+ return [&](auto... keys) -> std::optional<double> {
+ auto it = std::find_if(ia_settings.begin(), ia_settings.end(), [=](auto&& p) {
return ((p.first == keys) || ...);
});
- if (it == kv_pairs.end()) return std::nullopt;
+ if (it == ia_settings.end()) return std::nullopt;
return it->second;
};
+}
- ra::settings ra_settings;
- ra::accel_args& args = ra_settings.argsv.x;
-
- auto opt_mode = get("AccelMode");
- if (!opt_mode) opt_mode = 0.0;
+ra::accel_args convert_natural(const ia_settings_t& ia_settings) {
+ auto get = make_extractor(ia_settings);
- double accel = std::max(get("Acceleration").value_or(0), 0.0);
+ double accel = get("Acceleration").value_or(0);
+ double cap = get("SensitivityCap").value_or(0);
double sens = get("Sensitivity").value_or(1);
+ double prescale = get("Pre-ScaleX").value_or(1);
+
+ ra::accel_args args;
+ args.limit = 1 + std::abs(cap - sens);
+ args.accel = accel * prescale / sens;
+ return args;
+}
+
+ra::accel_args convert_quake(const ia_settings_t& ia_settings, bool legacy) {
+ auto get = make_extractor(ia_settings);
+
+ double power = get("Power").value_or(2);
+ double accel = get("Acceleration").value_or(0);
double cap = get("SensitivityCap").value_or(0);
+ double sens = get("Sensitivity").value_or(1);
+ double prescale = get("Pre-ScaleX").value_or(1);
+ double offset = get("Offset").value_or(0);
- std::cout << "We recommend trying out our new cap and offset styles.\n"
- "Use new cap and offset? (y|n)\n";
+ ra::accel_args args;
- args.legacy_offset = !yes();
- args.offset = get("Offset").value_or(0);
- args.accel = accel / sens * get("Pre-ScaleX").value_or(1);
- args.limit = 1 + std::abs(cap - sens);
+ args.accel = accel * prescale / sens;
+ args.exponent = power;
+ args.legacy_offset = legacy;
+ args.offset = offset;
+
+ if (legacy || cap <= 1) {
+ args.scale_cap = cap;
+ }
+ else {
+ double b = (cap - 1) / power;
+ double e = 1 / (power - 1);
+ args.gain_cap = offset + (1 / accel) * std::pow(b, e);
+ }
+
+ return args;
+}
+
+bool try_convert(const ia_settings_t& ia_settings) {
+ auto get = make_extractor(ia_settings);
+
+ ra::settings ra_settings;
ra_settings.degrees_rotation = get("Angle", "AngleAdjustment").value_or(0);
ra_settings.sens = {
@@ -129,53 +157,47 @@ bool try_convert(const fs::path& fp) {
get("Post-ScaleY").value_or(1)
};
- switch (static_cast<IA_MODES_ENUM>(opt_mode.value())) {
+ double mode = get("AccelMode").value_or(IA_QL);
+
+ switch (static_cast<IA_MODES_ENUM>(mode)) {
case IA_QL: {
- auto opt_pow = get("Power");
- if (!opt_pow || opt_pow.value() <= 1) return false;
- args.exponent = opt_pow.value();
-
- if (args.legacy_offset || cap <= 1) {
- args.scale_cap = cap;
- }
- else {
- double b = (cap - 1) / args.exponent;
- double e = 1 / (args.exponent - 1);
- args.gain_cap = args.offset + (1 / accel) * std::pow(b, e);
- }
+ std::cout << "We recommend trying out our new cap and offset styles.\n"
+ "Use new cap and offset? (y|n)\n";
ra_settings.modes.x = ra::accel_mode::classic;
+ ra_settings.argsv.x = convert_quake(ia_settings, !yes());
break;
}
case IA_NAT: {
std::cout << "Raw Accel offers a new mode that you might like more than Natural.\n"
"Wanna try it out now? (y|n)\n";
ra_settings.modes.x = yes() ? ra::accel_mode::naturalgain : ra::accel_mode::natural;
+ ra_settings.argsv.x = convert_natural(ia_settings);
break;
}
case IA_LOG: {
std::cout << "Logarithmic accel mode is not supported.\n";
return true;
- }
+ }
default: return false;
}
-
+
DriverSettings^ new_settings = Marshal::PtrToStructure<DriverSettings^>((IntPtr)&ra_settings);
auto errors = DriverInterop::GetSettingsErrors(new_settings);
- if (errors->Empty()) {
- Console::Write("Sending to driver... ");
- DriverInterop::Write(new_settings);
- Console::WriteLine("done");
-
- Console::Write("Generating settings.json... ");
- auto json = JsonConvert::SerializeObject(new_settings, Formatting::Indented);
- System::IO::File::WriteAllText("settings.json", json);
- Console::WriteLine("done");
- }
- else {
- Console::WriteLine("Bad settings:\n" + errors->x->ToArray()[0]);
+ if (!errors->Empty()) {
+ Console::WriteLine("Bad settings: " + errors->x->ToArray()[0]);
+ return false;
}
+ Console::Write("Sending to driver... ");
+ DriverInterop::Write(new_settings);
+ Console::WriteLine("done");
+
+ Console::Write("Generating settings.json... ");
+ auto json = JsonConvert::SerializeObject(new_settings, Formatting::Indented);
+ System::IO::File::WriteAllText("settings.json", json);
+ Console::WriteLine("done");
+
return true;
}
@@ -202,14 +224,17 @@ int main()
opt_path->filename() << "? (y|n)\n";
if (!yes()) return 0;
try {
- if (!try_convert(opt_path.value()))
+ if (!try_convert(parse_ia_settings(opt_path.value())))
std::cout << "Unable to convert settings.\n";
}
catch (DriverNotInstalledException^) {
- std::cout << "\nDriver is not installed\n";
+ Console::WriteLine("\nDriver is not installed.");
+ }
+ catch (Exception^ e) {
+ Console::WriteLine("\nError: " + e->ToString());
}
catch (const std::exception& e) {
- std::cout << "Error: \n" << e.what() << '\n';
+ std::cout << "Error: " << e.what() << '\n';
}
}
else {