Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a24ab15 authored by Connor O'Brien's avatar Connor O'Brien
Browse files

Move ConsumerIrService to HIDL HAL



Test: Service builds successfully and runs on boot.
Change-Id: I0fd90a1ff1d9bde9c1a0872b248f88c5990a1b57
Signed-off-by: default avatarConnor O'Brien <connoro@google.com>
parent 68a9dd8c
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -29,13 +29,13 @@ public class ConsumerIrService extends IConsumerIrService.Stub {

    private static final int MAX_XMIT_TIME = 2000000; /* in microseconds */

    private static native long halOpen();
    private static native int halTransmit(long halObject, int carrierFrequency, int[] pattern);
    private static native int[] halGetCarrierFrequencies(long halObject);
    private static native boolean halOpen();
    private static native int halTransmit(int carrierFrequency, int[] pattern);
    private static native int[] halGetCarrierFrequencies();

    private final Context mContext;
    private final PowerManager.WakeLock mWakeLock;
    private final long mNativeHal;
    private final boolean mHasNativeHal;
    private final Object mHalLock = new Object();

    ConsumerIrService(Context context) {
@@ -45,23 +45,23 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
        mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
        mWakeLock.setReferenceCounted(true);

        mNativeHal = halOpen();
        mHasNativeHal = halOpen();
        if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CONSUMER_IR)) {
            if (mNativeHal == 0) {
            if (!mHasNativeHal) {
                throw new RuntimeException("FEATURE_CONSUMER_IR present, but no IR HAL loaded!");
            }
        } else if (mNativeHal != 0) {
        } else if (mHasNativeHal) {
            throw new RuntimeException("IR HAL present, but FEATURE_CONSUMER_IR is not set!");
        }
    }

    @Override
    public boolean hasIrEmitter() {
        return mNativeHal != 0;
        return mHasNativeHal;
    }

    private void throwIfNoIrEmitter() {
        if (mNativeHal == 0) {
        if (!mHasNativeHal) {
            throw new UnsupportedOperationException("IR emitter not available");
        }
    }
@@ -91,7 +91,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub {

        // Right now there is no mechanism to ensure fair queing of IR requests
        synchronized (mHalLock) {
            int err = halTransmit(mNativeHal, carrierFrequency, pattern);
            int err = halTransmit(carrierFrequency, pattern);

            if (err < 0) {
                Slog.e(TAG, "Error transmitting: " + err);
@@ -109,7 +109,7 @@ public class ConsumerIrService extends IConsumerIrService.Stub {
        throwIfNoIrEmitter();

        synchronized(mHalLock) {
            return halGetCarrierFrequencies(mNativeHal);
            return halGetCarrierFrequencies();
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ LOCAL_SHARED_LIBRARIES += \
    libutils \
    android.hardware.audio.common@2.0 \
    android.hardware.gnss@1.0 \
    android.hardware.ir@1.0 \
    android.hardware.light@2.0 \
    android.hardware.power@1.0 \
    android.hardware.thermal@1.0 \
+31 −48
Original line number Diff line number Diff line
@@ -23,87 +23,70 @@
#include <stdlib.h>
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/consumerir.h>
#include <android/hardware/ir/1.0/IConsumerIr.h>
#include <ScopedPrimitiveArray.h>

namespace android {

static jlong halOpen(JNIEnv* /* env */, jobject /* obj */) {
    hw_module_t const* module;
    consumerir_device_t *dev;
    int err;
using ::android::hardware::ir::V1_0::IConsumerIr;
using ::android::hardware::ir::V1_0::ConsumerIrFreqRange;
using ::android::hardware::hidl_vec;

    err = hw_get_module(CONSUMERIR_HARDWARE_MODULE_ID, &module);
    if (err != 0) {
        ALOGE("Can't open consumer IR HW Module, error: %d", err);
        return 0;
    }
namespace android {

    err = module->methods->open(module, CONSUMERIR_TRANSMITTER,
            (hw_device_t **) &dev);
    if (err < 0) {
        ALOGE("Can't open consumer IR transmitter, error: %d", err);
        return 0;
    }
static sp<IConsumerIr> mHal;

    return reinterpret_cast<jlong>(dev);
static jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) {
    // TODO(b/31632518)
    mHal = IConsumerIr::getService("consumerir");
    return mHal != nullptr;
}

static jint halTransmit(JNIEnv *env, jobject /* obj */, jlong halObject,
   jint carrierFrequency, jintArray pattern) {
    int ret;

    consumerir_device_t *dev = reinterpret_cast<consumerir_device_t*>(halObject);
static jint halTransmit(JNIEnv *env, jobject /* obj */, jint carrierFrequency,
   jintArray pattern) {
    ScopedIntArrayRO cPattern(env, pattern);
    if (cPattern.get() == NULL) {
        return -EINVAL;
    }
    jsize patternLength = cPattern.size();

    ret = dev->transmit(dev, carrierFrequency, cPattern.get(), patternLength);
    hidl_vec<int32_t> patternVec;
    patternVec.setToExternal(const_cast<int32_t*>(cPattern.get()), cPattern.size());

    return reinterpret_cast<jint>(ret);
    bool success = mHal->transmit(carrierFrequency, patternVec, cPattern.size());
    return success ? 0 : -1;
}

static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */,
    jlong halObject) {
    consumerir_device_t *dev = reinterpret_cast<consumerir_device_t*>(halObject);
    consumerir_freq_range_t *ranges;
static jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */) {
    int len;
    hidl_vec<ConsumerIrFreqRange> ranges;
    bool success;

    len = dev->get_num_carrier_freqs(dev);
    if (len <= 0)
        return NULL;

    ranges = new consumerir_freq_range_t[len];
    auto cb = [&](bool s, hidl_vec<ConsumerIrFreqRange> vec) {
            ranges = vec;
            success = s;
    };
    mHal->getCarrierFreqs(cb);

    len = dev->get_carrier_freqs(dev, len, ranges);
    if (len <= 0) {
        delete[] ranges;
    if (!success) {
        return NULL;
    }
    len = ranges.size();

    int i;
    ScopedIntArrayRW freqsOut(env, env->NewIntArray(len*2));
    jint *arr = freqsOut.get();
    if (arr == NULL) {
        delete[] ranges;
        return NULL;
    }
    for (i = 0; i < len; i++) {
        arr[i*2] = ranges[i].min;
        arr[i*2+1] = ranges[i].max;
        arr[i*2] = static_cast<jint>(ranges[i].min);
        arr[i*2+1] = static_cast<jint>(ranges[i].max);
    }

    delete[] ranges;
    return freqsOut.getJavaArray();
}

static const JNINativeMethod method_table[] = {
    { "halOpen", "()J", (void *)halOpen },
    { "halTransmit", "(JI[I)I", (void *)halTransmit },
    { "halGetCarrierFrequencies", "(J)[I", (void *)halGetCarrierFrequencies},
    { "halOpen", "()Z", (void *)halOpen },
    { "halTransmit", "(I[I)I", (void *)halTransmit },
    { "halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies},
};

int register_android_server_ConsumerIrService(JNIEnv *env) {