Merge "thermal: add usage of IThermal."
diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java
index 6dec0dc..2b00ecb 100644
--- a/core/java/android/os/HardwarePropertiesManager.java
+++ b/core/java/android/os/HardwarePropertiesManager.java
@@ -55,9 +55,7 @@
public @interface TemperatureSource {}
/**
- * Device temperature types. These must match the values in
- * frameworks/native/include/hardwareproperties/HardwarePropertiesManager.h
- * TODO(b/32022261) Remove this comment.
+ * Device temperature types.
*/
/** Temperature of CPUs in Celsius. */
public static final int DEVICE_TEMPERATURE_CPU = Constants.TemperatureType.CPU;
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index 2c46413..3a9ff5f 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -73,3 +73,4 @@
android.hardware.vr@1.0 \
android.hardware.audio.common@2.0 \
android.hardware.tv.input@1.0 \
+ android.hardware.thermal@1.0 \
diff --git a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
index 14d50ce..a385704 100644
--- a/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
+++ b/services/core/jni/com_android_server_HardwarePropertiesManagerService.cpp
@@ -21,7 +21,7 @@
#include <stdlib.h>
-#include <hardware/thermal.h>
+#include <android/hardware/thermal/1.0/IThermal.h>
#include <utils/Log.h>
#include <utils/String8.h>
@@ -29,6 +29,15 @@
namespace android {
+using hardware::hidl_vec;
+using hardware::Status;
+using hardware::thermal::V1_0::CoolingDevice;
+using hardware::thermal::V1_0::CpuUsage;
+using hardware::thermal::V1_0::IThermal;
+using hardware::thermal::V1_0::Temperature;
+using hardware::thermal::V1_0::ThermalStatus;
+using hardware::thermal::V1_0::ThermalStatusCode;
+
// ---------------------------------------------------------------------------
// These values must be kept in sync with the temperature source constants in
@@ -45,136 +54,129 @@
jmethodID initMethod;
} gCpuUsageInfoClassInfo;
-jfloat gUndefinedTemperature;
-
-static struct thermal_module* gThermalModule;
+static sp<IThermal> gThermalModule;
// ----------------------------------------------------------------------------
static void nativeInit(JNIEnv* env, jobject obj) {
- status_t err = hw_get_module(THERMAL_HARDWARE_MODULE_ID, (hw_module_t const**)&gThermalModule);
- if (err) {
- ALOGE("Couldn't load %s module (%s)", THERMAL_HARDWARE_MODULE_ID, strerror(-err));
+ // TODO(b/31632518)
+ if (gThermalModule == nullptr) {
+ gThermalModule = IThermal::getService("thermal");
+ }
+
+ if (gThermalModule == nullptr) {
+ ALOGE("Undable to get Thermal service.");
}
}
static jfloatArray nativeGetFanSpeeds(JNIEnv *env, jclass /* clazz */) {
- if (gThermalModule && gThermalModule->getCoolingDevices) {
- ssize_t list_size = gThermalModule->getCoolingDevices(gThermalModule, nullptr, 0);
-
- if (list_size >= 0) {
- cooling_device_t *list = (cooling_device_t *)
- malloc(list_size * sizeof(cooling_device_t));
- ssize_t size = gThermalModule->getCoolingDevices(gThermalModule, list, list_size);
- if (size >= 0) {
- if (list_size > size) {
- list_size = size;
- }
- jfloat values[list_size];
- for (ssize_t i = 0; i < list_size; ++i) {
- values[i] = list[i].current_value;
- }
-
- jfloatArray fanSpeeds = env->NewFloatArray(list_size);
- env->SetFloatArrayRegion(fanSpeeds, 0, list_size, values);
- free(list);
- return fanSpeeds;
- }
-
- free(list);
- }
-
- ALOGE("Cloudn't get fan speeds because of HAL error");
+ if (gThermalModule == nullptr) {
+ ALOGE("Couldn't get fan speeds because of HAL error.");
+ return env->NewFloatArray(0);
}
- return env->NewFloatArray(0);
+
+ hidl_vec<CoolingDevice> list;
+ Status status = gThermalModule->getCoolingDevices(
+ [&list](ThermalStatus status, hidl_vec<CoolingDevice> devices) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(devices);
+ } else {
+ ALOGE("Couldn't get fan speeds because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getCoolingDevices failed status: %d", status.exceptionCode());
+ }
+
+ float values[list.size()];
+ for (size_t i = 0; i < list.size(); ++i) {
+ values[i] = list[i].currentValue;
+ }
+ jfloatArray fanSpeeds = env->NewFloatArray(list.size());
+ env->SetFloatArrayRegion(fanSpeeds, 0, list.size(), values);
+ return fanSpeeds;
}
static jfloatArray nativeGetDeviceTemperatures(JNIEnv *env, jclass /* clazz */, int type,
int source) {
- if (gThermalModule && gThermalModule->getTemperatures) {
- ssize_t list_size = gThermalModule->getTemperatures(gThermalModule, nullptr, 0);
- if (list_size >= 0) {
- temperature_t *list = (temperature_t *) malloc(list_size * sizeof(temperature_t));
- ssize_t size = gThermalModule->getTemperatures(gThermalModule, list, list_size);
- if (size >= 0) {
- if (list_size > size) {
- list_size = size;
- }
-
- jfloat values[list_size];
- size_t length = 0;
-
- for (ssize_t i = 0; i < list_size; ++i) {
- if (list[i].type == type) {
- switch (source) {
- case TEMPERATURE_CURRENT:
- if (list[i].current_value == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].current_value;
- }
- break;
- case TEMPERATURE_THROTTLING:
- if (list[i].throttling_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].throttling_threshold;
- }
- break;
- case TEMPERATURE_SHUTDOWN:
- if (list[i].shutdown_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].shutdown_threshold;
- }
- break;
- case TEMPERATURE_THROTTLING_BELOW_VR_MIN:
- if (list[i].vr_throttling_threshold == UNKNOWN_TEMPERATURE) {
- values[length++] = gUndefinedTemperature;
- } else {
- values[length++] = list[i].vr_throttling_threshold;
- }
- break;
- }
- }
- }
- jfloatArray deviceTemps = env->NewFloatArray(length);
- env->SetFloatArrayRegion(deviceTemps, 0, length, values);
- free(list);
- return deviceTemps;
- }
- free(list);
- }
- ALOGE("Couldn't get device temperatures because of HAL error");
+ if (gThermalModule == nullptr) {
+ ALOGE("Couldn't get device temperatures because of HAL error.");
+ return env->NewFloatArray(0);
}
- return env->NewFloatArray(0);
+ hidl_vec<Temperature> list;
+ Status status = gThermalModule->getTemperatures(
+ [&list](ThermalStatus status, hidl_vec<Temperature> temperatures) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(temperatures);
+ } else {
+ ALOGE("Couldn't get temperatures because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getDeviceTemperatures failed status: %d", status.exceptionCode());
+ }
+
+ jfloat values[list.size()];
+ size_t length = 0;
+ for (size_t i = 0; i < list.size(); ++i) {
+ if (static_cast<int>(list[i].type) == type) {
+ switch (source) {
+ case TEMPERATURE_CURRENT:
+ values[length++] = list[i].currentValue;
+ break;
+ case TEMPERATURE_THROTTLING:
+ values[length++] = list[i].throttlingThreshold;
+ break;
+ case TEMPERATURE_SHUTDOWN:
+ values[length++] = list[i].shutdownThreshold;
+ break;
+ case TEMPERATURE_THROTTLING_BELOW_VR_MIN:
+ values[length++] = list[i].vrThrottlingThreshold;
+ break;
+ }
+ }
+ }
+ jfloatArray deviceTemps = env->NewFloatArray(length);
+ env->SetFloatArrayRegion(deviceTemps, 0, length, values);
+ return deviceTemps;
}
static jobjectArray nativeGetCpuUsages(JNIEnv *env, jclass /* clazz */) {
- if (gThermalModule && gThermalModule->getCpuUsages
- && gCpuUsageInfoClassInfo.initMethod) {
- ssize_t size = gThermalModule->getCpuUsages(gThermalModule, nullptr);
- if (size >= 0) {
- cpu_usage_t *list = (cpu_usage_t *) malloc(size * sizeof(cpu_usage_t));
- size = gThermalModule->getCpuUsages(gThermalModule, list);
- if (size >= 0) {
- jobjectArray cpuUsages = env->NewObjectArray(size, gCpuUsageInfoClassInfo.clazz,
- nullptr);
- for (ssize_t i = 0; i < size; ++i) {
- if (list[i].is_online) {
- jobject cpuUsage = env->NewObject(gCpuUsageInfoClassInfo.clazz,
- gCpuUsageInfoClassInfo.initMethod, list[i].active, list[i].total);
- env->SetObjectArrayElement(cpuUsages, i, cpuUsage);
- }
- }
- free(list);
- return cpuUsages;
- }
- free(list);
- }
- ALOGE("Couldn't get CPU usages because of HAL error");
+ if (gThermalModule == nullptr || !gCpuUsageInfoClassInfo.initMethod) {
+ ALOGE("Couldn't get CPU usages because of HAL error.");
+ return env->NewObjectArray(0, gCpuUsageInfoClassInfo.clazz, nullptr);
}
- return env->NewObjectArray(0, gCpuUsageInfoClassInfo.clazz, nullptr);
+ hidl_vec<CpuUsage> list;
+ Status status = gThermalModule->getCpuUsages(
+ [&list](ThermalStatus status, hidl_vec<CpuUsage> cpuUsages) {
+ if (status.code == ThermalStatusCode::SUCCESS) {
+ list = std::move(cpuUsages);
+ } else {
+ ALOGE("Couldn't get CPU usages because of HAL error: %s",
+ status.debugMessage.c_str());
+ }
+ }).getStatus();
+
+ if (!status.isOk()) {
+ ALOGE("getCpuUsages failed status: %d", status.exceptionCode());
+ }
+
+ jobjectArray cpuUsages = env->NewObjectArray(list.size(), gCpuUsageInfoClassInfo.clazz,
+ nullptr);
+ for (size_t i = 0; i < list.size(); ++i) {
+ if (list[i].isOnline) {
+ jobject cpuUsage = env->NewObject(gCpuUsageInfoClassInfo.clazz,
+ gCpuUsageInfoClassInfo.initMethod,
+ list[i].active,
+ list[i].total);
+ env->SetObjectArrayElement(cpuUsages, i, cpuUsage);
+ }
+ }
+ return cpuUsages;
}
// ----------------------------------------------------------------------------
@@ -200,12 +202,6 @@
gCpuUsageInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
gCpuUsageInfoClassInfo.initMethod = GetMethodIDOrDie(env, gCpuUsageInfoClassInfo.clazz,
"<init>", "(JJ)V");
-
- clazz = env->FindClass("android/os/HardwarePropertiesManager");
- jfieldID undefined_temperature_field = GetStaticFieldIDOrDie(env, clazz,
- "UNDEFINED_TEMPERATURE", "F");
- gUndefinedTemperature = env->GetStaticFloatField(clazz, undefined_temperature_field);
-
return res;
}