• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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