com_android_server_lights_LightsService.cpp revision 182f73fc4da13a6417e5086ec9ecce80eb8423ca
1c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* 2c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2009 The Android Open Source Project 3c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 4c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * you may not use this file except in compliance with the License. 6c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * You may obtain a copy of the License at 7c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 8c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 10c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Unless required by applicable law or agreed to in writing, software 11c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * See the License for the specific language governing permissions and 14c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * limitations under the License. 15c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 16c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 17c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#define LOG_TAG "LightsService" 18c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 19c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "jni.h" 20c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "JNIHelp.h" 21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "android_runtime/AndroidRuntime.h" 22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include <utils/misc.h> 24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include <utils/Log.h> 25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include <hardware/hardware.h> 26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include <hardware/lights.h> 27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include <stdio.h> 29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentnamespace android 31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent// These values must correspond with the LIGHT_ID constants in 34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent// LightsService.java 35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentenum { 36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_BACKLIGHT = 0, 37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_KEYBOARD = 1, 38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_BUTTONS = 2, 39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_BATTERY = 3, 40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_NOTIFICATIONS = 4, 41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_ATTENTION = 5, 42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_BLUETOOTH = 6, 43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_INDEX_WIFI = 7, 44c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LIGHT_COUNT 45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}; 46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentstruct Devices { 48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent light_device_t* lights[LIGHT_COUNT]; 49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}; 50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentstatic light_device_t* get_device(hw_module_t* module, char const* name) 52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent int err; 54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent hw_device_t* device; 55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent err = module->methods->open(module, name, &device); 56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (err == 0) { 575185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent return (light_device_t*)device; 585185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent } else { 59c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return NULL; 60c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 61c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 62c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 63c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentstatic jint init_native(JNIEnv *env, jobject clazz) 64c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 65c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent int err; 66c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent hw_module_t* module; 67c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Devices* devices; 68c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 69c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices = (Devices*)malloc(sizeof(Devices)); 70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 71c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 72c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (err == 0) { 73c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_BACKLIGHT] 74c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_BACKLIGHT); 75c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_KEYBOARD] 76c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_KEYBOARD); 77c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_BUTTONS] 78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_BUTTONS); 79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_BATTERY] 80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_BATTERY); 81c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_NOTIFICATIONS] 82c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_NOTIFICATIONS); 83c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_ATTENTION] 84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_ATTENTION); 85c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_BLUETOOTH] 86c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_BLUETOOTH); 87c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[LIGHT_INDEX_WIFI] 88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent = get_device(module, LIGHT_ID_WIFI); 89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } else { 90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent memset(devices, 0, sizeof(Devices)); 91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return (jint)devices; 94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentstatic void finalize_native(JNIEnv *env, jobject clazz, int ptr) 97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 985185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent Devices* devices = (Devices*)ptr; 995185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent if (devices == NULL) { 1005185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent return; 1015185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent } 1025185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent 1035185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent free(devices); 1045185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent} 1055185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent 1065185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurentstatic void setLight_native(JNIEnv *env, jobject clazz, int ptr, 1075185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent int light, int colorARGB, int flashMode, int onMS, int offMS, int brightnessMode) 1085185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent{ 1095185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent Devices* devices = (Devices*)ptr; 1105185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent light_state_t state; 1115185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent 1125185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) { 1135185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent return ; 1145185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent } 1155185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent 1165185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent memset(&state, 0, sizeof(light_state_t)); 1175185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent state.color = colorARGB; 1185185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent state.flashMode = flashMode; 1195185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent state.flashOnMS = onMS; 1205185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent state.flashOffMS = offMS; 121c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent state.brightnessMode = brightnessMode; 122c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 124c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent ALOGD_IF_SLOW(50, "Excessive delay setting light"); 125c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent devices->lights[light]->set_light(devices->lights[light], &state); 126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentstatic JNINativeMethod method_table[] = { 130c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { "init_native", "()I", (void*)init_native }, 1315185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent { "finalize_native", "(I)V", (void*)finalize_native }, 132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { "setLight_native", "(IIIIIII)V", (void*)setLight_native }, 133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}; 1345185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent 1355185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurentint register_android_server_LightsService(JNIEnv *env) 1365185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent{ 1375185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent return jniRegisterNativeMethods(env, "com/android/server/lights/LightsService", 138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent method_table, NELEM(method_table)); 139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1415185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent}; 1425185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent