Git init
[framework/api/haptic.git] / src / haptic_private.c
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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. 
15  */
16
17
18
19
20 #include <stdio.h> // xxx
21 #include <unistd.h>
22 #include <devman.h>
23 #include <devman_haptic.h>
24 #include "haptic.h"
25
26 #define IMMERSION_DRV_NODE      "/dev/tspdrv"
27 #define INPUT_PARM_MAX          0xFFFFFF
28 #define COMP_CMD(idx, value)    (value<<4)|(idx&0x0F)
29
30 enum {
31     HAPTIC_PROP_ENABLE,
32     HAPTIC_PROP_LEVEL,
33     HAPTIC_PROP_LEVEL_MAX,
34     HAPTIC_PROP_VALUE,
35     HAPTIC_PROP_ONESHOT,
36 };
37
38 enum {
39         CMD_GET_INITIALIZE,
40         CMD_SET_OPEN_DEVICE,
41         CMD_GET_CURRENT_DEVICE_HANDLE,
42         CMD_GET_CURRENT_EFFECT_HANDLE,
43         CMD_SET_EFFECT_TYPE,
44         CMD_SET_EFFECT_FILE,
45         CMD_GET_EFFECT_DURATION,
46         CMD_SET_EFFECT_PLAY,
47         CMD_SET_EFFECT_PLAY_REPEAT,
48         CMD_SET_NORMAL_PLAY,
49         CMD_SET_EFFECT_ALL_STOP,
50         CMD_PROPERTY_SET_LICENSE_KEY,
51         CMD_PROPERTY_GET_PRIORITY,
52         CMD_PROPERTY_SET_PRIORITY,
53         CMD_PROPERTY_GET_STRENGTH,
54         CMD_PROPERTY_SET_STRENGTH,
55         CMD_PROPERTY_GET_MASTER_STRENGTH,
56         CMD_PROPERTY_SET_MASTER_STRENGTH,
57         CMD_SET_CLOSE_DEVICE,
58         CMD_GET_TERMINATE,
59         CMD_GET_DEVICE_COUNT,
60 };
61
62 static int immersion;
63
64 static int IMM_LEVEL[] = {
65     0, 0, 2000, 4000, 6000, 8000, 10000
66 };
67
68 static int ETC_LEVEL[] = {
69     0,0, 55, 60, 65, 70, 80
70 };
71
72 void _haptic_init()
73 {
74     immersion = access(IMMERSION_DRV_NODE, F_OK) == 0;
75 }
76
77 void _haptic_deinit()
78 {
79 }
80
81 int _haptic_play_monotone(int dev, int duration, haptic_level_e level)
82 {
83     int status;
84     int input = 0;
85     unsigned int cmd;
86
87     if(duration < 1 || duration > INPUT_PARM_MAX)
88         return HAPTIC_ERROR_INVALID_PARAMETER;
89
90     dev = DEV_IDX_ALL; // xxx
91
92     if(dev != DEV_IDX_ALL && dev != DEV_IDX_0 && dev != DEV_IDX_1)
93         return HAPTIC_ERROR_INVALID_PARAMETER;
94
95     if(level == HAPTIC_LEVEL_0)
96         return HAPTIC_ERROR_NONE;
97
98     if(level < HAPTIC_LEVEL_1 || level > HAPTIC_LEVEL_5)
99         return HAPTIC_ERROR_INVALID_PARAMETER;
100
101     input = immersion ? IMM_LEVEL[level] : ETC_LEVEL[level];
102     if(input == 0)
103         return HAPTIC_ERROR_NONE;
104
105     if (immersion) {
106         cmd = COMP_CMD(dev, input);
107         status = device_set_property(DEVTYPE_EFFECT_HAPTIC,
108                 CMD_PROPERTY_SET_STRENGTH, (int)cmd);
109 //        printf("capi [%d - %d - %d] [%d %d]\n", DEVTYPE_EFFECT_HAPTIC, CMD_PROPERTY_SET_STRENGTH, cmd, dev, input);
110         if (status < 0) {
111             return HAPTIC_ERROR_OPERATION_FAILED;
112         }
113
114         cmd = COMP_CMD(dev, 0x05);
115         status =
116             device_set_property(DEVTYPE_EFFECT_HAPTIC,
117                     CMD_PROPERTY_SET_PRIORITY, (int)cmd);
118         if (status < 0) {
119             return HAPTIC_ERROR_OPERATION_FAILED;
120         }
121     }
122
123     if (immersion) {
124         cmd = COMP_CMD(dev, duration);
125         status =
126             device_set_property(DEVTYPE_EFFECT_HAPTIC,
127                     CMD_SET_NORMAL_PLAY, (int)cmd);
128         if (status < 0) {
129             return HAPTIC_ERROR_OPERATION_FAILED;
130         }
131     } else {
132         status =
133             device_set_property(DEVTYPE_HAPTIC, HAPTIC_PROP_LEVEL,
134                     input);
135         if (status < 0) {
136             return HAPTIC_ERROR_OPERATION_FAILED;
137         }
138
139         status =
140             device_set_property(DEVTYPE_HAPTIC, HAPTIC_PROP_ONESHOT,
141                     duration);
142         if (status < 0) {
143             return HAPTIC_ERROR_OPERATION_FAILED;
144         }
145     }
146     return HAPTIC_ERROR_NONE;
147 }