Beispiel #1
0
        public void Run()
        {
            int num = 0;

            while (!this.stopEvent.WaitOne(num))
            {
                if (this.hHwLib == IntPtr.Zero)
                {
                    return;
                }
                WDHWLib.DRIVE_BAY_PRESENCE_DATA drive_BAY_PRESENCE_DATA = default(WDHWLib.DRIVE_BAY_PRESENCE_DATA);
                drive_BAY_PRESENCE_DATA.presenceChanged = 0u;
                WDHWLib.HWStatus hwstatus = WDHWLib.HWWaitForDriveBayChange(this.hHwLib, ref drive_BAY_PRESENCE_DATA);
                if (hwstatus != WDHWLib.HWStatus.HW_STATUS_OK)
                {
                    if (num == 0)
                    {
                        Logger.Warn("Wait for bay change failed: {0}", new object[]
                        {
                            hwstatus.ToString()
                        });
                        num = 10000;
                    }
                }
                else
                {
                    if (drive_BAY_PRESENCE_DATA.presenceChanged != 0u)
                    {
                        this.Update();
                    }
                    num = 0;
                }
            }
        }
Beispiel #2
0
 public void Dispose()
 {
     if (Handle != IntPtr.Zero)
     {
         WDHWLib.HWCloseHandle(Handle);
     }
 }
Beispiel #3
0
        private static int NumberOfProcessors(HardwareHandler handler)
        {
            var numberOfProcessors = default(int);

            WDHWLib.HWGetNumCpu(handler.Handle, ref numberOfProcessors);
            return(numberOfProcessors);
        }
Beispiel #4
0
 public bool SetBayPower(DriveBay bay, bool power)
 {
     if (bay.ControlPort == -1 || bay.IsBoot)
     {
         return(false);
     }
     lock (this.hwSyncObj)
     {
         Logger.Info("Setting bay {0} power = {1}", new object[]
         {
             bay.Number,
             power
         });
         WDHWLib.HWStatus hwstatus = WDHWLib.HWSetDriveBayPower(this.hHwLib, (uint)bay.ControlPort, power);
         if (hwstatus != WDHWLib.HWStatus.HW_STATUS_OK)
         {
             Logger.Warn("Failed to set drive bay power {0}={1}: {2}", new object[]
             {
                 bay.ControlPort,
                 power,
                 hwstatus.ToString()
             });
             return(false);
         }
     }
     return(true);
 }
Beispiel #5
0
 public bool GetBayStatus(ref DriveBay bay)
 {
     if (bay.ControlPort == -1)
     {
         return(false);
     }
     lock (this.hwSyncObj)
     {
         WDHWLib.DRIVE_BAY_STATUS_DATA drive_BAY_STATUS_DATA = default(WDHWLib.DRIVE_BAY_STATUS_DATA);
         drive_BAY_STATUS_DATA.bay     = (uint)bay.ControlPort;
         drive_BAY_STATUS_DATA.power   = 0;
         drive_BAY_STATUS_DATA.present = 0;
         WDHWLib.HWStatus hwstatus;
         if (bay.IsBoot)
         {
             hwstatus = WDHWLib.HWGetBootDriveBayStatus(this.hHwLib, (uint)bay.ControlPort, ref drive_BAY_STATUS_DATA);
         }
         else
         {
             hwstatus = WDHWLib.HWGetDriveBayStatus(this.hHwLib, (uint)bay.ControlPort, ref drive_BAY_STATUS_DATA);
         }
         if (hwstatus != WDHWLib.HWStatus.HW_STATUS_OK)
         {
             return(false);
         }
         bay.Power   = (drive_BAY_STATUS_DATA.power == 1);
         bay.Present = (drive_BAY_STATUS_DATA.present == 1);
     }
     return(true);
 }
Beispiel #6
0
        public HardwareHandler()
        {
            Handle = WDHWLib.HWOpenHandle();

            if (Handle == IntPtr.Zero)
            {
                throw new InvalidOperationException("Could not retrieve a HWLib handle");
            }
        }
Beispiel #7
0
 public int GetFanRPM(FanType fanType)
 {
     using (var handler = new HardwareHandler())
     {
         var rpm = default(int);
         WDHWLib.HWGetFanRPM(handler.Handle, 0, (WDHWLib.FAN_TYPE)fanType, ref rpm);
         return(rpm);
     }
 }
Beispiel #8
0
 public void Dispose()
 {
     this.Stop();
     if (this.hHwLib != IntPtr.Zero)
     {
         WDHWLib.HWCloseHandle(this.hHwLib);
         this.hHwLib = IntPtr.Zero;
     }
     GC.SuppressFinalize(this);
 }
Beispiel #9
0
 public void Dispose()
 {
     if (this.hHwLib != IntPtr.Zero)
     {
         lock (this.hwSyncObj)
         {
             WDHWLib.HWCloseHandle(this.hHwLib);
             this.hHwLib = IntPtr.Zero;
         }
     }
     GC.SuppressFinalize(this);
 }
