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