upload android base code part1
This commit is contained in:
parent
e02f198e2d
commit
0a1de6c4b3
48159 changed files with 9071466 additions and 0 deletions
61
android/frameworks/native/services/thermalservice/Android.bp
Normal file
61
android/frameworks/native/services/thermalservice/Android.bp
Normal file
|
@ -0,0 +1,61 @@
|
|||
subdirs = [
|
||||
"libthermalcallback"
|
||||
]
|
||||
|
||||
cc_library {
|
||||
name: "libthermalservice",
|
||||
|
||||
srcs: [
|
||||
"aidl/android/os/IThermalEventListener.aidl",
|
||||
"aidl/android/os/IThermalService.aidl",
|
||||
"aidl/android/os/Temperature.cpp",
|
||||
],
|
||||
aidl: {
|
||||
include_dirs: ["frameworks/native/services/thermalservice/aidl"],
|
||||
export_aidl_headers: true,
|
||||
},
|
||||
export_include_dirs: ["aidl"],
|
||||
|
||||
shared_libs: [
|
||||
"libbinder",
|
||||
"libutils",
|
||||
],
|
||||
|
||||
cflags: [
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-Wunused",
|
||||
"-Wunreachable-code",
|
||||
],
|
||||
}
|
||||
|
||||
cc_binary {
|
||||
name: "thermalserviced",
|
||||
|
||||
srcs: [
|
||||
"ThermalService.cpp",
|
||||
"thermalserviced.cpp",
|
||||
],
|
||||
|
||||
include_dirs: ["frameworks/native"],
|
||||
|
||||
shared_libs: [
|
||||
"libthermalservice",
|
||||
"libbinder",
|
||||
"libutils",
|
||||
"libthermalcallback",
|
||||
"android.hardware.thermal@1.1",
|
||||
"libhidlbase",
|
||||
"libhidltransport",
|
||||
"liblog",
|
||||
],
|
||||
|
||||
cflags: [
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
"-Wunused",
|
||||
"-Wunreachable-code",
|
||||
],
|
||||
|
||||
init_rc: ["thermalservice.rc"],
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* 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 "ThermalService.h"
|
||||
#include <android/os/IThermalService.h>
|
||||
#include <android/os/IThermalEventListener.h>
|
||||
#include <android/os/Temperature.h>
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <utils/Errors.h>
|
||||
#include <utils/Mutex.h>
|
||||
#include <utils/String16.h>
|
||||
|
||||
namespace android {
|
||||
namespace os {
|
||||
|
||||
/**
|
||||
* Notify registered listeners of a thermal throttling start/stop event.
|
||||
* @param temperature the temperature at which the event was generated
|
||||
*/
|
||||
binder::Status ThermalService::notifyThrottling(
|
||||
const bool isThrottling, const Temperature& temperature) {
|
||||
Mutex::Autolock _l(mListenersLock);
|
||||
|
||||
mThrottled = isThrottling;
|
||||
mThrottleTemperature = temperature;
|
||||
|
||||
for (size_t i = 0; i < mListeners.size(); i++) {
|
||||
mListeners[i]->notifyThrottling(isThrottling, temperature);
|
||||
}
|
||||
return binder::Status::ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* Query whether the system is currently thermal throttling.
|
||||
* @return true if currently thermal throttling, else false
|
||||
*/
|
||||
binder::Status ThermalService::isThrottling(bool* _aidl_return) {
|
||||
Mutex::Autolock _l(mListenersLock);
|
||||
*_aidl_return = mThrottled;
|
||||
return binder::Status::ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new thermal event listener.
|
||||
* @param listener the client's IThermalEventListener instance to which
|
||||
* notifications are to be sent
|
||||
*/
|
||||
binder::Status ThermalService::registerThermalEventListener(
|
||||
const sp<IThermalEventListener>& listener) {
|
||||
{
|
||||
if (listener == NULL)
|
||||
return binder::Status::ok();
|
||||
Mutex::Autolock _l(mListenersLock);
|
||||
// check whether this is a duplicate
|
||||
for (size_t i = 0; i < mListeners.size(); i++) {
|
||||
if (IInterface::asBinder(mListeners[i]) ==
|
||||
IInterface::asBinder(listener)) {
|
||||
return binder::Status::ok();
|
||||
}
|
||||
}
|
||||
|
||||
mListeners.add(listener);
|
||||
IInterface::asBinder(listener)->linkToDeath(this);
|
||||
}
|
||||
|
||||
return binder::Status::ok();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a previously-registered thermal event listener.
|
||||
* @param listener the client's IThermalEventListener instance to which
|
||||
* notifications are to no longer be sent
|
||||
*/
|
||||
binder::Status ThermalService::unregisterThermalEventListener(
|
||||
const sp<IThermalEventListener>& listener) {
|
||||
if (listener == NULL)
|
||||
return binder::Status::ok();
|
||||
Mutex::Autolock _l(mListenersLock);
|
||||
for (size_t i = 0; i < mListeners.size(); i++) {
|
||||
if (IInterface::asBinder(mListeners[i]) ==
|
||||
IInterface::asBinder(listener)) {
|
||||
IInterface::asBinder(mListeners[i])->unlinkToDeath(this);
|
||||
mListeners.removeAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return binder::Status::ok();
|
||||
}
|
||||
|
||||
void ThermalService::binderDied(const wp<IBinder>& who) {
|
||||
Mutex::Autolock _l(mListenersLock);
|
||||
|
||||
for (size_t i = 0; i < mListeners.size(); i++) {
|
||||
if (IInterface::asBinder(mListeners[i]) == who) {
|
||||
mListeners.removeAt(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Publish the supplied ThermalService to servicemanager.
|
||||
*/
|
||||
void ThermalService::publish(
|
||||
const sp<ThermalService>& service) {
|
||||
defaultServiceManager()->addService(String16("thermalservice"),
|
||||
service);
|
||||
}
|
||||
|
||||
} // namespace os
|
||||
} // namespace android
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_THERMALSERVICE_THERMALSERVICE_H
|
||||
#define ANDROID_THERMALSERVICE_THERMALSERVICE_H
|
||||
|
||||
#include <android/os/BnThermalService.h>
|
||||
#include <android/os/IThermalEventListener.h>
|
||||
#include <android/os/Temperature.h>
|
||||
#include <utils/Mutex.h>
|
||||
#include <utils/String16.h>
|
||||
#include <utils/Vector.h>
|
||||
|
||||
namespace android {
|
||||
namespace os {
|
||||
|
||||
class ThermalService : public BnThermalService,
|
||||
public IBinder::DeathRecipient {
|
||||
public:
|
||||
ThermalService() : mThrottled(false) {};
|
||||
void publish(const sp<ThermalService>& service);
|
||||
binder::Status notifyThrottling(
|
||||
const bool isThrottling, const Temperature& temperature);
|
||||
|
||||
private:
|
||||
Mutex mListenersLock;
|
||||
Vector<sp<IThermalEventListener> > mListeners;
|
||||
bool mThrottled;
|
||||
Temperature mThrottleTemperature;
|
||||
|
||||
binder::Status registerThermalEventListener(
|
||||
const sp<IThermalEventListener>& listener);
|
||||
binder::Status unregisterThermalEventListener(
|
||||
const sp<IThermalEventListener>& listener);
|
||||
binder::Status isThrottling(bool* _aidl_return);
|
||||
void binderDied(const wp<IBinder>& who);
|
||||
};
|
||||
|
||||
}; // namespace os
|
||||
}; // namespace android
|
||||
|
||||
#endif // ANDROID_THERMALSERVICE_THERMALSERVICE_H
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* 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.os;
|
||||
|
||||
import android.os.Temperature;
|
||||
|
||||
/**
|
||||
* Listener for thermal events.
|
||||
* {@hide}
|
||||
*/
|
||||
oneway interface IThermalEventListener {
|
||||
/**
|
||||
* Called when a thermal throttling start/stop event is received.
|
||||
* @param temperature the temperature at which the event was generated.
|
||||
*/
|
||||
void notifyThrottling(
|
||||
in boolean isThrottling, in Temperature temperature);
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/**
|
||||
* 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.os;
|
||||
|
||||
import android.os.IThermalEventListener;
|
||||
import android.os.Temperature;
|
||||
|
||||
/** {@hide} */
|
||||
interface IThermalService {
|
||||
/**
|
||||
* Register a listener for thermal events.
|
||||
* @param listener the IThermalEventListener to be notified.
|
||||
* {@hide}
|
||||
*/
|
||||
void registerThermalEventListener(in IThermalEventListener listener);
|
||||
/**
|
||||
* Unregister a previously-registered listener for thermal events.
|
||||
* @param listener the IThermalEventListener to no longer be notified.
|
||||
* {@hide}
|
||||
*/
|
||||
void unregisterThermalEventListener(in IThermalEventListener listener);
|
||||
/**
|
||||
* Send a thermal throttling start/stop notification to all listeners.
|
||||
* @param temperature the temperature at which the event was generated.
|
||||
* {@hide}
|
||||
*/
|
||||
oneway void notifyThrottling(
|
||||
in boolean isThrottling, in Temperature temperature);
|
||||
/**
|
||||
* Return whether system performance is currently thermal throttling.
|
||||
* {@hide}
|
||||
*/
|
||||
boolean isThrottling();
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
package android.os;
|
||||
|
||||
/* Encodes a temperature used by ThermalService. */
|
||||
|
||||
parcelable Temperature cpp_header "android/os/Temperature.h";
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* 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/os/Temperature.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <binder/Parcel.h>
|
||||
#include <hardware/thermal.h>
|
||||
#include <sys/types.h>
|
||||
#include <utils/Errors.h>
|
||||
|
||||
namespace android {
|
||||
namespace os {
|
||||
|
||||
Temperature::Temperature() : value_(NAN), type_(DEVICE_TEMPERATURE_UNKNOWN) {}
|
||||
|
||||
Temperature::Temperature(const float value, const int type) :
|
||||
value_(value), type_(type) {}
|
||||
|
||||
Temperature::~Temperature() {}
|
||||
|
||||
/*
|
||||
* Parcel read/write code must be kept in sync with
|
||||
* frameworks/base/core/java/android/os/Temperature.java
|
||||
*/
|
||||
|
||||
status_t Temperature::readFromParcel(const Parcel* p) {
|
||||
value_ = p->readFloat();
|
||||
type_ = p->readInt32();
|
||||
return OK;
|
||||
}
|
||||
|
||||
status_t Temperature::writeToParcel(Parcel* p) const {
|
||||
p->writeFloat(value_);
|
||||
p->writeInt32(type_);
|
||||
return OK;
|
||||
}
|
||||
|
||||
} // namespace os
|
||||
} // namespace android
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H
|
||||
#define ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H
|
||||
|
||||
#include <binder/Parcelable.h>
|
||||
|
||||
namespace android {
|
||||
namespace os {
|
||||
|
||||
class Temperature : public Parcelable {
|
||||
public:
|
||||
|
||||
Temperature();
|
||||
Temperature(const float value, const int type);
|
||||
~Temperature() override;
|
||||
|
||||
float getValue() const {return value_;};
|
||||
float getType() const {return type_;};
|
||||
|
||||
status_t writeToParcel(Parcel* parcel) const override;
|
||||
status_t readFromParcel(const Parcel* parcel) override;
|
||||
|
||||
private:
|
||||
// The value of the temperature as a float, or NAN if unknown.
|
||||
float value_;
|
||||
// The type of the temperature, an enum temperature_type from
|
||||
// hardware/thermal.h
|
||||
int type_;
|
||||
};
|
||||
|
||||
} // namespace os
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H
|
|
@ -0,0 +1,19 @@
|
|||
cc_library_shared {
|
||||
name: "libthermalcallback",
|
||||
srcs: [
|
||||
"ThermalCallback.cpp",
|
||||
],
|
||||
cflags: [
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
],
|
||||
include_dirs: ["frameworks/native"],
|
||||
shared_libs: [
|
||||
"android.hardware.thermal@1.1",
|
||||
"libhidlbase",
|
||||
"libhidltransport",
|
||||
"liblog",
|
||||
"libthermalservice",
|
||||
"libutils",
|
||||
],
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
#define LOG_TAG "android.hardware.thermal.thermalcallback@1.1-impl"
|
||||
#include <log/log.h>
|
||||
|
||||
#include "ThermalCallback.h"
|
||||
#include "services/thermalservice/ThermalService.h"
|
||||
#include <math.h>
|
||||
#include <android/os/Temperature.h>
|
||||
#include <hardware/thermal.h>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace thermal {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
|
||||
using ::android::os::ThermalService;
|
||||
using ::android::hardware::thermal::V1_0::TemperatureType;
|
||||
|
||||
// Register a binder ThermalService object for sending events
|
||||
void ThermalCallback::registerThermalService(sp<ThermalService> thermalService)
|
||||
{
|
||||
mThermalService = thermalService;
|
||||
}
|
||||
|
||||
// Methods from IThermalCallback::V1_1 follow.
|
||||
Return<void> ThermalCallback::notifyThrottling(
|
||||
bool isThrottling,
|
||||
const android::hardware::thermal::V1_0::Temperature& temperature) {
|
||||
|
||||
// Convert HIDL IThermal Temperature to binder IThermalService Temperature.
|
||||
if (mThermalService != nullptr) {
|
||||
float value = NAN;
|
||||
int type = DEVICE_TEMPERATURE_UNKNOWN;
|
||||
|
||||
switch(temperature.type) {
|
||||
case TemperatureType::CPU:
|
||||
type = DEVICE_TEMPERATURE_CPU;
|
||||
break;
|
||||
case TemperatureType::GPU:
|
||||
type = DEVICE_TEMPERATURE_GPU;
|
||||
break;
|
||||
case TemperatureType::BATTERY:
|
||||
type = DEVICE_TEMPERATURE_BATTERY;
|
||||
break;
|
||||
case TemperatureType::SKIN:
|
||||
type = DEVICE_TEMPERATURE_SKIN;
|
||||
break;
|
||||
case TemperatureType::UNKNOWN:
|
||||
default:
|
||||
type = DEVICE_TEMPERATURE_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
value = temperature.currentValue == UNKNOWN_TEMPERATURE ? NAN :
|
||||
temperature.currentValue;
|
||||
|
||||
android::os::Temperature thermal_svc_temp(value, type);
|
||||
mThermalService->notifyThrottling(isThrottling, thermal_svc_temp);
|
||||
} else {
|
||||
ALOGE("IThermalService binder service not created, drop throttling event");
|
||||
}
|
||||
return Void();
|
||||
}
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_1
|
||||
} // namespace thermal
|
||||
} // namespace hardware
|
||||
} // namespace android
|
|
@ -0,0 +1,43 @@
|
|||
#ifndef ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H
|
||||
#define ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H
|
||||
|
||||
#include <android/hardware/thermal/1.1/IThermalCallback.h>
|
||||
#include <android/hardware/thermal/1.0/types.h>
|
||||
#include <android/os/Temperature.h>
|
||||
#include <hidl/MQDescriptor.h>
|
||||
#include <hidl/Status.h>
|
||||
#include "services/thermalservice/ThermalService.h"
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace thermal {
|
||||
namespace V1_1 {
|
||||
namespace implementation {
|
||||
|
||||
using ::android::hardware::Return;
|
||||
using ::android::hardware::Void;
|
||||
using ::android::os::ThermalService;
|
||||
|
||||
class ThermalCallback : public IThermalCallback {
|
||||
public:
|
||||
// Register a binder ThermalService object for sending events
|
||||
void registerThermalService(sp<ThermalService> thermalService);
|
||||
|
||||
// Methods from IThermalCallback::V1_1 follow.
|
||||
Return<void> notifyThrottling(
|
||||
bool isThrottling,
|
||||
const android::hardware::thermal::V1_0::Temperature& temperature)
|
||||
override;
|
||||
|
||||
private:
|
||||
// Our registered binder ThermalService object to use for sending events
|
||||
sp<android::os::ThermalService> mThermalService;
|
||||
};
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_1
|
||||
} // namespace thermal
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H
|
|
@ -0,0 +1,2 @@
|
|||
service thermalservice /system/bin/thermalserviced
|
||||
class core
|
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "thermalserviced"
|
||||
#include <log/log.h>
|
||||
|
||||
#include "thermalserviced.h"
|
||||
#include "ThermalService.h"
|
||||
#include "libthermalcallback/ThermalCallback.h"
|
||||
|
||||
#include <android/hardware/thermal/1.1/IThermal.h>
|
||||
#include <binder/IPCThreadState.h>
|
||||
#include <binder/IServiceManager.h>
|
||||
#include <hidl/HidlTransportSupport.h>
|
||||
|
||||
using namespace android;
|
||||
using ::android::hardware::thermal::V1_1::IThermal;
|
||||
using ::android::hardware::thermal::V1_0::Temperature;
|
||||
using ::android::hardware::thermal::V1_1::IThermalCallback;
|
||||
using ::android::hardware::thermal::V1_1::implementation::ThermalCallback;
|
||||
using ::android::hardware::configureRpcThreadpool;
|
||||
using ::android::hardware::hidl_death_recipient;
|
||||
using ::android::hidl::base::V1_0::IBase;
|
||||
using ::android::os::ThermalService;
|
||||
|
||||
template<typename T>
|
||||
using Return = hardware::Return<T>;
|
||||
|
||||
namespace {
|
||||
|
||||
// Our thermalserviced main object
|
||||
ThermalServiceDaemon* gThermalServiceDaemon;
|
||||
|
||||
// Thermal HAL client
|
||||
sp<IThermal> gThermalHal = nullptr;
|
||||
|
||||
// Binder death notifier informing of Thermal HAL death.
|
||||
struct ThermalServiceDeathRecipient : hidl_death_recipient {
|
||||
virtual void serviceDied(
|
||||
uint64_t cookie __unused, const wp<IBase>& who __unused) {
|
||||
gThermalHal = nullptr;
|
||||
ALOGE("IThermal HAL died");
|
||||
gThermalServiceDaemon->getThermalHal();
|
||||
}
|
||||
};
|
||||
|
||||
sp<ThermalServiceDeathRecipient> gThermalHalDied = nullptr;
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void ThermalServiceDaemon::thermalServiceStartup() {
|
||||
// Binder IThermalService startup
|
||||
mThermalService = new android::os::ThermalService;
|
||||
mThermalService->publish(mThermalService);
|
||||
// Register IThermalService object with IThermalCallback
|
||||
if (mThermalCallback != nullptr)
|
||||
mThermalCallback->registerThermalService(mThermalService);
|
||||
IPCThreadState::self()->joinThreadPool();
|
||||
}
|
||||
|
||||
// Lookup Thermal HAL, register death notifier, register our
|
||||
// ThermalCallback with the Thermal HAL.
|
||||
void ThermalServiceDaemon::getThermalHal() {
|
||||
gThermalHal = IThermal::getService();
|
||||
if (gThermalHal == nullptr) {
|
||||
ALOGW("Unable to get Thermal HAL V1.1, vendor thermal event notification not available");
|
||||
return;
|
||||
}
|
||||
|
||||
// Binder death notifier for Thermal HAL
|
||||
if (gThermalHalDied == nullptr)
|
||||
gThermalHalDied = new ThermalServiceDeathRecipient();
|
||||
|
||||
if (gThermalHalDied != nullptr)
|
||||
gThermalHal->linkToDeath(gThermalHalDied, 0x451F /* cookie */);
|
||||
|
||||
if (mThermalCallback != nullptr) {
|
||||
Return<void> ret = gThermalHal->registerThermalCallback(
|
||||
mThermalCallback);
|
||||
if (!ret.isOk())
|
||||
ALOGE("registerThermalCallback failed, status: %s",
|
||||
ret.description().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void ThermalServiceDaemon::thermalCallbackStartup() {
|
||||
// HIDL IThermalCallback startup
|
||||
// Need at least 2 threads in thread pool since we wait for dead HAL
|
||||
// to come back on the binder death notification thread and we need
|
||||
// another thread for the incoming service now available call.
|
||||
configureRpcThreadpool(2, false /* callerWillJoin */);
|
||||
mThermalCallback = new ThermalCallback();
|
||||
// Lookup Thermal HAL and register our ThermalCallback.
|
||||
getThermalHal();
|
||||
}
|
||||
|
||||
int main(int /*argc*/, char** /*argv*/) {
|
||||
gThermalServiceDaemon = new ThermalServiceDaemon();
|
||||
gThermalServiceDaemon->thermalCallbackStartup();
|
||||
gThermalServiceDaemon->thermalServiceStartup();
|
||||
/* NOTREACHED */
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ANDROID_THERMALSERVICE_THERMALSERVICED_H
|
||||
#define ANDROID_THERMALSERVICE_THERMALSERVICED_H
|
||||
|
||||
#include "ThermalService.h"
|
||||
#include "libthermalcallback/ThermalCallback.h"
|
||||
|
||||
using namespace android;
|
||||
using ::android::hardware::thermal::V1_0::Temperature;
|
||||
using ::android::hardware::thermal::V1_1::implementation::ThermalCallback;
|
||||
using ::android::os::ThermalService;
|
||||
|
||||
class ThermalServiceDaemon {
|
||||
public:
|
||||
void thermalServiceStartup();
|
||||
void thermalCallbackStartup();
|
||||
void getThermalHal();
|
||||
ThermalServiceDaemon() {};
|
||||
|
||||
private:
|
||||
sp<ThermalService> mThermalService;
|
||||
sp<ThermalCallback> mThermalCallback;
|
||||
};
|
||||
|
||||
#endif // ANDROID_THERMALSERVICE_THERMALSERVICED_H
|
Loading…
Add table
Add a link
Reference in a new issue