summaryrefslogtreecommitdiff
path: root/sensors/multihal_sensors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sensors/multihal_sensors.cpp')
-rw-r--r--sensors/multihal_sensors.cpp125
1 files changed, 71 insertions, 54 deletions
diff --git a/sensors/multihal_sensors.cpp b/sensors/multihal_sensors.cpp
index 41c7f42f..beb34d92 100644
--- a/sensors/multihal_sensors.cpp
+++ b/sensors/multihal_sensors.cpp
@@ -14,11 +14,10 @@
* limitations under the License.
*/
-#include <cinttypes>
+#include <cstdint>
#include <log/log.h>
-#include <qemud.h>
#include <utils/SystemClock.h>
-#include "multihal_sensors.h"
+#include <multihal_sensors.h>
#include "sensor_list.h"
namespace goldfish {
@@ -31,58 +30,54 @@ using ahs10::AdditionalInfoType;
namespace {
constexpr int64_t kMaxSamplingPeriodNs = 1000000000;
+
+struct SensorsTransportStub : public SensorsTransport {
+ int Send(const void*, int) override { return -1; }
+ int Receive(void*, int) override { return -1; }
+ bool Ok() const override { return false; }
+ int Fd() const override { return -1; }
+ const char* Name() const override { return "stub"; }
+};
+
+const SensorsTransportStub g_sensorsTransportStub;
}
-MultihalSensors::MultihalSensors()
- : m_qemuSensorsFd(qemud_channel_open("sensors"))
+MultihalSensors::MultihalSensors(SensorsTransportFactory stf)
+ : m_sensorsTransportFactory(std::move(stf))
+ , m_sensorsTransport(const_cast<SensorsTransportStub*>(&g_sensorsTransportStub))
, m_batchInfo(getSensorNumber()) {
- if (!m_qemuSensorsFd.ok()) {
- ALOGE("%s:%d: m_qemuSensorsFd is not opened", __func__, __LINE__);
- ::abort();
- }
+ {
+ const auto st = m_sensorsTransportFactory();
- char buffer[64];
- int len = snprintf(buffer, sizeof(buffer),
- "time:%" PRId64, ::android::elapsedRealtimeNano());
- if (qemud_channel_send(m_qemuSensorsFd.get(), buffer, len) < 0) {
- ALOGE("%s:%d: qemud_channel_send failed", __func__, __LINE__);
- ::abort();
- }
+ LOG_ALWAYS_FATAL_IF(!st->Ok(), "%s:%d: sensors transport is not opened",
+ __func__, __LINE__);
- using namespace std::literals;
- const std::string_view kListSensorsCmd = "list-sensors"sv;
+ using namespace std::literals;
+ const std::string_view kListSensorsCmd = "list-sensors"sv;
- if (qemud_channel_send(m_qemuSensorsFd.get(),
- kListSensorsCmd.data(),
- kListSensorsCmd.size()) < 0) {
- ALOGE("%s:%d: qemud_channel_send failed", __func__, __LINE__);
- ::abort();
- }
+ LOG_ALWAYS_FATAL_IF(st->Send(kListSensorsCmd.data(), kListSensorsCmd.size()) < 0,
+ "%s:%d: send for %s failed", __func__, __LINE__, st->Name());
- len = qemud_channel_recv(m_qemuSensorsFd.get(), buffer, sizeof(buffer) - 1);
- if (len < 0) {
- ALOGE("%s:%d: qemud_channel_recv failed", __func__, __LINE__);
- ::abort();
- }
- buffer[len] = 0;
- uint32_t hostSensorsMask = 0;
- if (sscanf(buffer, "%u", &hostSensorsMask) != 1) {
- ALOGE("%s:%d: Can't parse qemud response", __func__, __LINE__);
- ::abort();
- }
+ char buffer[64];
+ const int len = st->Receive(buffer, sizeof(buffer) - 1);
+ LOG_ALWAYS_FATAL_IF(len < 0, "%s:%d: receive for %s failed", __func__, __LINE__,
+ st->Name());
- m_availableSensorsMask = hostSensorsMask
- & ((1u << getSensorNumber()) - 1);
+ buffer[len] = 0;
+ uint32_t hostSensorsMask = 0;
+ LOG_ALWAYS_FATAL_IF(sscanf(buffer, "%u", &hostSensorsMask) != 1,
+ "%s:%d: Can't parse qemud response", __func__, __LINE__);
- ALOGI("%s:%d: host sensors mask=%x, available sensors mask=%x",
- __func__, __LINE__, hostSensorsMask, m_availableSensorsMask);
+ m_availableSensorsMask = hostSensorsMask & ((1u << getSensorNumber()) - 1);
- if (!::android::base::Socketpair(AF_LOCAL, SOCK_STREAM, 0,
- &m_callersFd, &m_sensorThreadFd)) {
- ALOGE("%s:%d: Socketpair failed", __func__, __LINE__);
- ::abort();
+ ALOGI("%s:%d: host sensors mask=%x, available sensors mask=%x",
+ __func__, __LINE__, hostSensorsMask, m_availableSensorsMask);
}
+ LOG_ALWAYS_FATAL_IF(!::android::base::Socketpair(AF_LOCAL, SOCK_STREAM, 0,
+ &m_callersFd, &m_sensorThreadFd),
+ "%s:%d: Socketpair failed", __func__, __LINE__);
+
setAdditionalInfoFrames();
m_sensorThread = std::thread(&MultihalSensors::qemuSensorListenerThread, this);
@@ -90,8 +85,6 @@ MultihalSensors::MultihalSensors()
}
MultihalSensors::~MultihalSensors() {
- setAllQemuSensors(false);
-
m_batchRunning = false;
m_batchUpdated.notify_one();
m_batchThread.join();
@@ -268,14 +261,10 @@ Return<Result> MultihalSensors::batch(const int32_t sensorHandle,
activeSensorsMask >>= 1;
}
- const int delayMs = std::max(1, int(minSamplingPeriodNs / 1000000));
-
- char buffer[64];
- const int len = snprintf(buffer, sizeof(buffer), "set-delay:%d", delayMs);
-
- if (qemud_channel_send(m_qemuSensorsFd.get(), buffer, len) < 0) {
- ALOGE("%s:%d: qemud_channel_send failed", __func__, __LINE__);
- ::abort();
+ const uint32_t sensorsUpdateIntervalMs = std::max(1, int(minSamplingPeriodNs / 1000000));
+ m_protocolState.sensorsUpdateIntervalMs = sensorsUpdateIntervalMs;
+ if (!setSensorsUpdateIntervalMs(*m_sensorsTransport, sensorsUpdateIntervalMs)) {
+ qemuSensorThreadSendCommand(kCMD_RESTART);
}
}
@@ -330,7 +319,6 @@ Return<Result> MultihalSensors::injectSensorData_2_1(const Event& event) {
Return<Result> MultihalSensors::initialize(const sp<IHalProxyCallback>& halProxyCallback) {
std::unique_lock<std::mutex> lock(m_mtx);
- setAllQemuSensors(true); // we need to start sampling sensors for batching
m_opMode = OperationMode::NORMAL;
m_halProxyCallback = halProxyCallback;
return Result::OK;
@@ -418,6 +406,35 @@ bool MultihalSensors::isSensorHandleValid(int sensorHandle) const {
return true;
}
+void MultihalSensors::qemuSensorListenerThread() {
+ while (true) {
+ const auto st = m_sensorsTransportFactory();
+
+ LOG_ALWAYS_FATAL_IF(!setSensorsGuestTime(
+ *st, ::android::elapsedRealtimeNano()));
+ LOG_ALWAYS_FATAL_IF(!setSensorsUpdateIntervalMs(
+ *st, m_protocolState.sensorsUpdateIntervalMs));
+ LOG_ALWAYS_FATAL_IF(!setAllSensorsReporting(
+ *st, m_availableSensorsMask, true));
+
+ {
+ std::unique_lock<std::mutex> lock(m_mtx);
+ m_sensorsTransport = st.get();
+ }
+
+ const bool cont = qemuSensorListenerThreadImpl(st->Fd());
+
+ {
+ std::unique_lock<std::mutex> lock(m_mtx);
+ m_sensorsTransport = const_cast<SensorsTransportStub*>(&g_sensorsTransportStub);
+ }
+
+ if (!cont) {
+ break;
+ }
+ }
+}
+
void MultihalSensors::batchThread() {
while (m_batchRunning) {
std::unique_lock<std::mutex> lock(m_mtx);