thermal: IThermal V1.1, add methods to send thermal throttling events

Add IThermalCallback and IThermal::registerThermalCallback() method.
Frameworks code calls this method to register a callback used by the
IThermal HAL implementation to send thermal events to the framework
ThermalService.

Bug: 30982366
Test: VtsHalThermalV1_1Target on marlin
      manual test on marlin using marlin 1.1 HAL with modified
      thermal-engine.conf and temporary debug code for notification
Change-Id: Ib49ad93a9495e3af515fced4e46f20186661fe07
This commit is contained in:
Todd Poynor 2017-05-23 20:28:15 -07:00
parent cf2cbbfa5d
commit cf964d79c1
7 changed files with 395 additions and 0 deletions

68
thermal/1.1/Android.bp Normal file
View file

@ -0,0 +1,68 @@
// This file is autogenerated by hidl-gen. Do not edit manually.
filegroup {
name: "android.hardware.thermal@1.1_hal",
srcs: [
"IThermal.hal",
"IThermalCallback.hal",
],
}
genrule {
name: "android.hardware.thermal@1.1_genc++",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-sources -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.thermal@1.1",
srcs: [
":android.hardware.thermal@1.1_hal",
],
out: [
"android/hardware/thermal/1.1/ThermalAll.cpp",
"android/hardware/thermal/1.1/ThermalCallbackAll.cpp",
],
}
genrule {
name: "android.hardware.thermal@1.1_genc++_headers",
tools: ["hidl-gen"],
cmd: "$(location hidl-gen) -o $(genDir) -Lc++-headers -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.thermal@1.1",
srcs: [
":android.hardware.thermal@1.1_hal",
],
out: [
"android/hardware/thermal/1.1/IThermal.h",
"android/hardware/thermal/1.1/IHwThermal.h",
"android/hardware/thermal/1.1/BnHwThermal.h",
"android/hardware/thermal/1.1/BpHwThermal.h",
"android/hardware/thermal/1.1/BsThermal.h",
"android/hardware/thermal/1.1/IThermalCallback.h",
"android/hardware/thermal/1.1/IHwThermalCallback.h",
"android/hardware/thermal/1.1/BnHwThermalCallback.h",
"android/hardware/thermal/1.1/BpHwThermalCallback.h",
"android/hardware/thermal/1.1/BsThermalCallback.h",
],
}
cc_library_shared {
name: "android.hardware.thermal@1.1",
defaults: ["hidl-module-defaults"],
generated_sources: ["android.hardware.thermal@1.1_genc++"],
generated_headers: ["android.hardware.thermal@1.1_genc++_headers"],
export_generated_headers: ["android.hardware.thermal@1.1_genc++_headers"],
vendor_available: true,
shared_libs: [
"libhidlbase",
"libhidltransport",
"libhwbinder",
"liblog",
"libutils",
"libcutils",
"android.hardware.thermal@1.0",
],
export_shared_lib_headers: [
"libhidlbase",
"libhidltransport",
"libhwbinder",
"libutils",
"android.hardware.thermal@1.0",
],
}

120
thermal/1.1/Android.mk Normal file
View file