Beispiel #10
0
 public virtual StorApiStatus Stop()
 {
     if (this.updateThread.IsAlive)
     {
         this.stopEvent.Set();
         if (this.hHwLib != IntPtr.Zero)
         {
             WDHWLib.HWCancelWaitForDriveBayChange(this.hHwLib);
         }
         this.updateThread.Join();
     }
     return(StorApiStatusEnum.STOR_NO_ERROR);
 }
Beispiel #11
0
 public SystemInfo GetSystemInfo()
 {
     using (var handler = new HardwareHandler())
     {
         var systemInfo = default(WDHWLib.SYS_INFO);
         WDHWLib.HWGetSysInfo(handler.Handle, ref systemInfo);
         return(new SystemInfo
         {
             BackplaneId = systemInfo.backplaneId,
             NumberOfBays = systemInfo.numBays
         });
     }
 }
Beispiel #12
0
        public void SetFanPWM(FanType fanType, int pwm)
        {
            if (pwm < 35 || pwm > 100)
            {
                throw new ArgumentException($"Fan PWM '{pwm}' for fan type '{fanType}' is outside of the allowed range [35-100]");
            }

            using (var handler = new HardwareHandler())
            {
                var status = WDHWLib.HWSetFanSpeed(handler.Handle, 0, (WDHWLib.FAN_TYPE)fanType, (byte)pwm);
                if (status != WDHWLib.HWStatus.HW_STATUS_OK)
                {
                    throw new InvalidOperationException($"Failed to set fan '{fanType}' speed to '{pwm}' with error code '{status}'");
                }
            }
        }
Beispiel #13
0
        public void Beep(uint frequency, TimeSpan duration)
        {
            if (frequency > 32000)
            {
                throw  new ArgumentException($"The provided frequency '{frequency}'Hz is outside of the accepted range [0-32000]Hz");
            }
            if (duration <= TimeSpan.Zero || duration > TimeSpan.FromSeconds(10))
            {
                throw new ArgumentException($"The provided duration '{duration.Milliseconds}'ms is outside of the allowed range ]0-10]s");
            }

            using (var handler = new HardwareHandler())
            {
                WDHWLib.HWBeep(handler.Handle, frequency, (uint)duration.Milliseconds);
            }
        }
Beispiel #14
0
 public virtual StorApiStatus Initialize()
 {
     if (this.hHwLib == IntPtr.Zero)
     {
         this.hHwLib = WDHWLib.HWOpenHandle();
         if (this.hHwLib == IntPtr.Zero)
         {
             Logger.Error("Failed to open HW lib handle!", new object[0]);
             return(StorApiStatusEnum.STOR_INIT_FAILED);
         }
     }
     this.Update();
     foreach (DriveBay driveBay in this.bays)
     {
         if (!driveBay.Power)
         {
             driveBay.SetPower(true);
         }
     }
     return(StorApiStatusEnum.STOR_NO_ERROR);
 }
Beispiel #15
0
        public DigitalTemperatureSensorData GetProcessorTemperature(int processorIndex)
        {
            using (var handler = new HardwareHandler())
            {
                var numberOfProcessors = NumberOfProcessors(handler);
                if (processorIndex >= numberOfProcessors)
                {
                    throw new ArgumentException($"The processor index '{processorIndex}' exceeds the maximum number of processors {numberOfProcessors}");
                }

                var hardwareStatus = WDHWLib.HWStatus.HW_STATUS_ERROR;
                var digitalTemperatureSensorData = default(WDHWLib.DTS_DATA);

                for (var i = 0; i < RetryStrategy; i++)
                {
                    hardwareStatus = WDHWLib.HWGetCpuDTS(handler.Handle, processorIndex, ref digitalTemperatureSensorData);
                    if (hardwareStatus == WDHWLib.HWStatus.HW_STATUS_OK)
                    {
                        break;
                    }
                    Thread.Sleep(100);
                }
                if (hardwareStatus != WDHWLib.HWStatus.HW_STATUS_OK)
                {
                    throw new TimeoutException($"Processor temperature for CPU #'{processorIndex}' could not be retrieved after {RetryStrategy} retries");
                }

                return(new DigitalTemperatureSensorData
                {
                    RawValue = digitalTemperatureSensorData.rawValue,
                    Valid = digitalTemperatureSensorData.valid,
                    DtsValue = digitalTemperatureSensorData.dtsValue,
                    InterprettedDtsValue = digitalTemperatureSensorData.interprettedDtsValue,
                    CriticalTemperatureStatus = digitalTemperatureSensorData.critTempStatus,
                    TemperatureStatus = digitalTemperatureSensorData.tempStatus,
                });
            }
        }
Beispiel #16
0
 public DriveBayHW()
 {
     this.hHwLib = WDHWLib.HWOpenHandle();
 }