/** * Oshi (https://github.com/oshi/oshi) * * Copyright (c) 2010 - 2017 The Oshi Project Team * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Maintainers: * dblock[at]dblock[dot]org * widdis[at]gmail[dot]com * enrico.bianchi[at]gmail[dot]com * * Contributors: * https://github.com/oshi/oshi/graphs/contributors */ package oshi.hardware.platform.mac; import java.util.Arrays; import oshi.hardware.Sensors; import oshi.jna.platform.mac.IOKit; import oshi.util.platform.mac.SmcUtil; public class MacSensors implements Sensors { private static final long serialVersionUID = 1L; // Store some things to throttle SMC queries private double lastTemp = 0d; private long lastTempTime; private int numFans = 0; private int[] lastFanSpeeds = new int[0]; private long lastFanSpeedsTime; private double lastVolts = 0d; private long lastVoltsTime; public MacSensors() { SmcUtil.smcOpen(); // Do an initial read of temperature and fan speeds. This caches initial // dataInfo and improves success of future queries this.lastTemp = getCpuTemperature(); this.lastFanSpeeds = getFanSpeeds(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { SmcUtil.smcClose(); } }); } /** * {@inheritDoc} */ @Override public double getCpuTemperature() { // Only update every second if (System.currentTimeMillis() - this.lastTempTime > 900) { double temp = SmcUtil.smcGetSp78(IOKit.SMC_KEY_CPU_TEMP, 50); if (temp > 0d) { this.lastTemp = temp; this.lastTempTime = System.currentTimeMillis(); } } return this.lastTemp; } /** * {@inheritDoc} */ @Override public int[] getFanSpeeds() { // Only update every second if (System.currentTimeMillis() - this.lastFanSpeedsTime > 900) { // If we don't have fan # try to get it if (this.numFans == 0) { this.numFans = (int) SmcUtil.smcGetLong(IOKit.SMC_KEY_FAN_NUM, 50); this.lastFanSpeeds = new int[this.numFans]; } for (int i = 0; i < this.numFans; i++) { int speed = (int) SmcUtil.smcGetFpe2(String.format(IOKit.SMC_KEY_FAN_SPEED, i), 50); if (speed > 0) { this.lastFanSpeeds[i] = speed; this.lastFanSpeedsTime = System.currentTimeMillis(); } } } // Make a copy to return return Arrays.copyOf(this.lastFanSpeeds, this.lastFanSpeeds.length); } /** * {@inheritDoc} */ @Override public double getCpuVoltage() { // Only update every second if (System.currentTimeMillis() - this.lastVoltsTime > 900) { double kiloVolts = SmcUtil.smcGetFpe2(IOKit.SMC_KEY_CPU_VOLTAGE, 50); if (kiloVolts > 0d) { this.lastVolts = kiloVolts / 1000d; this.lastVoltsTime = System.currentTimeMillis(); } } return this.lastVolts; } }