Skip to content

Commit

Permalink
♻️ refactor sample
Browse files Browse the repository at this point in the history
  • Loading branch information
WesleyCh3n committed Jul 20, 2022
1 parent 250a152 commit 674fd0d
Show file tree
Hide file tree
Showing 5 changed files with 212 additions and 127 deletions.
2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
name = "adl"

[dependencies]

Expand Down
21 changes: 21 additions & 0 deletions src/adl_define.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#![allow(non_camel_case_types)]
#![allow(dead_code)]
use std::os::raw::{c_int, c_void};

use crate::adl_struct::{
Expand All @@ -8,6 +9,26 @@ use crate::adl_struct::{
pub const ADL_OK: c_int = 0;
pub const ADL_MAX_PATH: usize = 256;

pub const ADL_ODN_SCLK_DPM: c_int = 1 << 0;
pub const ADL_ODN_MCLK_DPM: c_int = 1 << 1;
pub const ADL_ODN_SCLK_VDD: c_int = 1 << 2;
pub const ADL_ODN_MCLK_VDD: c_int = 1 << 3;
pub const ADL_ODN_FAN_SPEED_MIN: c_int = 1 << 4;
pub const ADL_ODN_FAN_SPEED_TARGET: c_int = 1 << 5;
pub const ADL_ODN_ACOUSTIC_LIMIT_SCLK: c_int = 1 << 6;
pub const ADL_ODN_TEMPERATURE_FAN_MAX: c_int = 1 << 7;
pub const ADL_ODN_TEMPERATURE_SYSTEM: c_int = 1 << 8;
pub const ADL_ODN_POWER_LIMIT: c_int = 1 << 9;
pub const ADL_ODN_SCLK_AUTO_LIMIT: c_int = 1 << 10;
pub const ADL_ODN_MCLK_AUTO_LIMIT: c_int = 1 << 11;
pub const ADL_ODN_SCLK_DPM_MASK_ENABLE: c_int = 1 << 12;
pub const ADL_ODN_MCLK_DPM_MASK_ENABLE: c_int = 1 << 13;
pub const ADL_ODN_MCLK_UNDERCLOCK_ENABLE: c_int = 1 << 14;
pub const ADL_ODN_SCLK_DPM_THROTTLE_NOTIFY: c_int = 1 << 15;
pub const ADL_ODN_POWER_UTILIZATION: c_int = 1 << 16;
pub const ADL_ODN_PERF_TUNING_SLIDER: c_int = 1 << 17;
pub const ADL_ODN_REMOVE_WATTMAN_PAGE: c_int = 1 << 31;

pub type ADL_MAIN_MALLOC_CALLBACK = unsafe extern "C" fn(c_int) -> *mut c_void;

pub type ADL_ADAPTER_NUMBEROFADAPTERS_GET = fn(*mut c_int) -> c_int;
Expand Down
183 changes: 183 additions & 0 deletions src/bin/over_drive_n.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
use std::{
alloc::{alloc, dealloc, Layout},
mem::{align_of, size_of},
os::raw::{c_int, c_void}, ptr,
};

use windows::core::*;

use adl::adl::*;
use adl::adl_define::*;
use adl::adl_struct::*;
use adl::winapi::*;

fn main() -> Result<()> {
unsafe { unsafe_main() }
}

unsafe extern "C" fn adl_main_memory_alloc(i_size: c_int) -> *mut c_void {
let layout =
Layout::from_size_align_unchecked(i_size as usize, align_of::<c_int>());
let ptr = alloc(layout) as *mut c_void;
ptr
}

unsafe fn print_odn_fan_parameters(
adl: &ADLLibrary,
lp_adapter_info: *mut AdapterInfo,
) -> Result<()> {
let context: *mut c_void = ptr::null_mut();
let (mut i_supported, mut i_enabled, mut i_version) =
(c_int::default(), c_int::default(), c_int::default());
(adl.adl2_overdrive_caps)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut i_supported,
&mut i_enabled,
&mut i_version,
);
println!(
"i_supported: {}, i_enabled: {}, i_version: {}",
i_supported, i_enabled, i_version
);
if i_version == 7 {
let mut overdrive_capabilities = ADLODNCapabilitiesX2::default();
if ADL_OK
!= (adl.adl2_overdriven_capabilitiesx2_get)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut overdrive_capabilities,
)
{
println!("ADL2_OverdriveN_CapabilitiesX2_Get is failed");
}
let mut od_nfan_control = ADLODNFanControl::default();
if ADL_OK
!= (adl.adl2_overdriven_fancontrol_get)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut od_nfan_control,
)
{
println!("ADL2_OverdriveN_FanControl_Get is failed");
} else {
if (ADL_ODN_FAN_SPEED_MIN & overdrive_capabilities.iFlags)
== ADL_ODN_FAN_SPEED_MIN
|| (ADL_ODN_FAN_SPEED_TARGET & overdrive_capabilities.iFlags)
== ADL_ODN_FAN_SPEED_TARGET
{
println!("{:-^45}", "FAN (Min Fan Limit & Fan Target Speed)");
println!(
"Min: {}, Max: {}, Step: {}",
overdrive_capabilities.fanSpeed.iMin,
overdrive_capabilities.fanSpeed.iMax,
overdrive_capabilities.fanSpeed.iStep
);
println!(
"odNFanControl.iFanControlMode: {}",
od_nfan_control.iFanControlMode
);
println!(
"odNFanControl.iMinFanLimit: {}",
od_nfan_control.iMinFanLimit
);
println!(
"odNFanControl.iTargetFanSpeed: {}",
od_nfan_control.iTargetFanSpeed
);
println!("{:-^40}", "");
}
if (overdrive_capabilities.iFlags & ADL_ODN_ACOUSTIC_LIMIT_SCLK)
== ADL_ODN_ACOUSTIC_LIMIT_SCLK
{
println!("{:-^40}", "FAN (Min performance)");
println!(
"Min: {:>7}, Max: {:>7}, Step: {:>6}",
overdrive_capabilities.minimumPerformanceClock.iMin,
overdrive_capabilities.minimumPerformanceClock.iMax,
overdrive_capabilities.minimumPerformanceClock.iStep,
);
println!(
"odNFanControl.iMinPerformanceClock: {:>4}",
od_nfan_control.iMinPerformanceClock,
);
println!("{:-^40}", "");
}
if (overdrive_capabilities.iFlags & ADL_ODN_TEMPERATURE_FAN_MAX)
== ADL_ODN_TEMPERATURE_FAN_MAX
{
println!("{:-^40}", "FAN (Target Temp)");
println!(
"Min: {}, Max: {}, Step: {}",
overdrive_capabilities.fanTemperature.iMin,
overdrive_capabilities.fanTemperature.iMax,
overdrive_capabilities.fanTemperature.iStep,
);
println!(
"odNFanControl.iTargetTemperature: {:>6}",
od_nfan_control.iTargetTemperature,
);
println!("{:-^40}", "");
}
println!("{:-^40}", "Fan Current Speed");
println!(
"odNFanControl.iCurrentFanSpeed: {:>8}",
od_nfan_control.iCurrentFanSpeed,
);
println!(
"odNFanControl.iCurrentFanSpeedMode: {:>4}",
od_nfan_control.iCurrentFanSpeedMode,
);
println!("{:-^40}", "");
};
}
Ok(())
}

