151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling/*
251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * Copyright (C) 2013 The Android Open Source Project
351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling *
451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * Licensed under the Apache License, Version 2.0 (the "License");
551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * you may not use this file except in compliance with the License.
651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * You may obtain a copy of the License at
751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling *
851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling *      http://www.apache.org/licenses/LICENSE-2.0
951e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling *
1051e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * Unless required by applicable law or agreed to in writing, software
1151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * distributed under the License is distributed on an "AS IS" BASIS,
1251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * See the License for the specific language governing permissions and
1451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling * limitations under the License.
1551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling */
1651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
1751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#define LOG_TAG "ConsumerIrService"
1851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
1951e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#include "jni.h"
20c95dca8ce1bc58a015a938afcfc3e595d1bca16bSteven Moreland#include <nativehelper/JNIHelp.h>
2151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#include "android_runtime/AndroidRuntime.h"
2251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
2351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#include <stdlib.h>
2451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#include <utils/misc.h>
2551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling#include <utils/Log.h>
266a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien#include <android/hardware/ir/1.0/IConsumerIr.h>
27c95dca8ce1bc58a015a938afcfc3e595d1bca16bSteven Moreland#include <nativehelper/ScopedPrimitiveArray.h>
2851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
296a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienusing ::android::hardware::ir::V1_0::IConsumerIr;
306a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienusing ::android::hardware::ir::V1_0::ConsumerIrFreqRange;
316a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienusing ::android::hardware::hidl_vec;
3251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
336a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Briennamespace android {
3451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
356a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienstatic sp<IConsumerIr> mHal;
3651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
376a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienstatic jboolean halOpen(JNIEnv* /* env */, jobject /* obj */) {
386a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    // TODO(b/31632518)
39dab0b0be93887c43e3abdd3d1450566e9312fe25Chris Phoenix    mHal = IConsumerIr::getService();
406a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    return mHal != nullptr;
4151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling}
4251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
436a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienstatic jint halTransmit(JNIEnv *env, jobject /* obj */, jint carrierFrequency,
446a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien   jintArray pattern) {
4551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    ScopedIntArrayRO cPattern(env, pattern);
4651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    if (cPattern.get() == NULL) {
4751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling        return -EINVAL;
4851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    }
496a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    hidl_vec<int32_t> patternVec;
506a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    patternVec.setToExternal(const_cast<int32_t*>(cPattern.get()), cPattern.size());
5151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
520d911aefeec413a45a2561dc49fd8993e219acd6Connor O'Brien    bool success = mHal->transmit(carrierFrequency, patternVec);
536a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    return success ? 0 : -1;
5451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling}
5551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
566a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brienstatic jintArray halGetCarrierFrequencies(JNIEnv *env, jobject /* obj */) {
5751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    int len;
586a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    hidl_vec<ConsumerIrFreqRange> ranges;
596a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    bool success;
6051e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
616a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    auto cb = [&](bool s, hidl_vec<ConsumerIrFreqRange> vec) {
626a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien            ranges = vec;
636a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien            success = s;
646a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    };
656a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    mHal->getCarrierFreqs(cb);
6651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
676a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    if (!success) {
6851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling        return NULL;
6951e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    }
706a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    len = ranges.size();
7151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
7251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    int i;
7351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    ScopedIntArrayRW freqsOut(env, env->NewIntArray(len*2));
7451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    jint *arr = freqsOut.get();
7551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    if (arr == NULL) {
7651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling        return NULL;
7751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    }
7851e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    for (i = 0; i < len; i++) {
796a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien        arr[i*2] = static_cast<jint>(ranges[i].min);
806a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien        arr[i*2+1] = static_cast<jint>(ranges[i].max);
8151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    }
8251e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
8351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    return freqsOut.getJavaArray();
8451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling}
8551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
8676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod method_table[] = {
876a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    { "halOpen", "()Z", (void *)halOpen },
886a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    { "halTransmit", "(I[I)I", (void *)halTransmit },
896a24ab1595aa53c97a7f51cc743aae521c89c87aConnor O'Brien    { "halGetCarrierFrequencies", "()[I", (void *)halGetCarrierFrequencies},
9051e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling};
9151e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
9251e95df8f24e9ea30775686b9e324b9a671213dcErik Gillingint register_android_server_ConsumerIrService(JNIEnv *env) {
9351e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling    return jniRegisterNativeMethods(env, "com/android/server/ConsumerIrService",
9451e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling            method_table, NELEM(method_table));
9551e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling}
9651e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling
9751e95df8f24e9ea30775686b9e324b9a671213dcErik Gilling};
98