From 08484f825dba697ac8b0e8b2094d808f44490f7d Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Fri, 14 Oct 2016 12:27:48 -0700 Subject: [PATCH] Added example vendor extension for light. Test: make Bug: 32065239 Change-Id: I8004eaea180d768ccdec0e932d08c1167f5c10cd --- Android.bp | 6 +- example/extension/light/2.0/Android.bp | 47 +++++ example/extension/light/2.0/Android.mk | 178 ++++++++++++++++++ example/extension/light/2.0/IExtLight.hal | 35 ++++ .../extension/light/2.0/default/Android.mk | 17 ++ example/extension/light/2.0/default/Light.cpp | 56 ++++++ example/extension/light/2.0/default/Light.h | 46 +++++ ...are.example.extension.light@2.0-service.rc | 4 + .../extension/light/2.0/default/service.cpp | 34 ++++ example/extension/light/2.0/types.hal | 68 +++++++ 10 files changed, 488 insertions(+), 3 deletions(-) create mode 100644 example/extension/light/2.0/Android.bp create mode 100644 example/extension/light/2.0/Android.mk create mode 100644 example/extension/light/2.0/IExtLight.hal create mode 100644 example/extension/light/2.0/default/Android.mk create mode 100644 example/extension/light/2.0/default/Light.cpp create mode 100644 example/extension/light/2.0/default/Light.h create mode 100644 example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc create mode 100644 example/extension/light/2.0/default/service.cpp create mode 100644 example/extension/light/2.0/types.hal diff --git a/Android.bp b/Android.bp index 0230938559..b13a5f4886 100644 --- a/Android.bp +++ b/Android.bp @@ -5,10 +5,10 @@ subdirs = [ "audio/effect/2.0", "benchmarks/msgq/1.0", "biometrics/fingerprint/2.1", - "boot/1.0", - "boot/1.0/default", - "gnss/1.0", "bluetooth/1.0", + "boot/1.0", + "example/extension/light/2.0", + "gnss/1.0", "graphics/allocator/2.0", "graphics/allocator/2.0/default", "graphics/composer/2.1", diff --git a/example/extension/light/2.0/Android.bp b/example/extension/light/2.0/Android.bp new file mode 100644 index 0000000000..42f34f2507 --- /dev/null +++ b/example/extension/light/2.0/Android.bp @@ -0,0 +1,47 @@ +// This file is autogenerated by hidl-gen. Do not edit manually. + +genrule { + name: "android.hardware.example.extension.light@2.0_genc++", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.example.extension.light@2.0", + srcs: [ + "types.hal", + "IExtLight.hal", + ], + out: [ + "android/hardware/example/extension/light/2.0/types.cpp", + "android/hardware/example/extension/light/2.0/ExtLightAll.cpp", + ], +} + +genrule { + name: "android.hardware.example.extension.light@2.0_genc++_headers", + tool: "hidl-gen", + cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.example.extension.light@2.0", + srcs: [ + "types.hal", + "IExtLight.hal", + ], + out: [ + "android/hardware/example/extension/light/2.0/types.h", + "android/hardware/example/extension/light/2.0/IExtLight.h", + "android/hardware/example/extension/light/2.0/IHwExtLight.h", + "android/hardware/example/extension/light/2.0/BnExtLight.h", + "android/hardware/example/extension/light/2.0/BpExtLight.h", + "android/hardware/example/extension/light/2.0/BsExtLight.h", + ], +} + +cc_library_shared { + name: "android.hardware.example.extension.light@2.0", + generated_sources: ["android.hardware.example.extension.light@2.0_genc++"], + generated_headers: ["android.hardware.example.extension.light@2.0_genc++_headers"], + export_generated_headers: ["android.hardware.example.extension.light@2.0_genc++_headers"], + shared_libs: [ + "libhidl", + "libhwbinder", + "libutils", + "libcutils", + "android.hardware.light@2.0", + ], +} diff --git a/example/extension/light/2.0/Android.mk b/example/extension/light/2.0/Android.mk new file mode 100644 index 0000000000..75157a8b5c --- /dev/null +++ b/example/extension/light/2.0/Android.mk @@ -0,0 +1,178 @@ +# This file is autogenerated by hidl-gen. Do not edit manually. + +LOCAL_PATH := $(call my-dir) + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.example.extension.light@2.0-java +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(local-generated-sources-dir) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_JAVA_LIBRARIES := \ + android.hardware.light@2.0-java \ + + +# +# Build types.hal (Default) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/Default.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.Default + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtBrightness) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/ExtBrightness.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.ExtBrightness + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtLightState) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/ExtLightState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.ExtLightState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IExtLight.hal +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/IExtLight.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::IExtLight + +$(GEN): $(LOCAL_PATH)/IExtLight.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_JAVA_LIBRARY) + + +################################################################################ + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.example.extension.light@2.0-java-static +LOCAL_MODULE_CLASS := JAVA_LIBRARIES + +intermediates := $(local-generated-sources-dir) + +HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX) + +LOCAL_STATIC_JAVA_LIBRARIES := \ + android.hardware.light@2.0-java-static \ + + +# +# Build types.hal (Default) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/Default.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.Default + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtBrightness) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/ExtBrightness.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.ExtBrightness + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build types.hal (ExtLightState) +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/ExtLightState.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::types.ExtLightState + +$(GEN): $(LOCAL_PATH)/types.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) + +# +# Build IExtLight.hal +# +GEN := $(intermediates)/android/hardware/example/extension/light/2.0/IExtLight.java +$(GEN): $(HIDL) +$(GEN): PRIVATE_HIDL := $(HIDL) +$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal +$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal +$(GEN): $(LOCAL_PATH)/types.hal +$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates) +$(GEN): PRIVATE_CUSTOM_TOOL = \ + $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \ + -Ljava -randroid.hardware:hardware/interfaces \ + android.hardware.example.extension.light@2.0::IExtLight + +$(GEN): $(LOCAL_PATH)/IExtLight.hal + $(transform-generated-source) +LOCAL_GENERATED_SOURCES += $(GEN) +include $(BUILD_STATIC_JAVA_LIBRARY) + + + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/example/extension/light/2.0/IExtLight.hal b/example/extension/light/2.0/IExtLight.hal new file mode 100644 index 0000000000..f12a27273b --- /dev/null +++ b/example/extension/light/2.0/IExtLight.hal @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2016 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. + */ + +// Would normally be 'vendor.example.extension.light@2.0' however, this is +// a google extension example. A vendor extension should also live in the +// vendor partition. +package android.hardware.example.extension.light@2.0; + +import android.hardware.light@2.0; + +interface IExtLight extends android.hardware.light@2.0::ILight { + + /** + * Set the provided lights to the provided values. + * + * @param type logical light to set + * @param state describes what the light should look like. + * @return status result of applying state transformation. + */ + setExtLight(Type type, ExtLightState state) generates (Status status); + +}; diff --git a/example/extension/light/2.0/default/Android.mk b/example/extension/light/2.0/default/Android.mk new file mode 100644 index 0000000000..fa687876b8 --- /dev/null +++ b/example/extension/light/2.0/default/Android.mk @@ -0,0 +1,17 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := android.hardware.example.extension.light@2.0-service +LOCAL_INIT_RC := android.hardware.example.extension.light@2.0-service.rc +LOCAL_MODULE_RELATIVE_PATH := hw +LOCAL_SRC_FILES := \ + Light.cpp \ + +LOCAL_SHARED_LIBRARIES := \ + libhidl \ + libhwbinder \ + libutils \ + android.hardware.light@2.0 \ + android.hardware.example.extension.light@2.0 \ + +include $(BUILD_SHARED_LIBRARY) diff --git a/example/extension/light/2.0/default/Light.cpp b/example/extension/light/2.0/default/Light.cpp new file mode 100644 index 0000000000..d738a6d2a6 --- /dev/null +++ b/example/extension/light/2.0/default/Light.cpp @@ -0,0 +1,56 @@ +#include "Light.h" + +namespace android { +namespace hardware { +namespace example { +namespace extension { +namespace light { +namespace V2_0 { +namespace implementation { + +// Methods from ::android::hardware::light::V2_0::ILight follow. +Return Light::setLight(Type type, const LightState& state) { + // Forward types for new methods. + + ExtLightState extState { + .state = state, + .interpolationOmega = + static_cast(Default::INTERPOLATION_OMEGA), + .brightness = // ExtBrightness inherits from Brightness + static_cast(state.brightnessMode) + }; + + return setExtLight(type, extState); +} + +Return Light::getSupportedTypes(getSupportedTypes_cb _hidl_cb) { + // implement unchanged method as you would always + hidl_vec vec{}; + + // ****************************************************** + // Note: awesome proprietary hardware implementation here + // ****************************************************** + + _hidl_cb(vec); + + return Void(); +} + +// Methods from ::android::hardware::example::extension::light::V2_0::ILight follow. +Return Light::setExtLight(Type /* type */, + const ExtLightState& /* state */) { + + // ****************************************************** + // Note: awesome proprietary hardware implementation here + // ****************************************************** + + return Status::SUCCESS; +} + +} // namespace implementation +} // namespace V2_0 +} // namespace light +} // namespace extension +} // namespace example +} // namespace hardware +} // namespace android diff --git a/example/extension/light/2.0/default/Light.h b/example/extension/light/2.0/default/Light.h new file mode 100644 index 0000000000..e09ec9256f --- /dev/null +++ b/example/extension/light/2.0/default/Light.h @@ -0,0 +1,46 @@ +#ifndef HIDL_GENERATED_android_hardware_example_extension_light_V2_0_Light_H_ +#define HIDL_GENERATED_android_hardware_example_extension_light_V2_0_Light_H_ + +#include +#include + +#include +namespace android { +namespace hardware { +namespace example { +namespace extension { +namespace light { +namespace V2_0 { +namespace implementation { + +using ::android::hardware::example::extension::light::V2_0::ExtLightState; +using ::android::hardware::example::extension::light::V2_0::IExtLight; +using ::android::hardware::light::V2_0::ILight; +using ::android::hardware::light::V2_0::LightState; +using ::android::hardware::light::V2_0::Status; +using ::android::hardware::light::V2_0::Type; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::hidl_string; +using ::android::sp; + +struct Light : public IExtLight { + // Methods from ::android::hardware::light::V2_0::ILight follow. + Return setLight(Type type, const LightState& state) override; + Return getSupportedTypes(getSupportedTypes_cb _hidl_cb) override; + + // Methods from ::android::hardware::example::extension::light::V2_0::ILight follow. + Return setExtLight(Type type, const ExtLightState& state) override; + +}; + +} // namespace implementation +} // namespace V2_0 +} // namespace light +} // namespace extension +} // namespace example +} // namespace hardware +} // namespace android + +#endif // HIDL_GENERATED_android_hardware_example_extension_light_V2_0_Light_H_ diff --git a/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc b/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc new file mode 100644 index 0000000000..8a90d816c9 --- /dev/null +++ b/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc @@ -0,0 +1,4 @@ +service light-ext-2-0 /system/bin/hw/android.hardware.example.extension.light@2.0-service + class hal + user system + group system readproc \ No newline at end of file diff --git a/example/extension/light/2.0/default/service.cpp b/example/extension/light/2.0/default/service.cpp new file mode 100644 index 0000000000..55121d9f62 --- /dev/null +++ b/example/extension/light/2.0/default/service.cpp @@ -0,0 +1,34 @@ +#define LOG_TAG "android.hardware.light@2.0-service" +#include + +// #include +// #include + +// #include +// #include +// #include +// #include +// #include + +#include "Light.h" + +using android::sp; + +// libhwbinder: +using android::hardware::IPCThreadState; +using android::hardware::ProcessState; + +// Generated HIDL files +using android::hardware::light::V2_0::ILight; + +int main() { + const char instance[] = "light"; + + android::sp service = new Light(); + + service->registerAsService(instance); + + ProcessState::self()->setThreadPoolMaxThreadCount(0); + ProcessState::self()->startThreadPool(); + IPCThreadState::self()->joinThreadPool(); +} diff --git a/example/extension/light/2.0/types.hal b/example/extension/light/2.0/types.hal new file mode 100644 index 0000000000..5be41bbba0 --- /dev/null +++ b/example/extension/light/2.0/types.hal @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2016 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. + */ + +package android.hardware.example.extension.light@2.0; + +import android.hardware.light@2.0; + +enum Default : int32_t { + // for calls to setLight from the framework that don't know about this + // extension or its requirements + INTERPOLATION_OMEGA = 2 +}; + +/** + * One possibility is renaming an old type. Another possibility is taking + * advantages of the different namespaces. + */ +enum ExtBrightness : Brightness { + /** + * Say we're really going to use the phone as a heater. + */ + EXTREME, + + /** + * Sometimes at night, we need it to be day. + */ + THE_SUN, +}; + +/** + * Structs can't inherit eachother in hidl. Use composition instead. In this + * case, I won't use inheritence because I want to replace Brightness with + * ExtBrightness. + */ +struct ExtLightState { + LightState state; + + /** + * This is the secret sauce that will really make this extension shine. + * No other person has such a cool feature in their hals. Don't forget + * to describe all details of parameters. An interface is a contract, and + * specifying this contract to the letter is what allows that contracted + * to be maintained. :) + * + * So, this parameter represents the speed at which brightness is changed + * to the new value in the three dimensional space with coordinates RGB + * from the red, blue, and green. + */ + int32_t interpolationOmega; + + /** + * Include new values. + */ + ExtBrightness brightness; +};