unsafe fn unsafe_main() -> Result<()> {
let h_dll = load_library(b"atiadlxx.dll\0")?;

let adl = initialize_adl(&h_dll)?;

if ADL_OK != (adl.adl_main_control_create)(adl_main_memory_alloc, 1) {
println!("Failed to initialize nested ADL2 context");
return Ok(());
}

let mut i_number_adapters: c_int = c_int::default();
if ADL_OK
!= (adl.adl_adapter_number_of_adapters_get)(&mut i_number_adapters)
{
println!("Cannot get the number of adapters!");
return Ok(());
}
println!("i_number_adapters: {}", i_number_adapters);

let lp_adapter_info_raw: *mut c_void;
println!("size_of AdapterInfo: {}", size_of::<AdapterInfo>());
let adapter_info_size: usize =
size_of::<AdapterInfo>() * i_number_adapters as usize;
let layout =
Layout::from_size_align(adapter_info_size, align_of::<AdapterInfo>())
.expect("Align");

// no adapter found
if i_number_adapters < 0 {
return Ok(());
}

lp_adapter_info_raw = alloc(layout) as _;
ptr::write_bytes(lp_adapter_info_raw, b'\0', adapter_info_size);
let lp_adapter_info = lp_adapter_info_raw as *mut AdapterInfo;
(adl.adl_adapter_adapterinfo_get)(
lp_adapter_info,
adapter_info_size as i32,
);
print_odn_fan_parameters(&adl, lp_adapter_info)?;

dealloc(lp_adapter_info_raw as *mut u8, layout);

(adl.adl_main_control_destroy)();
free_library(&h_dll);
Ok(())
}
4 changes: 4 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
pub mod adl;
pub mod adl_define;
pub mod adl_struct;
pub mod winapi;
129 changes: 2 additions & 127 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,128 +1,3 @@
mod adl;
mod adl_define;
mod adl_struct;
mod winapi;

