Hardware/ATI/ADL.cs
author moel.mich
Thu, 11 Nov 2010 21:22:24 +0000
changeset 241 52007c404f32
parent 195 0ee888c485d5
child 247 6dc755f1970e
permissions -rw-r--r--
Fixed a problem, where the MainForm location and size was lost when the application is started minimized and exited without ever showing the form. This caused MainForm_Load to be never called (location and size was not loaded), but the default size and location were still saved. The new implementation only saves the location and size when one of the two is changed.
moel@1
     1
/*
moel@1
     2
  
moel@1
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@1
     4
moel@1
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@1
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@1
     7
  the License. You may obtain a copy of the License at
moel@1
     8
 
moel@1
     9
  http://www.mozilla.org/MPL/
moel@1
    10
moel@1
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@1
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@1
    13
  for the specific language governing rights and limitations under the License.
moel@1
    14
moel@1
    15
  The Original Code is the Open Hardware Monitor code.
moel@1
    16
moel@1
    17
  The Initial Developer of the Original Code is 
moel@1
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@1
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@1
    20
  the Initial Developer. All Rights Reserved.
moel@1
    21
moel@1
    22
  Contributor(s):
moel@1
    23
moel@1
    24
  Alternatively, the contents of this file may be used under the terms of
moel@1
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@1
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@1
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@1
    28
  of those above. If you wish to allow use of your version of this file only
moel@1
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@1
    30
  use your version of this file under the terms of the MPL, indicate your
moel@1
    31
  decision by deleting the provisions above and replace them with the notice
moel@1
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@1
    33
  the provisions above, a recipient may use your version of this file under
moel@1
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@1
    35
 
moel@1
    36
*/
moel@1
    37
moel@1
    38
using System;
moel@1
    39
using System.Runtime.InteropServices;
moel@1
    40
moel@1
    41
namespace OpenHardwareMonitor.Hardware.ATI {
moel@1
    42
  
moel@1
    43
  [StructLayout(LayoutKind.Sequential)]
moel@165
    44
  internal struct ADLAdapterInfo {
moel@1
    45
    public int Size;
moel@1
    46
    public int AdapterIndex;
moel@1
    47
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    48
    public string UDID;
moel@1
    49
    public int BusNumber;
moel@3
    50
    public int DeviceNumber;
moel@1
    51
    public int FunctionNumber;
moel@1
    52
    public int VendorID;
moel@1
    53
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    54
    public string AdapterName;
moel@1
    55
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    56
    public string DisplayName;
moel@1
    57
    public int Present;
moel@1
    58
    public int Exist;
moel@1
    59
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    60
    public string DriverPath;
moel@1
    61
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    62
    public string DriverPathExt;
moel@1
    63
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = ADL.ADL_MAX_PATH)]
moel@1
    64
    public string PNPString;
moel@1
    65
    public int OSDisplayIndex;
moel@1
    66
  }
moel@1
    67
moel@1
    68
  [StructLayout(LayoutKind.Sequential)]
moel@165
    69
  internal struct ADLPMActivity {
moel@1
    70
    public int Size;
moel@1
    71
    public int EngineClock;
moel@1
    72
    public int MemoryClock;
moel@1
    73
    public int Vddc;
moel@1
    74
    public int ActivityPercent;
moel@1
    75
    public int CurrentPerformanceLevel;
moel@1
    76
    public int CurrentBusSpeed;
moel@1
    77
    public int CurrentBusLanes;
moel@1
    78
    public int MaximumBusLanes;
moel@1
    79
    public int Reserved;
moel@1
    80
  }
moel@1
    81
moel@1
    82
  [StructLayout(LayoutKind.Sequential)]
moel@165
    83
  internal struct ADLTemperature {
moel@1
    84
    public int Size;
moel@1
    85
    public int Temperature;
moel@1
    86
  }
moel@1
    87
moel@1
    88
  [StructLayout(LayoutKind.Sequential)]
moel@165
    89
  internal struct ADLFanSpeedValue {
moel@1
    90
    public int Size;
moel@1
    91
    public int SpeedType;
moel@1
    92
    public int FanSpeed;
moel@1
    93
    public int Flags;
moel@1
    94
  }
