moel@1: /*
moel@1:  
moel@344:   This Source Code Form is subject to the terms of the Mozilla Public
moel@344:   License, v. 2.0. If a copy of the MPL was not distributed with this
moel@344:   file, You can obtain one at http://mozilla.org/MPL/2.0/.
moel@1:  
moel@344:   Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
moel@344: 	
moel@1: */
moel@1: 
moel@1: using System;
moel@1: using System.Collections.Generic;
moel@166: using System.Globalization;
moel@1: using System.Text;
moel@1: 
moel@1: namespace OpenHardwareMonitor.Hardware.ATI {
moel@165:   internal class ATIGroup : IGroup {
moel@1: 
moel@195:     private readonly List<ATIGPU> hardware = new List<ATIGPU>();
moel@195:     private readonly StringBuilder report = new StringBuilder();
moel@1: 
moel@165:     public ATIGroup(ISettings settings) {
moel@1:       try {
moel@6:         int status = ADL.ADL_Main_Control_Create(1);
moel@6: 
moel@6:         report.AppendLine("AMD Display Library");
moel@6:         report.AppendLine();
moel@6:         report.Append("Status: ");
moel@195:         report.AppendLine(status == ADL.ADL_OK ? "OK" : 
moel@195:           status.ToString(CultureInfo.InvariantCulture));
moel@6:         report.AppendLine();
moel@6: 
moel@6:         if (status == ADL.ADL_OK) {
moel@1:           int numberOfAdapters = 0;
moel@1:           ADL.ADL_Adapter_NumberOfAdapters_Get(ref numberOfAdapters);
moel@6:           
moel@35:           report.Append("Number of adapters: "); 
moel@166:           report.AppendLine(numberOfAdapters.ToString(CultureInfo.InvariantCulture));
moel@1:           report.AppendLine();
moel@1: 
moel@1:           if (numberOfAdapters > 0) {
moel@1:             ADLAdapterInfo[] adapterInfo = new ADLAdapterInfo[numberOfAdapters];
moel@6:             if (ADL.ADL_Adapter_AdapterInfo_Get(adapterInfo) == ADL.ADL_OK)
moel@1:               for (int i = 0; i < numberOfAdapters; i++) {
moel@1:                 int isActive;
moel@1:                 ADL.ADL_Adapter_Active_Get(adapterInfo[i].AdapterIndex,
moel@1:                   out isActive);
moel@29:                 int adapterID;
moel@29:                 ADL.ADL_Adapter_ID_Get(adapterInfo[i].AdapterIndex,
moel@29:                   out adapterID);
moel@1: 
moel@1:                 report.Append("AdapterIndex: "); 
moel@166:                 report.AppendLine(i.ToString(CultureInfo.InvariantCulture));
moel@1:                 report.Append("isActive: "); 
moel@166:                 report.AppendLine(isActive.ToString(CultureInfo.InvariantCulture));
moel@1:                 report.Append("AdapterName: "); 
moel@1:                 report.AppendLine(adapterInfo[i].AdapterName);     
moel@1:                 report.Append("UDID: ");
moel@1:                 report.AppendLine(adapterInfo[i].UDID);
moel@3:                 report.Append("Present: ");
moel@166:                 report.AppendLine(adapterInfo[i].Present.ToString(
moel@166:                   CultureInfo.InvariantCulture));
moel@333:                 report.Append("VendorID: 0x");
moel@333:                 report.AppendLine(adapterInfo[i].VendorID.ToString("X",
moel@166:                   CultureInfo.InvariantCulture));
moel@3:                 report.Append("BusNumber: ");
moel@166:                 report.AppendLine(adapterInfo[i].BusNumber.ToString(
moel@166:                   CultureInfo.InvariantCulture));
moel@3:                 report.Append("DeviceNumber: ");
moel@166:                 report.AppendLine(adapterInfo[i].DeviceNumber.ToString(
moel@166:                  CultureInfo.InvariantCulture));
moel@3:                 report.Append("FunctionNumber: ");
moel@166:                 report.AppendLine(adapterInfo[i].FunctionNumber.ToString(
moel@166:                   CultureInfo.InvariantCulture));
moel@29:                 report.Append("AdapterID: 0x");
moel@270:                 report.AppendLine(adapterID.ToString("X", 
moel@270:                   CultureInfo.InvariantCulture));
moel@1: 
moel@270:                 if (!string.IsNullOrEmpty(adapterInfo[i].UDID) &&
moel@333:                   adapterInfo[i].VendorID == ADL.ATI_VENDOR_ID) 
moel@333:                 {
moel@29:                   bool found = false;
moel@29:                   foreach (ATIGPU gpu in hardware)
moel@29:                     if (gpu.BusNumber == adapterInfo[i].BusNumber &&
moel@29:                       gpu.DeviceNumber == adapterInfo[i].DeviceNumber) {
moel@29:                       found = true;
moel@29:                       break;
moel@29:                     }
moel@29:                   if (!found)
moel@29:                     hardware.Add(new ATIGPU(
moel@29:                       adapterInfo[i].AdapterName.Trim(),
moel@29:                       adapterInfo[i].AdapterIndex,
moel@29:                       adapterInfo[i].BusNumber,
moel@165:                       adapterInfo[i].DeviceNumber, settings));
moel@1:                 }
moel@11: 
moel@11:                 report.AppendLine();
moel@1:               }
moel@1:           }
moel@1:         }
moel@11:       } catch (DllNotFoundException) { } 
moel@11:         catch (EntryPointNotFoundException e) {
moel@11:           report.AppendLine();
moel@11:           report.AppendLine(e.ToString());
moel@11:           report.AppendLine();        
moel@11:         }
moel@1:     }
moel@1: 
moel@1:     public IHardware[] Hardware {
moel@1:       get {
moel@1:         return hardware.ToArray();
moel@1:       }
moel@1:     }
moel@1: 
moel@1:     public string GetReport() {
moel@1:       return report.ToString();
moel@1:     }
moel@1: 
moel@1:     public void Close() {
moel@1:       try {
moel@247:         foreach (ATIGPU gpu in hardware)
moel@247:           gpu.Close();
moel@1:         ADL.ADL_Main_Control_Destroy();
moel@1:       } catch (Exception) { }
moel@1:     }
moel@1:   }
moel@1: }