blob: 9d920d1fe531fba855307addd3703f5599fe7c28 [file] [log] [blame]
/*
* Copyright (c) 2022, 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.
*/
#ifndef CPP_VHAL_CLIENT_INCLUDE_HIDLVHALCLIENT_H_
#define CPP_VHAL_CLIENT_INCLUDE_HIDLVHALCLIENT_H_
#include "IVhalClient.h"
#include <aidl/android/hardware/automotive/vehicle/SubscribeOptions.h>
#include <android-base/thread_annotations.h>
#include <android/hardware/automotive/vehicle/2.0/IVehicle.h>
#include <utils/StrongPointer.h>
#include <mutex> // NOLINT
#include <unordered_set>
namespace android {
namespace frameworks {
namespace automotive {
namespace vhal {
namespace hidl_test {
class HidlVhalClientTest;
} // namespace hidl_test
class HidlVhalClient final : public IVhalClient {
public:
explicit HidlVhalClient(
::android::sp<::android::hardware::automotive::vehicle::V2_0::IVehicle> hal);
~HidlVhalClient();
void getValue(const IHalPropValue& requestValue,
std::shared_ptr<GetValueCallbackFunc> callback) override;
void setValue(const IHalPropValue& value,
std::shared_ptr<HidlVhalClient::SetValueCallbackFunc> callback) override;
// Add the callback that would be called when VHAL binder died.
::android::base::Result<void> addOnBinderDiedCallback(
std::shared_ptr<OnBinderDiedCallbackFunc> callback) override;
// Remove a previously added OnBinderDied callback.
::android::base::Result<void> removeOnBinderDiedCallback(
std::shared_ptr<OnBinderDiedCallbackFunc> callback) override;
::android::base::Result<std::vector<std::unique_ptr<IHalPropConfig>>> getAllPropConfigs()
override;
::android::base::Result<std::vector<std::unique_ptr<IHalPropConfig>>> getPropConfigs(
std::vector<int32_t> propIds) override;
std::unique_ptr<ISubscriptionClient> getSubscriptionClient(
std::shared_ptr<ISubscriptionCallback> callback) override;
private:
friend class hidl_test::HidlVhalClientTest;
class DeathRecipient : public ::android::hardware::hidl_death_recipient {
public:
explicit DeathRecipient(HidlVhalClient* client);
void serviceDied(uint64_t cookie,
const ::android::wp<android::hidl::base::V1_0::IBase>& who) override;
private:
HidlVhalClient* mClient;
};
::android::sp<::android::hardware::automotive::vehicle::V2_0::IVehicle> mHal;
::android::sp<DeathRecipient> mDeathRecipient;
std::mutex mLock;
std::unordered_set<std::shared_ptr<OnBinderDiedCallbackFunc>> mOnBinderDiedCallbacks
GUARDED_BY(mLock);
void onBinderDied();
};
class SubscriptionCallback;
class HidlSubscriptionClient final : public ISubscriptionClient {
public:
~HidlSubscriptionClient() = default;
HidlSubscriptionClient(
::android::sp<::android::hardware::automotive::vehicle::V2_0::IVehicle> hal,
std::shared_ptr<ISubscriptionCallback> callback);
::android::base::Result<void> subscribe(
const std::vector<::aidl::android::hardware::automotive::vehicle::SubscribeOptions>&
options) override;
::android::base::Result<void> unsubscribe(const std::vector<int32_t>& propIds) override;
private:
std::shared_ptr<ISubscriptionCallback> mCallback;
::android::sp<::android::hardware::automotive::vehicle::V2_0::IVehicle> mHal;
::android::sp<SubscriptionCallback> mVhalCallback;
};
class SubscriptionCallback :
public ::android::hardware::automotive::vehicle::V2_0::IVehicleCallback {
public:
explicit SubscriptionCallback(std::shared_ptr<ISubscriptionCallback> callback);
::android::hardware::Return<void> onPropertyEvent(
const ::android::hardware::hidl_vec<
hardware::automotive::vehicle::V2_0::VehiclePropValue>& propValues) override;
::android::hardware::Return<void> onPropertySet(
const ::android::hardware::automotive::vehicle::V2_0::VehiclePropValue& propValue)
override;
::android::hardware::Return<void> onPropertySetError(
::android::hardware::automotive::vehicle::V2_0::StatusCode status, int32_t propId,
int32_t areaId) override;
private:
std::shared_ptr<ISubscriptionCallback> mCallback;
};
} // namespace vhal
} // namespace automotive
} // namespace frameworks
} // namespace android
#endif // CPP_VHAL_CLIENT_INCLUDE_HIDLVHALCLIENT_H_