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