use std::{
alloc::{alloc, dealloc, Layout},
mem::{align_of, size_of},
os::raw::{c_int, c_void},
};

use windows::core::*;

use adl::*;
use adl_define::*;
use adl_struct::*;
use winapi::*;

fn main() -> Result<()> {
unsafe { unsafe_main() }
}

unsafe extern "C" fn adl_main_memory_alloc(i_size: c_int) -> *mut c_void {
let layout =
Layout::from_size_align_unchecked(i_size as usize, align_of::<c_int>());
let ptr = alloc(layout) as *mut c_void;
ptr
}

unsafe fn unsafe_main() -> Result<()> {
let h_dll = load_library(b"atiadlxx.dll\0")?;

let adl = initialize_adl(&h_dll)?;

if ADL_OK != (adl.adl_main_control_create)(adl_main_memory_alloc, 1) {
println!("Failed to initialize nested ADL2 context");
return Ok(());
}

let mut i_number_adapters: c_int = c_int::default();
if ADL_OK
!= (adl.adl_adapter_number_of_adapters_get)(&mut i_number_adapters)
{
println!("Cannot get the number of adapters!");
return Ok(());
}
println!("i_number_adapters: {}", i_number_adapters);

let lp_adapter_info_raw: *mut c_void;
if 0 < i_number_adapters {
println!("size_of AdapterInfo: {}", size_of::<AdapterInfo>());
let adapter_info_size: usize =
size_of::<AdapterInfo>() * i_number_adapters as usize;
let layout = Layout::from_size_align(
adapter_info_size,
align_of::<AdapterInfo>(),
)
.expect("Align");
lp_adapter_info_raw = alloc(layout) as _;
std::ptr::write_bytes(lp_adapter_info_raw, b'\0', adapter_info_size);
let lp_adapter_info = lp_adapter_info_raw as *mut AdapterInfo;
(adl.adl_adapter_adapterinfo_get)(
lp_adapter_info,
adapter_info_size as i32,
);
/* println!(
"{:#?}",
std::ffi::CStr::from_ptr(
(*(lp_adapter_info as *mut AdapterInfo))
.strPNPString
.as_ptr()
)
); */

println!(
"lpAdapterInfo[0].iBusNumber: {}",
(*lp_adapter_info.offset(0)).iBusNumber
);

let context: *mut c_void = std::ptr::null_mut();
let (mut i_supported, mut i_enabled, mut i_version) =
(c_int::default(), c_int::default(), c_int::default());
(adl.adl2_overdrive_caps)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut i_supported,
&mut i_enabled,
&mut i_version,
);
println!(
"i_supported: {}, i_enabled: {}, i_version: {}",
i_supported, i_enabled, i_version
);
if i_version == 7 {
let mut overdrive_capabilities = ADLODNCapabilitiesX2::default();
if ADL_OK
!= (adl.adl2_overdriven_capabilitiesx2_get)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut overdrive_capabilities,
)
{
println!("ADL2_OverdriveN_CapabilitiesX2_Get is failed\n");
}
let mut od_nfan_control = ADLODNFanControl::default();
if ADL_OK
!= (adl.adl2_overdriven_fancontrol_get)(
context,
(*lp_adapter_info.offset(0)).iAdapterIndex,
&mut od_nfan_control,
)
{
println!("ADL2_OverdriveN_FanControl_Get is failed\n");
} else {
println!(
"overdrive_capabilities.iFlags: {}",
overdrive_capabilities.iFlags
);
};
}

dealloc(lp_adapter_info_raw as *mut u8, layout);
}

(adl.adl_main_control_destroy)();
free_library(&h_dll);
Ok(())
fn main() {
println!("Hello World")
}

0 comments on commit 674fd0d

Please sign in to comment.