1 /*
2 * Copyright (C) 2024 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
17 #define LOG_TAG "pixelstats: BatteryFwUpdateReporter"
18
19 #include <log/log.h>
20 #include <time.h>
21 #include <utils/Timers.h>
22 #include <cinttypes>
23 #include <cmath>
24
25 #include <android-base/file.h>
26 #include <android-base/parseint.h>
27 #include <android-base/strings.h>
28 #include <pixelstats/BatteryFwUpdateReporter.h>
29 #include <hardware/google/pixel/pixelstats/pixelatoms.pb.h>
30
31 namespace android {
32 namespace hardware {
33 namespace google {
34 namespace pixel {
35
36 using aidl::android::frameworks::stats::VendorAtom;
37 using aidl::android::frameworks::stats::VendorAtomValue;
38 using android::base::ReadFileToString;
39 using android::hardware::google::pixel::PixelAtoms::BatteryFirmwareUpdateReported;
40
BatteryFwUpdateReporter()41 BatteryFwUpdateReporter::BatteryFwUpdateReporter() {}
42
reportEvent(const std::shared_ptr<IStats> & stats_client,struct BatteryFwUpdatePipeline & data)43 void BatteryFwUpdateReporter::reportEvent(const std::shared_ptr<IStats> &stats_client,
44 struct BatteryFwUpdatePipeline &data) {
45 std::vector<VendorAtomValue> values(kNumFwUpdatePipelineFields);
46
47 ALOGD("reportEvent: msg_type=%d, msg_category=%d, major_ver_from=%d, minor_ver_from=%d, "
48 "major_ver_to=%d, minor_ver_to=%d, update_status=%d, attempts=%d, unix_time_sec=%d "
49 "fw_data0=%d, fw_data1=%d, fw_data2=%d, fw_data3=%d",
50 data.msg_type, data.msg_category, data.major_version_from, data.minor_version_from,
51 data.major_version_to, data.minor_version_to, data.update_status, data.attempts,
52 data.unix_time_sec, data.fw_data0, data.fw_data1, data.fw_data2, data.fw_data3);
53
54 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMsgTypeFieldNumber, data.msg_type);
55 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMsgCategoryFieldNumber,
56 data.msg_category);
57 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMajorVersionFromFieldNumber,
58 data.major_version_from);
59 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMinorVersionFromFieldNumber,
60 data.minor_version_from);
61 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMajorVersionToFieldNumber,
62 data.major_version_to);
63 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kMinorVersionToFieldNumber,
64 data.minor_version_to);
65 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kUpdateStatusFieldNumber,
66 data.update_status);
67 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kAttemptsFieldNumber, data.attempts);
68 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kUnixTimeSecFieldNumber,
69 data.unix_time_sec);
70 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kFwData0FieldNumber, data.fw_data0);
71 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kFwData1FieldNumber, data.fw_data1);
72 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kFwData2FieldNumber, data.fw_data2);
73 setAtomFieldValue(&values, BatteryFirmwareUpdateReported::kFwData3FieldNumber, data.fw_data3);
74
75 VendorAtom event = {.reverseDomainName = "",
76 .atomId = PixelAtoms::Atom::kBatteryFirmwareUpdateReported,
77 .values = std::move(values)};
78 reportVendorAtom(stats_client, event);
79 }
80
checkAndReportFwUpdate(const std::shared_ptr<IStats> & stats_client,const std::vector<std::string> & paths,const ReportEventType & event_type)81 void BatteryFwUpdateReporter::checkAndReportFwUpdate(const std::shared_ptr<IStats> &stats_client,
82 const std::vector<std::string> &paths,
83 const ReportEventType &event_type) {
84 struct BatteryFwUpdatePipeline params;
85 struct timespec boot_time;
86
87 if (paths.empty())
88 return;
89
90 if (paths.size() > kNumMaxFwUpdatePaths) {
91 ALOGE("Exceed max number of FwUpdatePath, expected=%d, paths=%zu",
92 kNumMaxFwUpdatePaths, paths.size());
93 return;
94 }
95
96 for (int i = 0; i < paths.size(); i++) {
97 if (!fileExists(paths[i]))
98 continue;
99
100 std::vector<std::vector<uint32_t>> events;
101
102 clock_gettime(CLOCK_MONOTONIC, &boot_time);
103 readLogbuffer(paths[i], kNumFwUpdatePipelineFields, event_type, FormatOnlyVal,
104 last_check_[i], events);
105 for (int event_idx = 0; event_idx < events.size(); event_idx++) {
106 std::vector<uint32_t> &event = events[event_idx];
107 if (event.size() == kNumFwUpdatePipelineFields) {
108 params.msg_type = event[0];
109 params.msg_category = event[1];
110 params.major_version_from = event[2];
111 params.minor_version_from = event[3];
112 params.major_version_to = event[4];
113 params.minor_version_to = event[5];
114 params.update_status = event[6];
115 params.attempts = event[7];
116 params.unix_time_sec = event[8];
117 params.fw_data0 = event[9];
118 params.fw_data1 = event[10];
119 params.fw_data2 = event[11];
120 params.fw_data3 = event[12];
121 reportEvent(stats_client, params);
122 } else {
123 ALOGE("Not support %zu fields for Firmware Update event", event.size());
124 }
125 }
126 last_check_[i] = (unsigned int)boot_time.tv_sec;
127 }
128 }
129
130 } // namespace pixel
131 } // namespace google
132 } // namespace hardware
133 } // namespace android
134