moel@1
    95
moel@1
    96
  [StructLayout(LayoutKind.Sequential)]
moel@165
    97
  internal struct ADLFanSpeedInfo {
moel@1
    98
    public int Size;
moel@1
    99
    public int Flags;
moel@1
   100
    public int MinPercent;
moel@1
   101
    public int MaxPercent;
moel@1
   102
    public int MinRPM;
moel@1
   103
    public int MaxRPM;
moel@1
   104
  }
moel@1
   105
moel@165
   106
  internal class ADL {
moel@1
   107
    public const int ADL_MAX_PATH = 256;
moel@1
   108
    public const int ADL_MAX_ADAPTERS = 40;
moel@1
   109
    public const int ADL_MAX_DISPLAYS = 40;
moel@1
   110
    public const int ADL_MAX_DEVICENAME = 32;
moel@6
   111
    public const int ADL_OK = 0;
moel@15
   112
    public const int ADL_ERR = -1;
moel@1
   113
    public const int ADL_DRIVER_OK = 0;
moel@1
   114
    public const int ADL_MAX_GLSYNC_PORTS = 8;
moel@1
   115
    public const int ADL_MAX_GLSYNC_PORT_LEDS = 8;
moel@1
   116
    public const int ADL_MAX_NUM_DISPLAYMODES = 1024;
moel@1
   117
moel@1
   118
    public const int ADL_DL_FANCTRL_SPEED_TYPE_PERCENT = 1;
moel@1
   119
    public const int ADL_DL_FANCTRL_SPEED_TYPE_RPM = 2;
moel@1
   120
moel@1
   121
    public const int ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ = 1;
moel@1
   122
    public const int ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE = 2;
moel@1
   123
    public const int ADL_DL_FANCTRL_SUPPORTS_RPM_READ = 4;
moel@1
   124
    public const int ADL_DL_FANCTRL_SUPPORTS_RPM_WRITE = 8;
moel@1
   125
moel@3
   126
    public const int ATI_VENDOR_ID1 = 1002;
moel@3
   127
    public const int ATI_VENDOR_ID2 = 0x1002;
moel@3
   128
moel@1
   129
    private delegate int ADL_Main_Control_CreateDelegate(
moel@1
   130
      ADL_Main_Memory_AllocDelegate callback, int enumConnectedAdapters);
moel@1
   131
    private delegate int ADL_Adapter_AdapterInfo_GetDelegate(IntPtr info,
moel@1
   132
      int size);
moel@1
   133
moel@1
   134
    public delegate int ADL_Main_Control_DestroyDelegate();
moel@1
   135
    public delegate int ADL_Adapter_NumberOfAdapters_GetDelegate(
moel@1
   136
      ref int numAdapters);    
moel@1
   137
    public delegate int ADL_Adapter_ID_GetDelegate(int adapterIndex,
moel@1
   138
      out int adapterID);
moel@12
   139
    public delegate int ADL_Display_AdapterID_GetDelegate(int adapterIndex,
moel@12
   140
      out int adapterID);      	
moel@1
   141
    public delegate int ADL_Adapter_Active_GetDelegate(int adapterIndex,
moel@1
   142
      out int status);
moel@1
   143
    public delegate int ADL_Overdrive5_CurrentActivity_GetDelegate(
moel@1
   144
      int iAdapterIndex, ref ADLPMActivity activity);
moel@1
   145
    public delegate int ADL_Overdrive5_Temperature_GetDelegate(int adapterIndex,
moel@1
   146
        int thermalControllerIndex, ref ADLTemperature temperature);
moel@1
   147
    public delegate int ADL_Overdrive5_FanSpeed_GetDelegate(int adapterIndex,
moel@1
   148
        int thermalControllerIndex, ref	ADLFanSpeedValue fanSpeedValue);
moel@1
   149
    public delegate int ADL_Overdrive5_FanSpeedInfo_GetDelegate(
moel@1
   150
      int adapterIndex, int thermalControllerIndex,
moel@1
   151
      ref ADLFanSpeedInfo fanSpeedInfo);
moel@1
   152
moel@1
   153
    private static ADL_Main_Control_CreateDelegate
moel@1
   154
      _ADL_Main_Control_Create;
moel@1
   155
    private static ADL_Adapter_AdapterInfo_GetDelegate
moel@1
   156
      _ADL_Adapter_AdapterInfo_Get;
moel@1
   157
moel@167
   158
    public static ADL_Main_Control_DestroyDelegate
moel@1
   159
      ADL_Main_Control_Destroy;
moel@1
   160
    public static ADL_Adapter_NumberOfAdapters_GetDelegate
moel@1
   161
      ADL_Adapter_NumberOfAdapters_Get;
moel@12
   162
    public static ADL_Adapter_ID_GetDelegate 
moel@12
   163
      _ADL_Adapter_ID_Get;
moel@12
   164
    public static ADL_Display_AdapterID_GetDelegate 
moel@12
   165
      _ADL_Display_AdapterID_Get;
moel@12
   166
    public static ADL_Adapter_Active_GetDelegate 
moel@1
   167
      ADL_Adapter_Active_Get;
moel@1
   168
    public static ADL_Overdrive5_CurrentActivity_GetDelegate
moel@1
   169
      ADL_Overdrive5_CurrentActivity_Get;
moel@1
   170
    public static ADL_Overdrive5_Temperature_GetDelegate
moel@1
   171
      ADL_Overdrive5_Temperature_Get;
moel@1
   172
    public static ADL_Overdrive5_FanSpeed_GetDelegate
moel@1
   173
      ADL_Overdrive5_FanSpeed_Get;
moel@1
   174
    public static ADL_Overdrive5_FanSpeedInfo_GetDelegate
moel@1
   175
      ADL_Overdrive5_FanSpeedInfo_Get;
moel@1
   176
moel@8
   177
    private static string dllName;
moel@1
   178
moel@1
   179
    private static void GetDelegate<T>(string entryPoint, out T newDelegate)
moel@1
   180
      where T : class 
moel@1
   181
    {
moel@8
   182
      DllImportAttribute attribute = new DllImportAttribute(dllName);
moel@1
   183
      attribute.CallingConvention = CallingConvention.StdCall;
moel@1
   184
      attribute.PreserveSig = true;
moel@1
   185
      attribute.EntryPoint = entryPoint;
moel@1
   186
      PInvokeDelegateFactory.CreateDelegate(attribute, out newDelegate);
moel@1
   187
    }
moel@1
   188
moel@8
   189
    private static void CreateDelegates(string name) {
moel@195
   190
      int p = (int)Environment.OSVersion.Platform;
moel@8
   191
      if ((p == 4) || (p == 128))
moel@8
   192
        dllName = name + ".so";
moel@8
   193
      else
moel@8
   194
        dllName = name + ".dll";
moel@8
   195
moel@8
   196
      GetDelegate("ADL_Main_Control_Create",
moel@8
   197
        out _ADL_Main_Control_Create);
moel@8
   198
      GetDelegate("ADL_Adapter_AdapterInfo_Get",
moel@8
   199
        out _ADL_Adapter_AdapterInfo_Get);
moel@8
   200
      GetDelegate("ADL_Main_Control_Destroy",
moel@8
   201
        out ADL_Main_Control_Destroy);
moel@8
   202
      GetDelegate("ADL_Adapter_NumberOfAdapters_Get",
moel@8
   203
        out ADL_Adapter_NumberOfAdapters_Get);
moel@8
   204
      GetDelegate("ADL_Adapter_ID_Get",
moel@12
   205
        out _ADL_Adapter_ID_Get);
moel@12
   206
      GetDelegate("ADL_Display_AdapterID_Get", 
moel@12
   207
        out _ADL_Display_AdapterID_Get);
moel@8
   208
      GetDelegate("ADL_Adapter_Active_Get",
moel@8
   209
        out ADL_Adapter_Active_Get);
moel@8
   210
      GetDelegate("ADL_Overdrive5_CurrentActivity_Get",
moel@8
   211
        out ADL_Overdrive5_CurrentActivity_Get);
moel@8
   212
      GetDelegate("ADL_Overdrive5_Temperature_Get",
moel@8
   213
        out ADL_Overdrive5_Temperature_Get);
moel@8
   214
      GetDelegate("ADL_Overdrive5_FanSpeed_Get",
moel@8
   215
        out ADL_Overdrive5_FanSpeed_Get);
moel@8
   216
      GetDelegate("ADL_Overdrive5_FanSpeedInfo_Get",
moel@8
   217
        out ADL_Overdrive5_FanSpeedInfo_Get);
moel@8
   218
    }
moel@8
   219
moel@1
   220
    static ADL() {
moel@8
   221
      CreateDelegates("atiadlxx");
moel@1
   222
    }
moel@1
   223
moel@1
   224
    private ADL() { }
moel@1
   225
moel@1
   226
    public static int ADL_Main_Control_Create(int enumConnectedAdapters) {
moel@8
   227
      try {
moel@160
   228
        try {
moel@160
   229
          return _ADL_Main_Control_Create(Main_Memory_Alloc,
moel@160
   230
            enumConnectedAdapters);
moel@160
   231
        } catch {
moel@160
   232
          CreateDelegates("atiadlxy");
moel@160
   233
          return _ADL_Main_Control_Create(Main_Memory_Alloc,
moel@160
   234
            enumConnectedAdapters);
moel@160
   235
        }
moel@160
   236
      } catch {
moel@195
   237
        return ADL_ERR;
moel@8
   238
      }
moel@1
   239
    }
moel@1
   240
moel@1
   241
    public static int ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo[] info) {
moel@1
   242
      int elementSize = Marshal.SizeOf(typeof(ADLAdapterInfo));
moel@1
   243
      int size = info.Length * elementSize;
moel@1
   244
      IntPtr ptr = Marshal.AllocHGlobal(size);
moel@1
   245
      int result = _ADL_Adapter_AdapterInfo_Get(ptr, size);
moel@1
   246
      for (int i = 0; i < info.Length; i++)
moel@1
   247
        info[i] = (ADLAdapterInfo)
moel@1
   248
          Marshal.PtrToStructure((IntPtr)((long)ptr + i * elementSize),
moel@1
   249
          typeof(ADLAdapterInfo));
moel@1
   250
      Marshal.FreeHGlobal(ptr);
moel@1
   251
      return result;
moel@1
   252
    }