@ -0,0 +1,120 @@
# This file is autogenerated by hidl-gen. Do not edit manually.
LOCAL_PATH := $(call my-dir)
################################################################################
include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.thermal-V1.1-java
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
intermediates := $(call local-generated-sources-dir, COMMON)
HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
LOCAL_JAVA_LIBRARIES := \
android.hardware.thermal-V1.0-java \
android.hidl.base-V1.0-java \
#
# Build IThermal.hal
#
GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal
$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
-Ljava \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport \
android.hardware.thermal@1.1::IThermal
$(GEN): $(LOCAL_PATH)/IThermal.hal
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
#
# Build IThermalCallback.hal
#
GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
-Ljava \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport \
android.hardware.thermal@1.1::IThermalCallback
$(GEN): $(LOCAL_PATH)/IThermalCallback.hal
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
include $(BUILD_JAVA_LIBRARY)
################################################################################
include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.thermal-V1.1-java-static
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
intermediates := $(call local-generated-sources-dir, COMMON)
HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
LOCAL_STATIC_JAVA_LIBRARIES := \
android.hardware.thermal-V1.0-java-static \
android.hidl.base-V1.0-java-static \
#
# Build IThermal.hal
#
GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermal.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermal.hal
$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
-Ljava \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport \
android.hardware.thermal@1.1::IThermal
$(GEN): $(LOCAL_PATH)/IThermal.hal
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
#
# Build IThermalCallback.hal
#
GEN := $(intermediates)/android/hardware/thermal/V1_1/IThermalCallback.java
$(GEN): $(HIDL)
$(GEN): PRIVATE_HIDL := $(HIDL)
$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IThermalCallback.hal
$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
$(GEN): PRIVATE_CUSTOM_TOOL = \
$(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
-Ljava \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport \
android.hardware.thermal@1.1::IThermalCallback
$(GEN): $(LOCAL_PATH)/IThermalCallback.hal
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

31
thermal/1.1/IThermal.hal Normal file
View file

@ -0,0 +1,31 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.thermal@1.1;
import android.hardware.thermal@1.0::IThermal;
import IThermalCallback;
interface IThermal extends @1.0::IThermal {
/**
* Register an IThermalCallback, used by the Thermal HAL
* to send thermal events to the framework thermal service.
*
* @param callback the IThermalCallback to use for sending
* thermal events, or nullptr to set no callback
*/
registerThermalCallback(IThermalCallback callback);
};

View file

@ -0,0 +1,33 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.hardware.thermal@1.1;
import android.hardware.thermal@1.0::Temperature;
/**
* IThermalCallback connects vendor code to the framework binder ThermalService.
*/
interface IThermalCallback {
/**
* Send a thermal throttling start/stop event to all ThermalService
* thermal event listeners.
* @param isThrottling true if device is currently throttling
* @param temperature The temperature associated with the throttling
* start/stop event
*/
oneway notifyThrottling(bool isThrottling, Temperature temperature);
};

View file

@ -0,0 +1,35 @@
//
// Copyright (C) 2017 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
cc_test {
name: "VtsHalThermalV1_1TargetTest",
defaults: ["hidl_defaults"],
srcs: ["VtsHalThermalV1_1TargetTest.cpp"],
shared_libs: [
"liblog",
"libhidlbase",
"libhidltransport",
"libutils",
"android.hardware.thermal@1.0",
"android.hardware.thermal@1.1",
],
static_libs: ["VtsHalHidlTargetTestBase"],
cflags: [
"-O0",
"-g",
],
}

View file

@ -0,0 +1,106 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <android/hardware/thermal/1.1/IThermal.h>
#include <android/hardware/thermal/1.1/IThermalCallback.h>
#include <android/hardware/thermal/1.0/types.h>
#include <VtsHalHidlTargetCallbackBase.h>
#include <VtsHalHidlTargetTestBase.h>
using ::android::hardware::thermal::V1_0::Temperature;
using ::android::hardware::thermal::V1_0::TemperatureType;
using ::android::hardware::thermal::V1_1::IThermal;
using ::android::hardware::thermal::V1_1::IThermalCallback;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;
constexpr char kCallbackNameNotifyThrottling[] = "notifyThrottling";
static const Temperature kThrottleTemp = {
.type = TemperatureType::CPU,
.name = "test temperature sensor",
.currentValue = 98.6,
.throttlingThreshold = 58,
.shutdownThreshold = 60,
.vrThrottlingThreshold = 59,
};
class ThermalCallbackArgs {
public:
bool isThrottling;
Temperature temperature;
};
// Callback class for receiving thermal event notifications from main class
class ThermalCallback
: public ::testing::VtsHalHidlTargetCallbackBase<ThermalCallbackArgs>,
public IThermalCallback {
public:
virtual ~ThermalCallback() = default;
Return<void> notifyThrottling(bool isThrottling,
const Temperature& temperature) override {
ThermalCallbackArgs args;
args.isThrottling = isThrottling;
args.temperature = temperature;
NotifyFromCallback(kCallbackNameNotifyThrottling, args);
return Void();
}
};
// The main test class for THERMAL HIDL HAL 1.1.
class ThermalHidlTest : public ::testing::VtsHalHidlTargetTestBase {
public:
virtual void SetUp() override {
mThermal = ::testing::VtsHalHidlTargetTestBase::getService<IThermal>();
ASSERT_NE(mThermal, nullptr);
mThermalCallback = new(std::nothrow) ThermalCallback();
ASSERT_NE(mThermalCallback, nullptr);
auto ret = mThermal->registerThermalCallback(mThermalCallback);
ASSERT_TRUE(ret.isOk());
}
virtual void TearDown() override {
auto ret = mThermal->registerThermalCallback(nullptr);
ASSERT_TRUE(ret.isOk());
}
protected:
sp<IThermal> mThermal;
sp<ThermalCallback> mThermalCallback;
}; // class ThermalHidlTest
// Test ThermalCallback::notifyThrottling().
// This just calls into and back from our local ThermalCallback impl.
// Note: a real thermal throttling event from the Thermal HAL could be
// inadvertently received here.
TEST_F(ThermalHidlTest, NotifyThrottlingTest) {
auto ret = mThermalCallback->notifyThrottling(true, kThrottleTemp);
ASSERT_TRUE(ret.isOk());
auto res = mThermalCallback->WaitForCallback(kCallbackNameNotifyThrottling);
EXPECT_TRUE(res.no_timeout);
ASSERT_TRUE(res.args);
EXPECT_EQ(true, res.args->isThrottling);
EXPECT_EQ(kThrottleTemp, res.args->temperature);
}
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
int status = RUN_ALL_TESTS();
cout << "Test result = " << status << std::endl;
return status;
}

View file

@ -3,4 +3,6 @@ subdirs = [
"1.0",
"1.0/default",
"1.0/vts/functional",
"1.1",
"1.1/vts/functional",
]