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 level = (level == HAPTIC_LEVEL_AUTO) ? 0 : level;
177 ret = device_haptic_play_monotone_with_detail_feedback_level(haptic_ids[device_index], duration_ms, level);
181 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
183 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
186 return HAPTIC_ERROR_NONE;
189 int haptic_stop_device(int device_index)
193 if(device_index < 0 || device_index > max_device)
194 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
196 device_index = ((device_index < 3) ? device_index : 0); // xxx
199 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
201 ret = device_haptic_stop_play(haptic_ids[device_index]);
205 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
207 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
210 return HAPTIC_ERROR_NONE;
213 static int _haptic_play_monotone(int device_index, long duration, int level)
217 if(device_index < 0 || device_index > max_device)
218 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
220 device_index = ((device_index < 3) ? device_index : 0); // xxx
223 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
225 if(level == HAPTIC_LEVEL_AUTO) {
226 level = HAPTIC_FEEDBACK_LEVEL_AUTO;
228 level = level > 100 ? 100 : (level < 0 ? 0 : level);
231 ret = device_haptic_play_monotone_with_detail_feedback_level(haptic_ids[device_index], duration, level);
235 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
237 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
240 return HAPTIC_ERROR_NONE;
243 static gboolean _haptic_play_iter(gpointer data)
246 struct _vibe_pattern* pattern = NULL;
248 pattern = (struct _vibe_pattern*)data;
253 if(pattern_table == NULL || g_array_index(pattern_table, int, pattern->pattern_index) != START) {
254 free(pattern->iters);
258 if(pattern->iters == NULL)
260 int current = pattern->current;
262 int device = pattern->iters[current].vibrator_index;
263 long time = pattern->iters[current].time;
264 int level = pattern->level;
266 // set default device, if can't find given device.
267 if(device >= max_device || device < 0)
270 if(level != 0 || time != 0){
271 err = _haptic_play_monotone(device, time, level);
273 pattern->error = err;
277 // pattern play finish
278 if(++pattern->current >= pattern->size){
279 if(pattern->iter_count <= 0){
280 free(pattern->iters);
284 pattern->current = 0;
285 pattern->iter_count--;
288 g_timeout_add(time, _haptic_play_iter, data);
293 int haptic_play_pattern(haptic_vibration_iter_s* pattern, int pattern_size, int count, int level, int* id)
298 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
301 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
304 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
306 haptic_vibration_iter_s* tmp_ptn = (haptic_vibration_iter_s*)
307 malloc(sizeof(haptic_vibration_iter_s) * pattern_size);
309 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
311 memcpy(tmp_ptn, pattern, sizeof(haptic_vibration_iter_s) * pattern_size);
313 struct _vibe_pattern* vibe_p = (struct _vibe_pattern*)malloc(sizeof(struct _vibe_pattern));
316 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
318 vibe_p->iters = tmp_ptn;
319 vibe_p->size = pattern_size;
320 vibe_p->level = level;
321 vibe_p->iter_count = count;
325 for(i=0; i< pattern_table->len; i++){
326 if(g_array_index(pattern_table, int, i) == UNDEFINED){
332 g_array_append_val(pattern_table, START);
333 key = pattern_table->len -1;
335 g_array_index(pattern_table, int, key) = START;
338 vibe_p->pattern_index = key;
340 _haptic_play_iter((gpointer)vibe_p);
342 int error = vibe_p->error;
348 RETURN_ERR(HAPTIC_ERROR_OPERATION_FAILED);
350 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
355 return HAPTIC_ERROR_NONE;
358 int haptic_stop_pattern(int id)
361 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
363 if(!initialize || pattern_table == NULL)
364 RETURN_ERR(HAPTIC_ERROR_NOT_INITIALIZED);
366 if(id >= pattern_table->len)
367 RETURN_ERR(HAPTIC_ERROR_INVALID_PARAMETER);
369 g_array_index(pattern_table, int, id) = UNDEFINED;
371 return HAPTIC_ERROR_NONE;