Convert atracehal into lazy HAL
am: 3acd4afe09
Change-Id: Ice5a352803956433ac566ab9a69f07e552362f5a
diff --git a/health/BatteryMetricsLogger.cpp b/health/BatteryMetricsLogger.cpp
index b5e8991..58c6b58 100644
--- a/health/BatteryMetricsLogger.cpp
+++ b/health/BatteryMetricsLogger.cpp
@@ -28,19 +28,20 @@
using android::frameworks::stats::V1_0::IStats;
BatteryMetricsLogger::BatteryMetricsLogger(const char *const batt_res, const char *const batt_ocv,
- int sample_period, int upload_period)
+ const char *const batt_avg_res, int sample_period,
+ int upload_period)
: kBatteryResistance(batt_res),
kBatteryOCV(batt_ocv),
+ kBatteryAvgResistance(batt_avg_res),
kSamplePeriod(sample_period),
kUploadPeriod(upload_period),
kMaxSamples(upload_period / sample_period) {
last_sample_ = 0;
last_upload_ = 0;
- num_res_samples_ = 0;
num_samples_ = 0;
+ num_res_samples_ = 0;
memset(min_, 0, sizeof(min_));
memset(max_, 0, sizeof(max_));
- accum_resistance_ = 0;
}
int64_t BatteryMetricsLogger::getTime(void) {
@@ -77,9 +78,39 @@
return true;
}
+bool BatteryMetricsLogger::uploadAverageBatteryResistance(sp<IStats> stats_client) {
+ if (strlen(kBatteryAvgResistance) == 0) {
+ LOG(INFO) << "Sysfs path for average battery resistance not specified";
+ return true;
+ }
+
+ std::string file_content;
+ int32_t batt_avg_res;
+
+ if (!android::base::ReadFileToString(kBatteryAvgResistance, &file_content)) {
+ LOG(ERROR) << "Can't read " << kBatteryAvgResistance;
+ return false;
+ }
+ std::stringstream ss(file_content);
+ if (!(ss >> batt_avg_res)) {
+ LOG(ERROR) << "Can't parse average battery resistance " << file_content;
+ return false;
+ }
+ // Upload average metric
+ BatteryHealthSnapshotArgs avg_res_ss_stats = {
+ .type = BatteryHealthSnapshotArgs::BatterySnapshotType::AVG_RESISTANCE,
+ .temperatureDeciC = 0,
+ .voltageMicroV = 0,
+ .currentMicroA = 0,
+ .openCircuitVoltageMicroV = 0,
+ .resistanceMicroOhm = batt_avg_res,
+ .levelPercent = 0};
+ stats_client->reportBatteryHealthSnapshot(avg_res_ss_stats);
+ return true;
+}
+
bool BatteryMetricsLogger::uploadMetrics(void) {
int64_t time = getTime();
- int32_t avg_resistance = 0;
if (last_sample_ == 0)
return false;
@@ -87,11 +118,6 @@
LOG(INFO) << "Uploading metrics at time " << std::to_string(time) << " w/ "
<< std::to_string(num_samples_) << " samples";
- if (num_res_samples_)
- avg_resistance = accum_resistance_ / num_res_samples_;
-
- LOG(INFO) << "Logging metrics";
-
sp<IStats> stats_client = IStats::tryGetService();
if (!stats_client) {
LOG(ERROR) << "Unable to connect to Stats service";
@@ -114,26 +140,14 @@
uploadOutlierMetric(stats_client, static_cast<sampleType>(metric));
}
- // Upload average metric
- BatteryHealthSnapshotArgs avg_res_ss_stats = {
- .type = BatteryHealthSnapshotArgs::BatterySnapshotType::AVG_RESISTANCE,
- .temperatureDeciC = 0,
- .voltageMicroV = 0,
- .currentMicroA = 0,
- .openCircuitVoltageMicroV = 0,
- .resistanceMicroOhm = avg_resistance,
- .levelPercent = 0};
- if (num_res_samples_) {
- stats_client->reportBatteryHealthSnapshot(avg_res_ss_stats);
- }
+ uploadAverageBatteryResistance(stats_client);
// Clear existing data
memset(min_, 0, sizeof(min_));
memset(max_, 0, sizeof(max_));
- num_res_samples_ = 0;
num_samples_ = 0;
+ num_res_samples_ = 0;
last_upload_ = time;
- accum_resistance_ = 0;
LOG(INFO) << "Finished uploading to tron";
return true;
}
@@ -146,17 +160,19 @@
LOG(INFO) << "Recording a sample at time " << std::to_string(time);
if (!android::base::ReadFileToString(kBatteryResistance, &resistance_str)) {
- LOG(ERROR) << "Can't read the battery resistance";
- resistance = 0;
- } else if (!(resistance = stoi(resistance_str))) {
+ LOG(ERROR) << "Can't read the battery resistance from " << kBatteryResistance;
+ resistance = -INT_MAX;
+ } else if (!(std::stringstream(resistance_str) >> resistance)) {
LOG(ERROR) << "Can't parse battery resistance value " << resistance_str;
+ resistance = -INT_MAX;
}
if (!android::base::ReadFileToString(kBatteryOCV, &ocv_str)) {
- LOG(ERROR) << "Can't read the open-circuit voltage (ocv) value";
- ocv = 0;
- } else if (!(ocv = stoi(ocv_str))) {
+ LOG(ERROR) << "Can't read open-circuit voltage (ocv) value from " << kBatteryOCV;
+ ocv = -INT_MAX;
+ } else if (!(std::stringstream(ocv_str) >> ocv)) {
LOG(ERROR) << "Can't parse open-circuit voltage (ocv) value " << ocv_str;
+ ocv = -INT_MAX;
}
int32_t sample[NUM_FIELDS] = {[TIME] = time,
@@ -167,7 +183,6 @@
[SOC] = props->batteryLevel,
[OCV] = ocv};
if (props->batteryStatus != android::BATTERY_STATUS_CHARGING) {
- accum_resistance_ += resistance;
num_res_samples_++;
}
diff --git a/health/include/pixelhealth/BatteryMetricsLogger.h b/health/include/pixelhealth/BatteryMetricsLogger.h
index bf1d840..790a6ed 100644
--- a/health/include/pixelhealth/BatteryMetricsLogger.h
+++ b/health/include/pixelhealth/BatteryMetricsLogger.h
@@ -20,13 +20,13 @@
#include <android-base/file.h>
#include <android-base/logging.h>
#include <android-base/strings.h>
+#include <android/frameworks/stats/1.0/IStats.h>
#include <batteryservice/BatteryService.h>
#include <math.h>
#include <time.h>
#include <utils/Timers.h>
-#include <string>
-#include <android/frameworks/stats/1.0/IStats.h>
+#include <string>
namespace hardware {
namespace google {
@@ -40,7 +40,8 @@
class BatteryMetricsLogger {
public:
BatteryMetricsLogger(const char *const batt_res, const char *const batt_ocv,
- int sample_period = TEN_MINUTES_SEC, int upload_period = ONE_DAY_SEC);
+ const char *const batt_avg_res = "", int sample_period = TEN_MINUTES_SEC,
+ int upload_period = ONE_DAY_SEC);
void logBatteryProperties(struct android::BatteryProperties *props);
private:
@@ -67,6 +68,7 @@
const char *const kBatteryResistance;
const char *const kBatteryOCV;
+ const char *const kBatteryAvgResistance;
const int kSamplePeriod;
const int kUploadPeriod;
const int kMaxSamples;
@@ -78,16 +80,16 @@
// min[TYPE][TYPE] is the reading of that type at that minimum event
int32_t min_[NUM_FIELDS][NUM_FIELDS];
int32_t max_[NUM_FIELDS][NUM_FIELDS];
- int32_t num_res_samples_; // number of res samples since last upload
- int32_t num_samples_; // number of min/max samples since last upload
- int64_t accum_resistance_; // accumulative resistance
- int64_t last_sample_; // time in seconds since boot of last sample
- int64_t last_upload_; // time in seconds since boot of last upload
+ int32_t num_res_samples_; // number of res samples since last upload
+ int32_t num_samples_; // number of min/max samples since last upload
+ int64_t last_sample_; // time in seconds since boot of last sample
+ int64_t last_upload_; // time in seconds since boot of last upload
int64_t getTime();
bool recordSample(struct android::BatteryProperties *props);
bool uploadMetrics();
bool uploadOutlierMetric(sp<IStats> stats_client, sampleType type);
+ bool uploadAverageBatteryResistance(sp<IStats> stats_client);
};
} // namespace health
diff --git a/pixelstats/UeventListener.cpp b/pixelstats/UeventListener.cpp
index 312a8e5..4614293 100644
--- a/pixelstats/UeventListener.cpp
+++ b/pixelstats/UeventListener.cpp
@@ -32,6 +32,7 @@
using android::sp;
using android::base::ReadFileToString;
+using android::base::WriteStringToFile;
using android::frameworks::stats::V1_0::HardwareFailed;
using android::frameworks::stats::V1_0::IStats;
using android::frameworks::stats::V1_0::UsbPortOverheatEvent;
@@ -231,6 +232,10 @@
return;
}
+ if (!WriteStringToFile(kChargeMetricsPath.c_str(), std::to_string(0))) {
+ ALOGE("Couldn't clear %s", kChargeMetricsPath.c_str());
+ }
+
sp<IStats> stats_client = IStats::tryGetService();
if (!stats_client) {
ALOGE("Couldn't connect to IStats service");
diff --git a/power-libperfmgr/CameraMode.h b/power-libperfmgr/CameraMode.h
index 6558ce8..ce8f0c9 100644
--- a/power-libperfmgr/CameraMode.h
+++ b/power-libperfmgr/CameraMode.h
@@ -22,6 +22,7 @@
CAMERA_STREAMING,
CAMERA_STREAMING_1080P,
CAMERA_STREAMING_4K,
+ CAMERA_STREAMING_SECURE,
CAMERA_STREAMING_MAX
};
diff --git a/power-libperfmgr/Power.cpp b/power-libperfmgr/Power.cpp
index aca64ca..4a7cc8e 100644
--- a/power-libperfmgr/Power.cpp
+++ b/power-libperfmgr/Power.cpp
@@ -51,10 +51,11 @@
constexpr char kPowerHalConfigPath[] = "/vendor/etc/powerhint.json";
static const std::map<enum CameraStreamingMode, std::string> kCamStreamingHint = {
- {CAMERA_STREAMING_OFF, "CAMERA_STREAMING_OFF"},
- {CAMERA_STREAMING, "CAMERA_STREAMING"},
- {CAMERA_STREAMING_1080P, "CAMERA_STREAMING_1080P"},
- {CAMERA_STREAMING_4K, "CAMERA_STREAMING_4K"}};
+ {CAMERA_STREAMING_OFF, "CAMERA_STREAMING_OFF"},
+ {CAMERA_STREAMING, "CAMERA_STREAMING"},
+ {CAMERA_STREAMING_1080P, "CAMERA_STREAMING_1080P"},
+ {CAMERA_STREAMING_4K, "CAMERA_STREAMING_4K"},
+ {CAMERA_STREAMING_SECURE, "CAMERA_STREAMING_SECURE"}};
Power::Power()
: mHintManager(nullptr),
@@ -84,6 +85,10 @@
ALOGI("Initialize with CAMERA_STREAMING_4K on");
mHintManager->DoHint("CAMERA_STREAMING_4K");
mCameraStreamingMode = CAMERA_STREAMING_4K;
+ } else if (state == "CAMERA_STREAMING_SECURE") {
+ ALOGI("Initialize with CAMERA_STREAMING_SECURE on");
+ mHintManager->DoHint("CAMERA_STREAMING_SECURE");
+ mCameraStreamingMode = CAMERA_STREAMING_SECURE;
} else if (state == "SUSTAINED_PERFORMANCE") {
ALOGI("Initialize with SUSTAINED_PERFORMANCE on");
mHintManager->DoHint("SUSTAINED_PERFORMANCE");
@@ -289,8 +294,10 @@
if ((mCameraStreamingMode != CAMERA_STREAMING_OFF)) {
const auto modeValue = kCamStreamingHint.at(mCameraStreamingMode);
mHintManager->EndHint(modeValue);
- // Boost 1s for tear down
- mHintManager->DoHint("CAMERA_LAUNCH", std::chrono::seconds(1));
+ if ((mCameraStreamingMode != CAMERA_STREAMING_SECURE)) {
+ // Boost 1s for tear down if not secure streaming use case
+ mHintManager->DoHint("CAMERA_LAUNCH", std::chrono::seconds(1));
+ }
}
if (mode != CAMERA_STREAMING_OFF) {
diff --git a/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc b/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
index fa00587..6179f6e 100644
--- a/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
+++ b/power-libperfmgr/android.hardware.power@1.3-service.pixel-libperfmgr.rc
@@ -2,6 +2,7 @@
class hal
user root
group system
+ priority -20
interface android.hardware.power@1.0::IPower default
interface android.hardware.power@1.1::IPower default
interface android.hardware.power@1.2::IPower default
diff --git a/power-libperfmgr/service.cpp b/power-libperfmgr/service.cpp
index a64761c..7bcc907 100644
--- a/power-libperfmgr/service.cpp
+++ b/power-libperfmgr/service.cpp
@@ -41,7 +41,7 @@
ALOGE("Can not create an instance of Power HAL Iface, exiting.");
return 1;
}
-
+ android::hardware::setMinSchedulerPolicy(service, SCHED_NORMAL, -20);
configureRpcThreadpool(1, true /*callerWillJoin*/);
status_t status = service->registerAsService();