moel@1
   253
moel@12
   254
    public static int ADL_Adapter_ID_Get(int adapterIndex,
moel@12
   255
      out int adapterID) {
moel@12
   256
      try {
moel@12
   257
        return _ADL_Adapter_ID_Get(adapterIndex, out adapterID);
moel@12
   258
      } catch (EntryPointNotFoundException) {
moel@12
   259
        try {
moel@12
   260
          return _ADL_Display_AdapterID_Get(adapterIndex, out adapterID);
moel@12
   261
        } catch (EntryPointNotFoundException) {
moel@12
   262
          adapterID = 1;
moel@12
   263
          return ADL_OK;
moel@12
   264
        }
moel@12
   265
      }
moel@12
   266
    }
moel@12
   267
moel@1
   268
    private delegate IntPtr ADL_Main_Memory_AllocDelegate(int size);
moel@1
   269
moel@200
   270
    // create a Main_Memory_Alloc delegate and keep it alive
moel@200
   271
    private static ADL_Main_Memory_AllocDelegate Main_Memory_Alloc =
moel@200
   272
      delegate(int size) {
moel@200
   273
        return Marshal.AllocHGlobal(size);
moel@200
   274
      };
moel@1
   275
moel@1
   276
    private static void Main_Memory_Free(IntPtr buffer) {
moel@1
   277
      if (IntPtr.Zero != buffer)
moel@1
   278
        Marshal.FreeHGlobal(buffer);
moel@1
   279
    }
moel@1
   280
  }
moel@1
   281
}