comparison src/cs/drivers/drv_app/kpd/kpd_api.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /**
2 * @file kpd_api.c
3 *
4 * Implementation of bridge functions.
5 *
6 * @author Laurent Sollier (l-sollier@ti.com)
7 * @version 0.1
8 */
9
10 /*
11 * History:
12 *
13 * Date Author Modification
14 * ----------------------------------------
15 * 10/10/2001 L Sollier Create
16 *
17 *
18 * (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved
19 */
20
21
22 #include "kpd/kpd_api.h"
23 #include "kpd/kpd_virtual_key_table_mgt.h"
24 #include "kpd/kpd_messages_i.h"
25 #include "kpd/kpd_process_internal_msg.h"
26 #include "kpd/kpd_env.h"
27
28 #include "rvm/rvm_use_id_list.h"
29
30 /* Include file to delete when Kp global variable will be useless */
31 /* Delete variable Kp below */
32 #include "kpd/kpd_power_api.h"
33
34
35 /** External declaration */
36 extern T_KPD_ENV_CTRL_BLK* kpd_env_ctrl_blk;
37 extern T_KPD_KEYPAD Kp;
38
39
40 /**
41 * @name Bridge functions implementation
42 *
43 */
44 /*@{*/
45
46
47 /**
48 * function: kpd_subscribe
49 */
50 T_RV_RET kpd_subscribe(T_KPD_SUBSCRIBER* subscriber_p,
51 T_KPD_MODE mode,
52 T_KPD_VIRTUAL_KEY_TABLE* notified_keys_p,
53 T_RV_RETURN return_path)
54 {
55 T_RVF_MB_STATUS mb_status;
56 T_KPD_SUBSCRIBE_MSG* msg_subscribe_p;
57 T_SUBSCRIBER* subscriber_struct_p;
58 T_RV_RET ret = RV_OK;
59 UINT8 i;
60
61 /* Initialization of parameter "subscriber" in order to be sure that client will
62 not use later the parameter with an non initialized value */
63 *subscriber_p = 0;
64
65 /* Check if initialization has been correctly done */
66 if ( (kpd_env_ctrl_blk == 0) || (kpd_env_ctrl_blk->swe_is_initialized == FALSE) )
67 {
68 KPD_SEND_TRACE("KPD: Initialization is not yet done or failed", RV_TRACE_LEVEL_ERROR);
69 return RV_INTERNAL_ERR;
70 }
71
72 /* Allocate memory to save subscriber Id */
73 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_SUBSCRIBER), (void **) &subscriber_struct_p);
74 if (mb_status == RVF_RED)
75 return RV_MEMORY_ERR;
76
77 if ( (notified_keys_p != 0)
78 && (notified_keys_p->nb_notified_keys > 0)
79 && (notified_keys_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS) )
80 {
81 /* Reserve subscriber Id */
82 ret = kpd_add_subscriber(&(subscriber_struct_p->subscriber_id));
83 if (ret != RV_OK)
84 rvf_free_buf(subscriber_struct_p);
85 }
86 else
87 {
88 rvf_free_buf(subscriber_struct_p);
89 ret = RV_INVALID_PARAMETER;
90 }
91
92
93 if (ret == RV_OK)
94 {
95 /* Reserve memory for message */
96 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_SUBSCRIBE_MSG), (void **) &msg_subscribe_p);
97
98 if (mb_status != RVF_RED) /* Memory allocation success */
99 {
100 /* Fill the message */
101 msg_subscribe_p->hdr.msg_id = KPD_SUBSCRIBE_MSG;
102 msg_subscribe_p->subscription_info.subscriber_id = subscriber_struct_p->subscriber_id;
103 msg_subscribe_p->subscription_info.mode = mode;
104 msg_subscribe_p->subscription_info.return_path = return_path;
105 msg_subscribe_p->subscription_info.notified_keys.nb_notified_keys = notified_keys_p->nb_notified_keys;
106 for (i = 0; i < notified_keys_p->nb_notified_keys; i++)
107 msg_subscribe_p->subscription_info.notified_keys.notified_keys[i] = notified_keys_p->notified_keys[i];
108
109 /* Send message to the keypad task */
110 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_subscribe_p);
111
112 /* Save subscriber id */
113 *subscriber_p = (void*)subscriber_struct_p;
114 }
115 else
116 {
117 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
118 kpd_remove_subscriber(subscriber_struct_p->subscriber_id);
119 rvf_free_buf(subscriber_struct_p);
120 ret = RV_MEMORY_ERR;
121 }
122 }
123
124 return ret;
125 }
126
127
128 /**
129 * function: kpd_unsubscribe
130 */
131 T_RV_RET kpd_unsubscribe(T_KPD_SUBSCRIBER* subscriber_p)
132 {
133 T_RVF_MB_STATUS mb_status;
134 T_KPD_UNSUBSCRIBE_MSG* msg_unsubscribe_p;
135 T_RV_RET ret = RV_INVALID_PARAMETER;
136 T_SUBSCRIBER_ID subscriber_id;
137
138 /* Check if subscriber id is correct */
139 if ( kpd_subscriber_id_used(*subscriber_p, &subscriber_id) == TRUE)
140 {
141 /* Reserve memory for message */
142 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_UNSUBSCRIBE_MSG), (void **) &msg_unsubscribe_p);
143
144 if (mb_status != RVF_RED) /* Memory allocation success */
145 {
146 /* Free subscriber Id */
147 ret = kpd_remove_subscriber(subscriber_id);
148
149 if (ret == RV_OK)
150 {
151 /* Fill the message */
152 msg_unsubscribe_p->hdr.msg_id = KPD_UNSUBSCRIBE_MSG;
153 msg_unsubscribe_p->subscriber_id = subscriber_id;
154
155 /* Send message to the keypad task */
156 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_unsubscribe_p);
157
158 rvf_free_buf(*subscriber_p);
159 *subscriber_p = 0;
160 }
161 else
162 {
163 rvf_free_buf(msg_unsubscribe_p);
164 }
165 }
166 else
167 {
168 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
169 ret = RV_MEMORY_ERR;
170 }
171 }
172
173 return ret;
174 }
175
176
177 /**
178 * function: kpd_define_key_notification
179 */
180 T_RV_RET kpd_define_key_notification(T_KPD_SUBSCRIBER subscriber,
181 T_KPD_VIRTUAL_KEY_TABLE* notif_key_table_p,
182 T_KPD_NOTIF_LEVEL notif_level,
183 UINT16 long_press_time,
184 UINT16 repeat_time)
185 {
186 T_RV_RET ret = RV_INVALID_PARAMETER;
187 T_RVF_MB_STATUS mb_status;
188 T_KPD_NOTIF_KEYS_MSG* msg_notif_key_p;
189 UINT8 i;
190 T_SUBSCRIBER_ID subscriber_id;
191
192 /* Check if subscriber id is correct */
193 if ( kpd_subscriber_id_used(subscriber, &subscriber_id) == TRUE)
194 {
195 if ( (notif_key_table_p != 0)
196 && (notif_key_table_p->nb_notified_keys > 0)
197 && (notif_key_table_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS) )
198 {
199 if ( (notif_level == KPD_NO_NOTIF )
200 ||(notif_level & KPD_FIRST_PRESS_NOTIF )
201 ||(notif_level & KPD_RELEASE_NOTIF )
202 ||( (notif_level & KPD_LONG_PRESS_NOTIF) && (long_press_time != 0) )
203 ||( (notif_level & KPD_INFINITE_REPEAT_NOTIF) && (long_press_time != 0) && (repeat_time != 0) ) )
204 {
205 /* Reserve memory for message */
206 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_NOTIF_KEYS_MSG), (void **) &msg_notif_key_p);
207
208 if (mb_status != RVF_RED) /* Memory allocation success */
209 {
210 /* Fill the message */
211 msg_notif_key_p->hdr.msg_id = KPD_NOTIF_KEYS_MSG;
212 msg_notif_key_p->subscriber_id = subscriber_id;
213 msg_notif_key_p->notif_level = notif_level;
214 msg_notif_key_p->long_press_time = long_press_time;
215 msg_notif_key_p->repeat_time = repeat_time;
216 msg_notif_key_p->notif_key_table.nb_notified_keys = notif_key_table_p->nb_notified_keys;
217 for (i = 0; i < notif_key_table_p->nb_notified_keys; i++)
218 msg_notif_key_p->notif_key_table.notified_keys[i] = notif_key_table_p->notified_keys[i];
219
220 /* Send message to the keypad task */
221 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_notif_key_p);
222
223 ret = RV_OK;
224 }
225 else
226 {
227 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
228 ret = RV_MEMORY_ERR;
229 }
230 }
231 }
232 }
233
234 return ret;
235 }
236
237
238 /**
239 * function: kpd_change_mode
240 */
241 T_RV_RET kpd_change_mode( T_KPD_SUBSCRIBER subscriber,
242 T_KPD_VIRTUAL_KEY_TABLE* notified_keys_p,
243 T_KPD_MODE new_mode)
244 {
245 T_RV_RET ret = RV_INVALID_PARAMETER;
246 T_RVF_MB_STATUS mb_status;
247 T_KPD_CHANGE_MODE_MSG* msg_change_mode_p;
248 T_SUBSCRIBER_ID subscriber_id;
249 UINT8 i;
250
251 /* Check if subscriber id is correct */
252 if ( kpd_subscriber_id_used(subscriber, &subscriber_id) == TRUE)
253 {
254 if ( (notified_keys_p != 0)
255 && (notified_keys_p->nb_notified_keys > 0)
256 && (notified_keys_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS) )
257 {
258 /* Reserve memory for message */
259 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_CHANGE_MODE_MSG), (void **) &msg_change_mode_p);
260
261 if (mb_status != RVF_RED) /* Memory allocation success */
262 {
263 /* Fill the message */
264 msg_change_mode_p->hdr.msg_id = KPD_CHANGE_MODE_MSG;
265 msg_change_mode_p->subscriber_id = subscriber_id;
266 msg_change_mode_p->new_mode = new_mode;
267 msg_change_mode_p->notified_keys.nb_notified_keys = notified_keys_p->nb_notified_keys;
268 for (i = 0; i < notified_keys_p->nb_notified_keys; i++)
269 msg_change_mode_p->notified_keys.notified_keys[i] = notified_keys_p->notified_keys[i];
270
271 /* Send message to the keypad task */
272 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_change_mode_p);
273
274 ret = RV_OK;
275 }
276 else
277 {
278 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
279 ret = RV_MEMORY_ERR;
280 }
281 }
282 }
283
284 return ret;
285 }
286
287 /**
288 * function: kpd_own_keypad
289 */
290 T_RV_RET kpd_own_keypad( T_KPD_SUBSCRIBER subscriber,
291 BOOL is_keypad_owner,
292 T_KPD_VIRTUAL_KEY_TABLE* keys_owner_p)
293 {
294 T_RV_RET ret = RV_INVALID_PARAMETER;
295 T_RVF_MB_STATUS mb_status;
296 T_KPD_OWN_KEYPAD_MSG* msg_own_keypad_p;
297 T_SUBSCRIBER_ID subscriber_id;
298 UINT8 i;
299
300 /* Check if subscriber id is correct */
301 if ( kpd_subscriber_id_used(subscriber, &subscriber_id) == TRUE)
302 {
303 /* If subscriber want to be the owner of the keypad, list of keys is checked
304 else, subscriber want to release the keypad, check list of key is useless */
305 if (is_keypad_owner == TRUE)
306 {
307 if ( (keys_owner_p != 0)
308 && (keys_owner_p->nb_notified_keys > 0)
309 && (keys_owner_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS) )
310 ret = RV_OK;
311 }
312 else
313 ret = RV_OK;
314
315 if (ret == RV_OK)
316 {
317 /* Reserve memory for message */
318 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_OWN_KEYPAD_MSG), (void **) &msg_own_keypad_p);
319
320 if (mb_status != RVF_RED) /* Memory allocation success */
321 {
322 /* Fill the message */
323 msg_own_keypad_p->hdr.msg_id = KPD_OWN_KEYPAD_MSG;
324 msg_own_keypad_p->subscriber_id = subscriber_id;
325 msg_own_keypad_p->is_keypad_owner = is_keypad_owner;
326 msg_own_keypad_p->keys_owner.nb_notified_keys = keys_owner_p->nb_notified_keys;
327 for (i = 0; i < keys_owner_p->nb_notified_keys; i++)
328 msg_own_keypad_p->keys_owner.notified_keys[i] = keys_owner_p->notified_keys[i];
329
330 /* Send message to the keypad task */
331 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_own_keypad_p);
332 }
333 else
334 {
335 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
336 ret = RV_MEMORY_ERR;
337 }
338 }
339 }
340
341 return ret;
342 }
343
344 /**
345 * function: kpd_set_key_config
346 */
347 T_RV_RET kpd_set_key_config(T_KPD_SUBSCRIBER subscriber,
348 T_KPD_VIRTUAL_KEY_TABLE* reference_keys_p,
349 T_KPD_VIRTUAL_KEY_TABLE* new_keys_p)
350 {
351 #ifdef KPD_MODE_CONFIG
352 T_RVF_MB_STATUS mb_status;
353 T_KPD_SET_CONFIG_MODE_MSG* msg_set_config_mode_p;
354 T_RV_RET ret = RV_INVALID_PARAMETER;
355 T_SUBSCRIBER_ID subscriber_id;
356 UINT8 i;
357 INT8 position;
358
359 /* Check if subscriber id is correct */
360 if ( kpd_subscriber_id_used(subscriber, &subscriber_id) == TRUE)
361 {
362 if ( (reference_keys_p != 0)
363 && (reference_keys_p->nb_notified_keys > 0)
364 && (reference_keys_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS)
365 && (new_keys_p != 0)
366 && (new_keys_p->nb_notified_keys > 0)
367 && (new_keys_p->nb_notified_keys <= KPD_NB_PHYSICAL_KEYS)
368 && (reference_keys_p->nb_notified_keys == new_keys_p->nb_notified_keys) )
369 {
370 /* Check if all keys of reference_keys_p are defined in default mode */
371 for (i = 0; i < reference_keys_p->nb_notified_keys; i++)
372 {
373 ret = kpd_retrieve_virtual_key_position(reference_keys_p->notified_keys[i],
374 KPD_DEFAULT_MODE,&position);
375 if (ret == RV_INVALID_PARAMETER)
376 return ret;
377 }
378
379 if (ret == RV_OK)
380 {
381 /* Reserve memory for message */
382 mb_status = rvf_get_buf (kpd_env_ctrl_blk->prim_id, sizeof(T_KPD_SET_CONFIG_MODE_MSG), (void **) &msg_set_config_mode_p);
383
384 if (mb_status != RVF_RED) /* Memory allocation success */
385 {
386 /* Fill the message */
387 msg_set_config_mode_p->hdr.msg_id = KPD_SET_CONFIG_MODE_MSG;
388 msg_set_config_mode_p->subscriber_id = subscriber_id;
389 msg_set_config_mode_p->reference_keys.nb_notified_keys = reference_keys_p->nb_notified_keys;
390 for (i = 0; i < reference_keys_p->nb_notified_keys; i++)
391 msg_set_config_mode_p->reference_keys.notified_keys[i] = reference_keys_p->notified_keys[i];
392 msg_set_config_mode_p->new_keys.nb_notified_keys = new_keys_p->nb_notified_keys;
393 for (i = 0; i < new_keys_p->nb_notified_keys; i++)
394 msg_set_config_mode_p->new_keys.notified_keys[i] = new_keys_p->notified_keys[i];
395
396 /* Send message to the keypad task */
397 rvf_send_msg(kpd_env_ctrl_blk->addr_id, msg_set_config_mode_p);
398 }
399 else
400 {
401 KPD_SEND_TRACE("KPD: Memory allocation error", RV_TRACE_LEVEL_ERROR);
402 ret = RV_MEMORY_ERR;
403 }
404 }
405 }
406 }
407 return ret;
408
409 #else
410 return RV_NOT_SUPPORTED;
411 #endif
412 }
413
414 /**
415 * function: kpd_get_available_keys
416 */
417 T_RV_RET kpd_get_available_keys( T_KPD_VIRTUAL_KEY_TABLE* available_keys_p)
418 {
419 kpd_get_default_keys(available_keys_p);
420 return RV_OK;
421 }
422
423 /**
424 * function: kpd_get_ascii_key_code
425 */
426 T_RV_RET kpd_get_ascii_key_code( T_KPD_VIRTUAL_KEY_ID key,
427 T_KPD_MODE mode,
428 char** ascii_code_pp)
429 {
430 INT8 position;
431
432 /* Check if mode is authorized */
433 if ( (mode != KPD_DEFAULT_MODE) && (mode != KPD_ALPHANUMERIC_MODE) )
434 return RV_INVALID_PARAMETER;
435
436 /* Check if key exist in the defined mode */
437 kpd_retrieve_virtual_key_position(key, mode, &position);
438 if (position == KPD_POS_NOT_AVAILABLE)
439 return RV_INVALID_PARAMETER;
440
441 /* Retrieve ASCII key value */
442 kpd_get_ascii_key_value(position, mode, ascii_code_pp);
443 return RV_OK;
444 }
445
446 /**
447 * function: KP_Init
448 */
449 void KP_Init( void(pressed(T_KPD_VIRTUAL_KEY_ID)), void(released(void)) )
450 {
451 Kp.pressed = pressed;
452 Kp.released = released;
453 }
454
455
456 /*@}*/