blob: 19176d9aaf7ef0fc63b3f31533da91ed48fb76c8 [file] [log] [blame]
Jeffrey Huang64421982020-02-03 17:30:43 -08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vova Sharaienko40dc2402023-01-28 05:51:00 +000017#define DEBUG false // STOPSHIP if true
Jeffrey Huang64421982020-02-03 17:30:43 -080018#define LOG_TAG "StatsHal"
19
Vova Sharaienko40dc2402023-01-28 05:51:00 +000020#include "StatsHal.h"
21
Jeffrey Huang64421982020-02-03 17:30:43 -080022#include <log/log.h>
23#include <statslog.h>
24
Jeffrey Huang64421982020-02-03 17:30:43 -080025namespace android {
26namespace frameworks {
27namespace stats {
28namespace V1_0 {
29namespace implementation {
30
Vova Sharaienko40dc2402023-01-28 05:51:00 +000031StatsHal::StatsHal() {
32}
Jeffrey Huang64421982020-02-03 17:30:43 -080033
Vova Sharaienko40dc2402023-01-28 05:51:00 +000034hardware::Return<void> StatsHal::reportSpeakerImpedance(const SpeakerImpedance& speakerImpedance) {
Jeffrey Huang64421982020-02-03 17:30:43 -080035 android::util::stats_write(android::util::SPEAKER_IMPEDANCE_REPORTED,
Vova Sharaienko40dc2402023-01-28 05:51:00 +000036 speakerImpedance.speakerLocation, speakerImpedance.milliOhms);
Jeffrey Huang64421982020-02-03 17:30:43 -080037
38 return hardware::Void();
39}
40
41hardware::Return<void> StatsHal::reportHardwareFailed(const HardwareFailed& hardwareFailed) {
42 android::util::stats_write(android::util::HARDWARE_FAILED, int32_t(hardwareFailed.hardwareType),
Vova Sharaienko40dc2402023-01-28 05:51:00 +000043 hardwareFailed.hardwareLocation, int32_t(hardwareFailed.errorCode));
Jeffrey Huang64421982020-02-03 17:30:43 -080044
45 return hardware::Void();
46}
47
48hardware::Return<void> StatsHal::reportPhysicalDropDetected(
49 const PhysicalDropDetected& physicalDropDetected) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +000050 android::util::stats_write(
51 android::util::PHYSICAL_DROP_DETECTED, int32_t(physicalDropDetected.confidencePctg),
52 physicalDropDetected.accelPeak, physicalDropDetected.freefallDuration);
Jeffrey Huang64421982020-02-03 17:30:43 -080053
54 return hardware::Void();
55}
56
57hardware::Return<void> StatsHal::reportChargeCycles(const ChargeCycles& chargeCycles) {
58 std::vector<int32_t> buckets = chargeCycles.cycleBucket;
59 int initialSize = buckets.size();
60 for (int i = 0; i < 10 - initialSize; i++) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +000061 buckets.push_back(0); // Push 0 for buckets that do not exist.
Jeffrey Huang64421982020-02-03 17:30:43 -080062 }
63 android::util::stats_write(android::util::CHARGE_CYCLES_REPORTED, buckets[0], buckets[1],
Vova Sharaienko40dc2402023-01-28 05:51:00 +000064 buckets[2], buckets[3], buckets[4], buckets[5], buckets[6],
65 buckets[7], buckets[8], buckets[9]);
Jeffrey Huang64421982020-02-03 17:30:43 -080066
67 return hardware::Void();
68}
69
70hardware::Return<void> StatsHal::reportBatteryHealthSnapshot(
71 const BatteryHealthSnapshotArgs& batteryHealthSnapshotArgs) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +000072 android::util::stats_write(
73 android::util::BATTERY_HEALTH_SNAPSHOT, int32_t(batteryHealthSnapshotArgs.type),
74 batteryHealthSnapshotArgs.temperatureDeciC, batteryHealthSnapshotArgs.voltageMicroV,
75 batteryHealthSnapshotArgs.currentMicroA,
Jeffrey Huang64421982020-02-03 17:30:43 -080076 batteryHealthSnapshotArgs.openCircuitVoltageMicroV,
77 batteryHealthSnapshotArgs.resistanceMicroOhm, batteryHealthSnapshotArgs.levelPercent);
78
79 return hardware::Void();
80}
81
82hardware::Return<void> StatsHal::reportSlowIo(const SlowIo& slowIo) {
83 android::util::stats_write(android::util::SLOW_IO, int32_t(slowIo.operation), slowIo.count);
84
85 return hardware::Void();
86}
87
88hardware::Return<void> StatsHal::reportBatteryCausedShutdown(
89 const BatteryCausedShutdown& batteryCausedShutdown) {
90 android::util::stats_write(android::util::BATTERY_CAUSED_SHUTDOWN,
Vova Sharaienko40dc2402023-01-28 05:51:00 +000091 batteryCausedShutdown.voltageMicroV);
Jeffrey Huang64421982020-02-03 17:30:43 -080092
93 return hardware::Void();
94}
95
96hardware::Return<void> StatsHal::reportUsbPortOverheatEvent(
97 const UsbPortOverheatEvent& usbPortOverheatEvent) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +000098 android::util::stats_write(
99 android::util::USB_PORT_OVERHEAT_EVENT_REPORTED,
Jeffrey Huang64421982020-02-03 17:30:43 -0800100 usbPortOverheatEvent.plugTemperatureDeciC, usbPortOverheatEvent.maxTemperatureDeciC,
101 usbPortOverheatEvent.timeToOverheat, usbPortOverheatEvent.timeToHysteresis,
102 usbPortOverheatEvent.timeToInactive);
103
104 return hardware::Void();
105}
106
Vova Sharaienko40dc2402023-01-28 05:51:00 +0000107hardware::Return<void> StatsHal::reportSpeechDspStat(const SpeechDspStat& speechDspStat) {
Jeffrey Huang64421982020-02-03 17:30:43 -0800108 android::util::stats_write(android::util::SPEECH_DSP_STAT_REPORTED,
Vova Sharaienko40dc2402023-01-28 05:51:00 +0000109 speechDspStat.totalUptimeMillis, speechDspStat.totalDowntimeMillis,
110 speechDspStat.totalCrashCount, speechDspStat.totalRecoverCount);
Jeffrey Huang64421982020-02-03 17:30:43 -0800111
112 return hardware::Void();
113}
114
115hardware::Return<void> StatsHal::reportVendorAtom(const VendorAtom& vendorAtom) {
Jeffrey Huang64421982020-02-03 17:30:43 -0800116 if (vendorAtom.atomId < 100000 || vendorAtom.atomId >= 200000) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +0000117 ALOGE("Atom ID %ld is not a valid vendor atom ID", (long)vendorAtom.atomId);
Jeffrey Huang64421982020-02-03 17:30:43 -0800118 return hardware::Void();
119 }
Vova Sharaienko34efca02022-12-09 00:07:23 +0000120 if (vendorAtom.reverseDomainName.size() > 50) {
121 ALOGE("Vendor atom reverse domain name %s is too long.",
122 vendorAtom.reverseDomainName.c_str());
Jeffrey Huang64421982020-02-03 17:30:43 -0800123 return hardware::Void();
124 }
125 AStatsEvent* event = AStatsEvent_obtain();
126 AStatsEvent_setAtomId(event, vendorAtom.atomId);
127 AStatsEvent_writeString(event, vendorAtom.reverseDomainName.c_str());
128 for (int i = 0; i < (int)vendorAtom.values.size(); i++) {
129 switch (vendorAtom.values[i].getDiscriminator()) {
130 case VendorAtom::Value::hidl_discriminator::intValue:
131 AStatsEvent_writeInt32(event, vendorAtom.values[i].intValue());
132 break;
133 case VendorAtom::Value::hidl_discriminator::longValue:
134 AStatsEvent_writeInt64(event, vendorAtom.values[i].longValue());
135 break;
136 case VendorAtom::Value::hidl_discriminator::floatValue:
137 AStatsEvent_writeFloat(event, vendorAtom.values[i].floatValue());
138 break;
139 case VendorAtom::Value::hidl_discriminator::stringValue:
140 AStatsEvent_writeString(event, vendorAtom.values[i].stringValue().c_str());
141 break;
142 }
143 }
144 AStatsEvent_build(event);
145 AStatsEvent_write(event);
146 AStatsEvent_release(event);
147
148 return hardware::Void();
149}
150
151} // namespace implementation
152} // namespace V1_0
153} // namespace stats
154} // namespace frameworks
155} // namespace android