3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
23 #include <sys/types.h>
29 #include <haptic_plugin_intf.h>
30 #include "haptic_module_log.h"
34 #define EXTAPI __attribute__ ((visibility("default")))
37 #define DEFAULT_MOTOR_COUNT 1
38 #define DEFAULT_DEVICE_HANDLE 0x01
39 #define DEFAULT_EFFECT_HANDLE 0x02
40 #define HAPTIC_FEEDBACK_AUTO 101
41 #define HAPTIC_PLAY_FILE_EXT ".tht"
43 /* START of Static Function Section */
44 static int __to_level(int feedback, int *type)
50 int status = GetHapticLevelMax(&max);
52 MODULE_ERROR("GetHapticLevelMax fail : %d", status);
53 return HAPTIC_MODULE_OPERATION_FAILED;
57 t = feedback * max / HAPTIC_MODULE_FEEDBACK_MAX;
58 MODULE_LOG("feedback value is changed : %d -> %d", feedback, t);
66 static void __trim_name(const char *file_name, char *vibe_buffer, int size)
74 snprintf(vibe_buffer, size, "%s", file_name);
76 length = strlen(vibe_buffer);
77 while (vibe_buffer[--length] == ' ');
78 vibe_buffer[length + 1] = '\0';
81 static int __check_ext(const char *name)
87 ext = strrchr(name, '.');
88 if (ext && !strcmp(ext, HAPTIC_PLAY_FILE_EXT))
94 static int __get_size(FILE *pf, const char *fname)
101 status = fseek(pf, 0, SEEK_END);
103 MODULE_ERROR("fseek failed: %s", fname);
109 status = fseek(pf, 0, SEEK_SET);
111 MODULE_ERROR("fseek failed: %s", fname);
118 static unsigned char *__read_file(const char *fname)
123 unsigned char *vibe_buffer;
127 pf = fopen(fname, "rb");
129 MODULE_ERROR("fopen failed: %s", fname);
133 size = __get_size(pf, fname);
139 vibe_buffer = malloc(size);
142 MODULE_ERROR("buffer alloc failed");
146 status = fread(vibe_buffer, 1, size, pf);
147 if (status != size) {
148 MODULE_ERROR("fread failed: expect %d read %d", size, status);
158 static unsigned char* __convert_file_to_buffer(const char *file_name)
160 char fname[FILENAME_MAX];
163 __trim_name(file_name, fname, sizeof(fname));
164 status = __check_ext(fname);
166 MODULE_ERROR("__check_file faild");
170 return __read_file(fname);
173 static int __save_file(const unsigned char *vibe_buferf, int size, const char *file_name)
179 pf = fopen(file_name, "wb+");
181 MODULE_ERROR("To open file is failed");
182 return HAPTIC_MODULE_OPERATION_FAILED;
185 status = fwrite(vibe_buferf, 1, size, pf);
186 if (status != size) {
187 MODULE_ERROR("To write file is failed");
188 return HAPTIC_MODULE_OPERATION_FAILED;
193 MODULE_ERROR("To get file descriptor is failed");
194 return HAPTIC_MODULE_OPERATION_FAILED;
199 MODULE_ERROR("To be synchronized with the disk is failed");
200 return HAPTIC_MODULE_OPERATION_FAILED;
208 static int __vibrate(const unsigned char *vibe_buffer, int iteration, int feedback, int priority, int *effect_handle)
216 status = __to_level(feedback, &level);
217 if (status != HAPTIC_MODULE_ERROR_NONE)
220 status = PlayHapticBuffer(vibe_buffer, iteration, level, &handle);
222 MODULE_ERROR("PlayHapticBuffer fail: %d", status);
223 return HAPTIC_MODULE_OPERATION_FAILED;
227 *effect_handle = handle;
231 /* END of Static Function Section */
234 static int _get_device_count(int *count)
237 return HAPTIC_MODULE_INVALID_ARGUMENT;
239 *count = DEFAULT_MOTOR_COUNT;
241 return HAPTIC_MODULE_ERROR_NONE;
244 static int _open_device(int device_index, int *device_handle)
246 if (device_index < HAPTIC_MODULE_DEVICE_0 || device_index > HAPTIC_MODULE_DEVICE_ALL)
247 return HAPTIC_MODULE_INVALID_ARGUMENT;
249 if (device_handle == NULL)
250 return HAPTIC_MODULE_INVALID_ARGUMENT;
252 *device_handle = DEFAULT_DEVICE_HANDLE;
253 return HAPTIC_MODULE_ERROR_NONE;
256 static int _close_device(int device_handle)
260 if (device_handle < 0)
261 return HAPTIC_MODULE_INVALID_ARGUMENT;
263 status = CloseHapticDevice();
265 MODULE_ERROR("CloseHapticDevice fail : %d", status);
266 return HAPTIC_MODULE_OPERATION_FAILED;
269 return HAPTIC_MODULE_ERROR_NONE;
272 static int _vibrate_monotone(int device_handle, int duration, int feedback, int priority, int *effect_handle)
277 if (device_handle < 0)
278 return HAPTIC_MODULE_INVALID_ARGUMENT;
281 return HAPTIC_MODULE_INVALID_ARGUMENT;
283 if (feedback < HAPTIC_MODULE_FEEDBACK_MIN || feedback > HAPTIC_MODULE_FEEDBACK_MAX)
284 return HAPTIC_MODULE_INVALID_ARGUMENT;
286 if (priority < HAPTIC_MODULE_PRIORITY_MIN || priority > HAPTIC_MODULE_PRIORITY_HIGH)
287 return HAPTIC_MODULE_INVALID_ARGUMENT;
289 if (effect_handle == NULL)
290 return HAPTIC_MODULE_INVALID_ARGUMENT;
292 if (feedback == HAPTIC_MODULE_FEEDBACK_MIN)
293 return HAPTIC_MODULE_ERROR_NONE;
295 status = __to_level(feedback, &input_feedback);
296 if (status != HAPTIC_MODULE_ERROR_NONE)
299 status = SetHapticLevel(input_feedback);
301 MODULE_ERROR("SetHapticLevel fail : %d", status);
302 return HAPTIC_MODULE_OPERATION_FAILED;
305 status = SetHapticOneshot(duration);
307 MODULE_ERROR("SetHapticOneshot fail : %d", status);
308 return HAPTIC_MODULE_OPERATION_FAILED;
311 *effect_handle = DEFAULT_EFFECT_HANDLE;
313 return HAPTIC_MODULE_ERROR_NONE;
316 static int _vibrate_file(int device_handle, const char *file_path, int iteration, int feedback, int priority, int *effect_handle)
319 unsigned char *vibe_buffer;
321 if (device_handle < 0)
322 return HAPTIC_MODULE_INVALID_ARGUMENT;
324 if (file_path == NULL)
325 return HAPTIC_MODULE_INVALID_ARGUMENT;
327 if (iteration < HAPTIC_MODULE_ITERATION_ONCE || iteration > HAPTIC_MODULE_ITERATION_INFINITE)
328 return HAPTIC_MODULE_INVALID_ARGUMENT;
330 if (feedback < HAPTIC_MODULE_FEEDBACK_MIN || feedback > HAPTIC_MODULE_FEEDBACK_MAX)
331 return HAPTIC_MODULE_INVALID_ARGUMENT;
333 if (priority < HAPTIC_MODULE_PRIORITY_MIN || priority > HAPTIC_MODULE_PRIORITY_HIGH)
334 return HAPTIC_MODULE_INVALID_ARGUMENT;
336 if (effect_handle == NULL)
337 return HAPTIC_MODULE_INVALID_ARGUMENT;
339 if (feedback == HAPTIC_MODULE_FEEDBACK_MIN)
340 return HAPTIC_MODULE_ERROR_NONE;
342 vibe_buffer = __convert_file_to_buffer(file_path);
344 MODULE_ERROR("File load filed");
345 return HAPTIC_MODULE_OPERATION_FAILED;
348 status = __vibrate(vibe_buffer, iteration, feedback , priority, effect_handle);
354 static int _vibrate_buffer(int device_handle, const unsigned char *vibe_buffer, int iteration, int feedback, int priority, int *effect_handle)
356 if (device_handle < 0)
357 return HAPTIC_MODULE_INVALID_ARGUMENT;
359 if (vibe_buffer == NULL)
360 return HAPTIC_MODULE_INVALID_ARGUMENT;
362 if (iteration < HAPTIC_MODULE_ITERATION_ONCE || iteration > HAPTIC_MODULE_ITERATION_INFINITE)
363 return HAPTIC_MODULE_INVALID_ARGUMENT;
365 if (feedback < HAPTIC_MODULE_FEEDBACK_MIN || feedback > HAPTIC_MODULE_FEEDBACK_MAX)
366 return HAPTIC_MODULE_INVALID_ARGUMENT;
368 if (priority < HAPTIC_MODULE_PRIORITY_MIN || priority > HAPTIC_MODULE_PRIORITY_HIGH)
369 return HAPTIC_MODULE_INVALID_ARGUMENT;
371 if (effect_handle == NULL)
372 return HAPTIC_MODULE_INVALID_ARGUMENT;
374 if (feedback == HAPTIC_MODULE_FEEDBACK_MIN)
375 return HAPTIC_MODULE_ERROR_NONE;
377 return __vibrate(vibe_buffer, iteration, feedback, priority, effect_handle);
380 static int _stop_effect(int device_handle, int effect_handle)
384 if (device_handle < 0)
385 return HAPTIC_MODULE_INVALID_ARGUMENT;
387 if (effect_handle < 0)
388 return HAPTIC_MODULE_INVALID_ARGUMENT;
390 status = StopHaptic();
392 MODULE_ERROR("StopHaptic fail : %d", status);
393 return HAPTIC_MODULE_OPERATION_FAILED;
396 return HAPTIC_MODULE_ERROR_NONE;
399 static int _stop_all_effects(int device_handle)
403 if (device_handle < 0)
404 return HAPTIC_MODULE_INVALID_ARGUMENT;
406 status = StopHaptic();
408 MODULE_ERROR("StopHaptic fail : %d", status);
409 return HAPTIC_MODULE_OPERATION_FAILED;
412 return HAPTIC_MODULE_ERROR_NONE;
415 static int _pause_effect(int device_handle, int effect_handle)
417 if (device_handle < 0)
418 return HAPTIC_MODULE_INVALID_ARGUMENT;
420 if (effect_handle < 0)
421 return HAPTIC_MODULE_INVALID_ARGUMENT;
423 MODULE_ERROR("This device is not supported this function(%s)", __func__);
424 return HAPTIC_MODULE_NOT_SUPPORTED;
427 static int _resume_effect(int device_handle, int effect_handle)
429 if (device_handle < 0)
430 return HAPTIC_MODULE_INVALID_ARGUMENT;
432 if (effect_handle < 0)
433 return HAPTIC_MODULE_INVALID_ARGUMENT;
435 MODULE_ERROR("This device is not supported this function(%s)", __func__);
436 return HAPTIC_MODULE_NOT_SUPPORTED;
439 static int _get_effect_state(int device_handle, int effect_handle, int *state)
441 if (device_handle < 0)
442 return HAPTIC_MODULE_INVALID_ARGUMENT;
444 if (effect_handle < 0)
445 return HAPTIC_MODULE_INVALID_ARGUMENT;
448 return HAPTIC_MODULE_INVALID_ARGUMENT;
450 MODULE_ERROR("This device is not supported this function(%s)", __func__);
451 return HAPTIC_MODULE_NOT_SUPPORTED;
454 static int _create_effect(unsigned char *vibe_buffer, int max_bufsize, haptic_module_effect_element *elem_arr, int max_elemcnt)
460 if (vibe_buffer == NULL)
461 return HAPTIC_MODULE_INVALID_ARGUMENT;
464 return HAPTIC_MODULE_INVALID_ARGUMENT;
466 if (elem_arr == NULL)
467 return HAPTIC_MODULE_INVALID_ARGUMENT;
470 return HAPTIC_MODULE_INVALID_ARGUMENT;
472 status = InitializeHapticBuffer(vibe_buffer, max_bufsize);
474 MODULE_ERROR("InitializeHapticBuffer fail: %d", status);
475 return HAPTIC_MODULE_OPERATION_FAILED;
478 MODULE_LOG("effect count : %d", max_elemcnt);
479 for (i = 0; i < max_elemcnt; ++i) {
480 elem.duration = elem_arr[i].haptic_duration;
481 elem.level = elem_arr[i].haptic_level;
482 MODULE_LOG("%d) duration : %d, level : %d", i, elem_arr[i].haptic_duration, elem_arr[i].haptic_level);
484 status = InsertHapticElement(vibe_buffer, max_bufsize, &elem);
486 MODULE_ERROR("InsertHapticElement fail: %d", status);
487 return HAPTIC_MODULE_OPERATION_FAILED;
491 return HAPTIC_MODULE_ERROR_NONE;
494 static int _save_effect(const unsigned char *vibe_buffer, int max_bufsize, const char *file_path)
499 if (vibe_buffer == NULL)
500 return HAPTIC_MODULE_INVALID_ARGUMENT;
503 return HAPTIC_MODULE_INVALID_ARGUMENT;
505 if (file_path == NULL)
506 return HAPTIC_MODULE_INVALID_ARGUMENT;
508 status = GetHapticBufferSize(vibe_buffer, &size);
510 MODULE_ERROR("GetHapticBufferSize fail: %d", status);
511 return HAPTIC_MODULE_OPERATION_FAILED;
514 return __save_file(vibe_buffer, size, file_path);
517 static int _get_file_duration(int device_handle, const char *file_path, int *file_duration)
520 unsigned char *vibe_buffer;
523 if (device_handle < 0)
524 return HAPTIC_MODULE_INVALID_ARGUMENT;
526 if (file_path == NULL)
527 return HAPTIC_MODULE_INVALID_ARGUMENT;
529 if (file_duration == NULL)
530 return HAPTIC_MODULE_INVALID_ARGUMENT;
532 vibe_buffer = __convert_file_to_buffer(file_path);
534 MODULE_ERROR("File load filed");
535 return HAPTIC_MODULE_OPERATION_FAILED;
538 status = GetHapticBufferDuration(vibe_buffer, &duration);
541 MODULE_ERROR("GetHapticBufferDuration fail: %d", status);
543 return HAPTIC_MODULE_OPERATION_FAILED;
546 *file_duration = duration;
547 return HAPTIC_MODULE_ERROR_NONE;
550 static int _get_buffer_duration(int device_handle, const unsigned char *vibe_buffer, int *buffer_duration)
555 if (device_handle < 0)
556 return HAPTIC_MODULE_INVALID_ARGUMENT;
558 if (vibe_buffer == NULL)
559 return HAPTIC_MODULE_INVALID_ARGUMENT;
561 if (buffer_duration == NULL)
562 return HAPTIC_MODULE_INVALID_ARGUMENT;
564 status = GetHapticBufferDuration(vibe_buffer, &duration);
566 MODULE_ERROR("GetHapticBufferDuration fail: %d", status);
567 return HAPTIC_MODULE_OPERATION_FAILED;
570 *buffer_duration = duration;
572 return HAPTIC_MODULE_ERROR_NONE;
575 static int _convert_binary (void)
577 MODULE_ERROR("This device is not supported this function(%s)", __func__);
578 return HAPTIC_MODULE_NOT_SUPPORTED;
581 static const haptic_plugin_interface haptic_plugin_tizen = {
582 .haptic_internal_get_device_count = _get_device_count,
583 .haptic_internal_open_device = _open_device,
584 .haptic_internal_close_device = _close_device,
585 .haptic_internal_vibrate_monotone = _vibrate_monotone,
586 .haptic_internal_vibrate_file = _vibrate_file,
587 .haptic_internal_vibrate_buffer = _vibrate_buffer,
588 .haptic_internal_stop_effect = _stop_effect,
589 .haptic_internal_stop_all_effects = _stop_all_effects,
590 .haptic_internal_pause_effect = _pause_effect,
591 .haptic_internal_resume_effect = _resume_effect,
592 .haptic_internal_get_effect_state = _get_effect_state,
593 .haptic_internal_create_effect = _create_effect,
594 .haptic_internal_save_effect = _save_effect,
595 .haptic_internal_get_file_duration = _get_file_duration,
596 .haptic_internal_get_buffer_duration = _get_buffer_duration,
597 .haptic_internal_convert_binary = _convert_binary,
601 const haptic_plugin_interface *get_haptic_plugin_interface()
603 return &haptic_plugin_tizen;