blob: 7c9a93f32a6c9a103a128dd6282d88b0fa0eef55 [file] [log] [blame]
/*
* Copyright (C) 2020 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 "pixelstats-wlc"
#include <android-base/file.h>
#include <log/log.h>
#include <pixelstats/OrientationCollector.h>
#include <pixelstats/WlcReporter.h>
#define POWER_SUPPLY_SYSFS_PATH "/sys/class/power_supply/wireless/online"
#define POWER_SUPPLY_PTMC_PATH "/sys/class/power_supply/wireless/ptmc_id"
#define GOOGLE_PTMC_ID 72
using android::base::ReadFileToString;
using android::frameworks::stats::V1_0::IStats;
using android::frameworks::stats::V1_0::VendorAtom;
namespace android {
namespace hardware {
namespace google {
namespace pixel {
bool WlcReporter::checkAndReport(bool isWirelessChargingLast) {
bool wireless_charging = isWlcOnline();
if (wireless_charging && !isWirelessChargingLast) {
doLog();
}
return wireless_charging;
}
bool WlcReporter::readFileToInt(const char *const path, int *val) {
std::string file_contents;
if (!ReadFileToString(path, &file_contents)) {
ALOGE("Unable to read %s - %s", path, strerror(errno));
return false;
} else if (sscanf(file_contents.c_str(), "%d", val) != 1) {
ALOGE("Unable to convert %s (%s) to int - %s", path, file_contents.c_str(),
strerror(errno));
return false;
}
return true;
}
int WlcReporter::readPtmcId() {
int id = 0;
readFileToInt(POWER_SUPPLY_PTMC_PATH, &id);
return id;
}
/* Reference to frameworks/native/libs/ui/include/ui/DisplayInfo.h
* translate orientation value from sensor to enum define in
* pixelatoms.proto
*/
int WlcReporter::translateDeviceOrientationToAtomValue(int orientation) {
switch (orientation) {
case 0:
return PixelAtoms::DeviceOrientation::ORIENTATION_0;
case 1:
return PixelAtoms::DeviceOrientation::ORIENTATION_90;
case 2:
return PixelAtoms::DeviceOrientation::ORIENTATION_180;
case 3:
return PixelAtoms::DeviceOrientation::ORIENTATION_270;
default:
return PixelAtoms::DeviceOrientation::ORIENTATION_UNKNOWN;
}
}
void WlcReporter::doLog() {
sp<IStats> stats_client = IStats::tryGetService();
if (stats_client == nullptr) {
ALOGE("logWlc get IStats fail.");
return;
}
std::vector<VendorAtom::Value> values(1);
int vendoriCharger = (readPtmcId() == GOOGLE_PTMC_ID)
? PixelAtoms::WirelessChargingStats::VENDOR_GOOGLE
: PixelAtoms::WirelessChargingStats::VENDOR_UNKNOWN;
VendorAtom::Value tmp;
tmp.intValue(vendoriCharger);
values[PixelAtoms::WirelessChargingStats::kChargerVendorFieldNumber - kVendorAtomOffset] = tmp;
// Send vendor atom to IStats HAL
VendorAtom event = {.reverseDomainName = PixelAtoms::ReverseDomainNames().pixel(),
.atomId = PixelAtoms::Ids::WIRELESS_CHARGING_STATS,
.values = values};
Return<void> retStat = stats_client->reportVendorAtom(event);
if (!retStat.isOk())
ALOGE("Unable to report WLC_STATS to Stats service");
int orientationFromSensor;
sp<OrientationCollector> orientationCollector;
orientationCollector = OrientationCollector::createOrientationCollector();
if (orientationCollector != nullptr) {
orientationCollector->pollOrientation(&orientationFromSensor);
VendorAtom::Value tmp;
tmp.intValue(translateDeviceOrientationToAtomValue(orientationFromSensor));
values[PixelAtoms::DeviceOrientation::kOrientationFieldNumber - kVendorAtomOffset] = tmp;
VendorAtom event = {.reverseDomainName = PixelAtoms::ReverseDomainNames().pixel(),
.atomId = PixelAtoms::Ids::DEVICE_ORIENTATION,
.values = values};
Return<void> retOrientation = stats_client->reportVendorAtom(event);
if (!retOrientation.isOk())
ALOGE("Unable to report Orientation to Stats service");
orientationCollector->disableOrientationSensor();
}
}
bool WlcReporter::isWlcSupported() {
std::string file_contents;
if (!ReadFileToString(POWER_SUPPLY_SYSFS_PATH, &file_contents)) {
ALOGV("Unable to read %s - %s", POWER_SUPPLY_SYSFS_PATH, strerror(errno));
return false;
} else {
return true;
}
}
bool WlcReporter::isWlcOnline() {
std::string file_contents;
if (!ReadFileToString(POWER_SUPPLY_SYSFS_PATH, &file_contents)) {
ALOGE("Unable to read %s - %s", POWER_SUPPLY_SYSFS_PATH, strerror(errno));
return false;
}
ALOGV("isWlcOnline value: %s", file_contents.c_str());
return file_contents == "1\n";
}
} // namespace pixel
} // namespace google
} // namespace hardware
} // namespace android