2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
25 #include <devman_haptic.h>
29 #include "haptic_private.h"
32 #define LOG_TAG "TIZEN_SYSTEM_HAPTIC"
34 #define NOT_ASSIGNED -1
35 #define VIBE_SILENCE -128
37 #define _MSG_HAPTIC_ERROR_INVALID_PARAMETER "Invalid parameter"
38 #define _MSG_HAPTIC_ERROR_NO_SUCH_FILE "No such file"
39 #define _MSG_HAPTIC_ERROR_NOT_SUPPORTED_FORMAT "Not supported format"
40 #define _MSG_HAPTIC_ERROR_NOT_INITIALIZED "Not initialize"
41 #define _MSG_HAPTIC_ERROR_OPERATION_FAILED "Operation failed"
43 #define RETURN_ERR_MSG(err_code, msg) \
45 LOGE("[%s] "_MSG_##err_code"(0x%08x) : %s", __FUNCTION__, err_code, msg); \
49 #define RETURN_ERR(err_code) \
51 LOGE("[%s] "_MSG_##err_code"(0x%08x)", __FUNCTION__, err_code); \
61 struct _vibe_pattern {
62 haptic_vibration_iter_s *iters;
71 static const int UNDEFINED = 0;
72 static const int START = 1;
74 GArray *pattern_table = NULL;
76 static int initialize = 0;
77 static int max_device = 0;
79 static int* haptic_ids = NULL;
81 int haptic_get_count(int* vibrator_number)
84 if(vibrator_number == NULL)
85 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
87 count = device_haptic_get_device_count();
89 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
91 *vibrator_number = count;
93 return HAPTIC_ERROR_NONE;
96 int haptic_initialize()
102 return HAPTIC_ERROR_NONE;
105 if( haptic_get_count(&max_device) < 0)
106 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
108 haptic_ids = (int*)malloc(sizeof(int)*max_device+1); // max + zero
110 if(haptic_ids == NULL){
111 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
114 for(i=0; i<=max_device; i++){
115 id = device_haptic_open(_DEV[i], 0);
117 for (j=i; i>=0; i--){
118 device_haptic_close(haptic_ids[i]);
120 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
128 pattern_table = g_array_new(FALSE, TRUE, sizeof(int));
132 return HAPTIC_ERROR_NONE;
135 int haptic_deinitialize()
140 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
142 for(i=0; i<=max_device; i++){
143 err = device_haptic_close(haptic_ids[i]);
146 if(haptic_ids != NULL)
149 g_array_free(pattern_table, TRUE);
150 pattern_table = NULL;
154 return HAPTIC_ERROR_NONE;
158 int haptic_vibrate_monotone(int device_index, int duration_ms, int level)
162 if(device_index < 0 || device_index > max_device)
163 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
165 if(level < HAPTIC_LEVEL_AUTO || level > HAPTIC_LEVEL_5)
166 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
168 device_index = ((device_index < 3) ? device_index : 0); // xxx
171 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
173 if(level == HAPTIC_LEVEL_0)
174 return HAPTIC_ERROR_NONE;
176 ret = device_haptic_play_monotone_with_detail_feedback_level(haptic_ids[device_index], duration_ms, level);
180 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
182 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
185 return HAPTIC_ERROR_NONE;
188 int haptic_stop_device(int device_index)
192 if(device_index < 0 || device_index > max_device)
193 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
195 device_index = ((device_index < 3) ? device_index : 0); // xxx
198 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
200 ret = device_haptic_stop_play(haptic_ids[device_index]);
204 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
206 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
209 return HAPTIC_ERROR_NONE;
212 static int _haptic_play_monotone(int device_index, long duration, int level)
216 if(device_index < 0 || device_index > max_device)
217 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
219 device_index = ((device_index < 3) ? device_index : 0); // xxx
222 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
224 if(level == HAPTIC_LEVEL_AUTO) {
225 level = HAPTIC_FEEDBACK_LEVEL_AUTO;
227 level = level > 100 ? 100 : (level < 0 ? 0 : level);
230 ret = device_haptic_play_monotone_with_detail_feedback_level(haptic_ids[device_index], duration, level);
234 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
236 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
239 return HAPTIC_ERROR_NONE;
242 static gboolean _haptic_play_iter(gpointer data)
245 struct _vibe_pattern* pattern = NULL;
247 pattern = (struct _vibe_pattern*)data;
252 if(pattern_table == NULL || g_array_index(pattern_table, int, pattern->pattern_index) != START) {
253 free(pattern->iters);
257 if(pattern->iters == NULL)
259 int current = pattern->current;
261 int device = pattern->iters[current].vibrator_index;
262 long time = pattern->iters[current].time;
263 int level = pattern->level;
265 // set default device, if can't find given device.
266 if(device >= max_device || device < 0)
269 if(level != 0 || time != 0){
270 err = _haptic_play_monotone(device, time, level);
272 pattern->error = err;
276 // pattern play finish
277 if(++pattern->current >= pattern->size){
278 if(pattern->iter_count <= 0){
279 free(pattern->iters);
283 pattern->current = 0;
284 pattern->iter_count--;
287 g_timeout_add(time, _haptic_play_iter, data);
292 int haptic_play_pattern(haptic_vibration_iter_s* pattern, int pattern_size, int count, int level, int* id)
297 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
300 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
303 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
305 haptic_vibration_iter_s* tmp_ptn = (haptic_vibration_iter_s*)
306 malloc(sizeof(haptic_vibration_iter_s) * pattern_size);
308 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
310 memcpy(tmp_ptn, pattern, sizeof(haptic_vibration_iter_s) * pattern_size);
312 struct _vibe_pattern* vibe_p = (struct _vibe_pattern*)malloc(sizeof(struct _vibe_pattern));
315 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
317 vibe_p->iters = tmp_ptn;
318 vibe_p->size = pattern_size;
319 vibe_p->level = level;
320 vibe_p->iter_count = count;
324 for(i=0; i< pattern_table->len; i++){
325 if(g_array_index(pattern_table, int, i) == UNDEFINED){
331 g_array_append_val(pattern_table, START);
332 key = pattern_table->len -1;
334 g_array_index(pattern_table, int, key) = START;
337 vibe_p->pattern_index = key;
339 _haptic_play_iter((gpointer)vibe_p);
341 int error = vibe_p->error;
347 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
349 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
354 return HAPTIC_ERROR_NONE;
357 int haptic_stop_pattern(int id)
360 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
362 if(!initialize || pattern_table == NULL)
363 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
365 if(id >= pattern_table->len)
366 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
368 g_array_index(pattern_table, int, id) = UNDEFINED;
370 return HAPTIC_ERROR_NONE;