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
63105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectstatic jint 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
93105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    return (jint)devices;
94105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project}
95105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
96105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectstatic void finalize_native(JNIEnv *env, jobject clazz, int 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
106105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectstatic void setLight_native(JNIEnv *env, jobject clazz, int ptr,
107cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134Mike Lockwood        int light, int colorARGB, int flashMode, int onMS, int offMS, int 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[] = {
130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    { "init_native", "()I", (void*)init_native },
13119b8d8acc240c2d68a0b995c55c5e25b67e03ea8Kenny    { "finalize_native", "(I)V", (void*)finalize_native },
132cc9a63dbc2b5569ef65ec3a04d86dbdfdee3f134Mike Lockwood    { "setLight_native", "(IIIIIII)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{
1373a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood    return jniRegisterNativeMethods(env, "com/android/server/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