Fix config loading

This commit is contained in:
hodasemi 2023-01-23 07:21:52 +01:00
parent eac4f60acf
commit 3a463f2bec
5 changed files with 85 additions and 39 deletions

28
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,28 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug selected unit test",
"cargo": {
"args": [
"test",
// "--no-run",
"test::${selectedText}"
],
// "filter": {
// "name": "vk_layer_rs",
// "kind": "lib"
// }
},
"cwd": "${workspaceFolder}",
"env": {
"RFACTOR_HUD_LOG": "1"
}
},
]
}

View file

@ -19,6 +19,7 @@ pub(crate) fn logging() -> bool {
macro_rules! write_log { macro_rules! write_log {
($msg:expr) => { ($msg:expr) => {
println!("{}", $msg);
if crate::logging() { if crate::logging() {
crate::log($msg); crate::log($msg);
} }
@ -31,18 +32,25 @@ fn get_config(home: &str) -> OverlayConfig {
let config_path = Path::new(&home).join(".config/rFactorHUD/config.json"); let config_path = Path::new(&home).join(".config/rFactorHUD/config.json");
if config_path.exists() { if config_path.exists() {
fs::read_to_string(&config_path) match fs::read_to_string(&config_path) {
.map(|s| { Ok(s) => serde_json::from_str(&s).unwrap_or_else(|err| {
serde_json::from_str(&s).unwrap_or({ write_log!(format!(
write_log!("failed to deserialize config file"); "failed to deserialize config file from {} \n({:?})",
s, err
));
OverlayConfig::new() OverlayConfig::new()
}) }),
}) Err(err) => {
.unwrap_or({ write_log!(format!(
write_log!(format!("failed to open config file: {:?}", config_path)); "failed to open config file: {:?} due to {:?}",
config_path, err
));
OverlayConfig::new() OverlayConfig::new()
}) }
}
} else { } else {
write_log!("create parent dir structure");
if let Err(err) = std::fs::create_dir_all(config_path.parent().unwrap()) { if let Err(err) = std::fs::create_dir_all(config_path.parent().unwrap()) {
write_log!(format!("failed to create dirs for config file: {:?}", err)); write_log!(format!("failed to create dirs for config file: {:?}", err));
} }
@ -52,6 +60,8 @@ fn get_config(home: &str) -> OverlayConfig {
match File::create(config_path) { match File::create(config_path) {
Ok(mut file) => match serde_json::to_string_pretty(&config) { Ok(mut file) => match serde_json::to_string_pretty(&config) {
Ok(conf_str) => { Ok(conf_str) => {
write_log!("create config file with default values");
if let Err(err) = file.write_all(conf_str.as_bytes()) { if let Err(err) = file.write_all(conf_str.as_bytes()) {
write_log!(format!("failed to write to config file: {:?}", err)); write_log!(format!("failed to write to config file: {:?}", err));
} }
@ -69,6 +79,31 @@ fn get_config(home: &str) -> OverlayConfig {
} }
} }
pub fn check_logging(home: &str) {
let log_enabled = match std::env::var("RFACTOR_HUD_LOG") {
Ok(var) => {
let i: u32 = var.parse().unwrap_or(0);
i == 1
}
Err(_) => false,
};
unsafe { LOG_ENABLED = log_enabled };
if logging() {
unsafe {
LOG_FILE = format!("{}/rf2_vk_hud.log", home);
}
if let Err(_) = File::create(unsafe { &LOG_FILE }) {}
write_log!(" ==================================================================");
write_log!(" ======================= New Negotiation ==========================");
write_log!(" ==================================================================");
}
}
pub fn log(msg: impl ToString) { pub fn log(msg: impl ToString) {
assert!(logging()); assert!(logging());
@ -83,11 +118,14 @@ pub fn log(msg: impl ToString) {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use crate::get_config; use crate::{check_logging, get_config};
#[test] #[test]
fn config() { fn config() {
let home = std::env::var("HOME").unwrap(); let home = std::env::var("HOME").unwrap();
get_config(&home); check_logging(&home);
let config = get_config(&home);
println!("{:#?}", config);
} }
} }

View file

@ -22,7 +22,7 @@ use crate::write_log;
use bg_generator::BackgroundGenerator; use bg_generator::BackgroundGenerator;
#[derive(Default, Deserialize, Serialize, Clone, Copy)] #[derive(Default, Deserialize, Serialize, Clone, Copy, Debug)]
pub struct LeaderBoardConfig { pub struct LeaderBoardConfig {
first_board_color: [f32; 3], first_board_color: [f32; 3],
second_board_color: [f32; 3], second_board_color: [f32; 3],

View file

@ -25,7 +25,7 @@ use serde::{Deserialize, Serialize};
pub trait UiOverlay: DataReceiver {} pub trait UiOverlay: DataReceiver {}
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize, Debug)]
pub struct UiSelectorConfig { pub struct UiSelectorConfig {
pub enable_watermark: bool, pub enable_watermark: bool,
@ -45,7 +45,7 @@ impl UiSelectorConfig {
} }
} }
#[derive(Deserialize, Serialize)] #[derive(Deserialize, Serialize, Debug)]
pub struct OverlayConfig { pub struct OverlayConfig {
pub ui_config: UiSelectorConfig, pub ui_config: UiSelectorConfig,
pub radar_config: RadarConfig, pub radar_config: RadarConfig,

View file

@ -2,47 +2,27 @@ mod enums;
mod structs; mod structs;
mod vk_handles; mod vk_handles;
use crate::check_logging;
use enums::*; use enums::*;
use structs::*; use structs::*;
use vk_handles::*; use vk_handles::*;
use vulkan_rs::prelude::*; use vulkan_rs::prelude::*;
use std::{ffi::c_void, fs::File, mem, os::raw::c_char, ptr}; use std::{ffi::c_void, mem, os::raw::c_char, ptr};
static mut ACQUIRE_NEXT_IMAGE: PFN_vkAcquireNextImageKHR = static mut ACQUIRE_NEXT_IMAGE: PFN_vkAcquireNextImageKHR =
unsafe { mem::transmute(vkVoidFunction as *const c_void) }; unsafe { mem::transmute(vkVoidFunction as *const c_void) };
use crate::{get_config, logging, write_log, LOG_ENABLED, LOG_FILE, OVERLAY}; use crate::{get_config, logging, write_log, OVERLAY};
#[no_mangle] #[no_mangle]
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub(crate) extern "C" fn vkNegotiateLoaderLayerInterfaceVersion( pub(crate) extern "C" fn vkNegotiateLoaderLayerInterfaceVersion(
pVersionStruct: *mut VkNegotiateLayerInterface, pVersionStruct: *mut VkNegotiateLayerInterface,
) -> VkResult { ) -> VkResult {
let log_enabled = match std::env::var("RFACTOR_HUD_LOG") {
Ok(var) => {
let i: u32 = var.parse().unwrap_or(0);
i == 1
}
Err(_) => false,
};
unsafe { LOG_ENABLED = log_enabled };
let home = std::env::var("HOME").unwrap(); let home = std::env::var("HOME").unwrap();
if logging() { check_logging(&home);
unsafe {
LOG_FILE = format!("{}/rf2_vk_hud.log", home);
}
if let Err(_) = File::create(unsafe { &LOG_FILE }) {}
write_log!(" ==================================================================");
write_log!(" ======================= New Negotiation ==========================");
write_log!(" ==================================================================");
}
unsafe { unsafe {
OVERLAY.set_config(get_config(&home)); OVERLAY.set_config(get_config(&home));