13a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood/* 23a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Copyright (C) 2009 The Android Open Source Project 33a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * 43a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 53a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * you may not use this file except in compliance with the License. 63a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * You may obtain a copy of the License at 73a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * 83a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 93a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * 103a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * Unless required by applicable law or agreed to in writing, software 113a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 123a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * See the License for the specific language governing permissions and 143a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood * limitations under the License. 153a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood */ 163a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood 173a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood#define LOG_TAG "LightsService" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 22105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 25105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project#include <hardware/hardware.h> 26105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project#include <hardware/lights.h> 27105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 28105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project#include <stdio.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project// These values must correspond with the LIGHT_ID constants in 343a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood// LightsService.java 35105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectenum { 36105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_BACKLIGHT = 0, 37105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_KEYBOARD = 1, 38105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_BUTTONS = 2, 39105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_BATTERY = 3, 40105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_NOTIFICATIONS = 4, 41105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_INDEX_ATTENTION = 5, 423cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood LIGHT_INDEX_BLUETOOTH = 6, 433cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood LIGHT_INDEX_WIFI = 7, 44105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project LIGHT_COUNT 45105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project}; 46105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 47105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectstruct Devices { 48105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project light_device_t* lights[LIGHT_COUNT]; 49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project}; 50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectstatic light_device_t* get_device(hw_module_t* module, char const* name) 52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project int err; 54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project hw_device_t* device; 55105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project err = module->methods->open(module, name, &device); 56105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (err == 0) { 57105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return (light_device_t*)device; 58105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 59105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return NULL; 60105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 61105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 62105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 6326872f4b9e634d77ecd78e4eee9d5d070f8553f8Andreas Gampestatic jlong init_native(JNIEnv* /* env */, jobject /* clazz */) 64105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 65105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project int err; 66105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project hw_module_t* module; 67105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Devices* devices; 68105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 69105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices = (Devices*)malloc(sizeof(Devices)); 70105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 71105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); 72105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (err == 0) { 73105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_BACKLIGHT] 74105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_BACKLIGHT); 75105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_KEYBOARD] 76105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_KEYBOARD); 77105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_BUTTONS] 78105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_BUTTONS); 79105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_BATTERY] 80105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_BATTERY); 81105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_NOTIFICATIONS] 82105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_NOTIFICATIONS); 83105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project devices->lights[LIGHT_INDEX_ATTENTION] 84105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project = get_device(module, LIGHT_ID_ATTENTION); 853cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood devices->lights[LIGHT_INDEX_BLUETOOTH] 863cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood = get_device(module, LIGHT_ID_BLUETOOTH); 873cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood devices->lights[LIGHT_INDEX_WIFI] 883cb67a37f185a7a5b12712907630acb68e0ac402Mike Lockwood = get_device(module, LIGHT_ID_WIFI); 89105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 90105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project memset(devices, 0, sizeof(Devices)); 91105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 92105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 937e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat return (jlong)devices; 94105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 95105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 9626872f4b9e634d77ecd78e4eee9d5d070f8553f8Andreas Gampestatic void finalize_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr) 97105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 98105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Devices* devices = (Devices*)ptr; 99105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (devices == NULL) { 100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return; 101105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 102105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 103105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project free(devices); 104105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 105105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 10626872f4b9e634d77ecd78e4eee9d5d070f8553f8Andreas Gampestatic void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr, 1077e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat jint light, jint colorARGB, jint flashMode, jint onMS, jint offMS, jint brightnessMode) 108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project{ 109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Devices* devices = (Devices*)ptr; 110105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project light_state_t state; 111105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 112105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (light < 0 || light >= LIGHT_COUNT || devices->lights[light] == NULL) { 113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return ; 114105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project memset(&state, 0, sizeof(light_state_t)); 117105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project state.color = colorARGB; 118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project state.flashMode = flashMode; 119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project state.flashOnMS = onMS; 120105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project state.flashOffMS = offMS; 121cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134Mike Lockwood state.brightnessMode = brightnessMode; 122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1239630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown { 1249630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown ALOGD_IF_SLOW(50, "Excessive delay setting light"); 1259630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown devices->lights[light]->set_light(devices->lights[light], &state); 1269630704ed3b265f008a8f64ec60a33cf9dcd3345Jeff Brown } 127105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 128105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod method_table[] = { 1307e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat { "init_native", "()J", (void*)init_native }, 1317e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat { "finalize_native", "(J)V", (void*)finalize_native }, 1327e2a9dcf1a4044ed3f81c5b736b5027231395b73Ashok Bhat { "setLight_native", "(JIIIIII)V", (void*)setLight_native }, 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1353a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwoodint register_android_server_LightsService(JNIEnv *env) 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 137182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski return jniRegisterNativeMethods(env, "com/android/server/lights/LightsService", 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method_table, NELEM(method_table)); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 142