diff chipsetsw/drivers/drv_app/kpd/kpd_virtual_key_table_mgt.c @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chipsetsw/drivers/drv_app/kpd/kpd_virtual_key_table_mgt.c	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,232 @@
+/**
+ * @file   kpd_virtual_key_table_mgt.c
+ *
+ * Coding of the access function to configuration keypad table.
+ * These functions allows to determine :
+ *    - the ASCII value associated to a virtual key,
+ *    - The virtual key ID associated to a physical key Id
+ *
+ *
+ * @author   Laurent Sollier (l-sollier@ti.com)
+ * @version 0.1
+ */
+
+/*
+ * History:
+ *
+ *   Date          Author       Modification
+ *  ----------------------------------------
+ *  10/10/2001     L Sollier    Create
+ *
+ *
+ * (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved
+ */
+
+#include "kpd/kpd_virtual_key_table_mgt.h"
+#include "kpd/kpd_virtual_key_table_def.h"
+
+
+/**
+ * @name Virtual keys table management functions
+ *
+ */
+/*@{*/
+
+/**
+ * function: kpd_initialize_ascii_table
+ */
+T_RV_RET kpd_initialize_ascii_table(void)
+{
+   UINT8 i;
+   INT8 position = KPD_POS_NOT_AVAILABLE;
+   T_VIRTUAL_ASCII_TABLE table;
+   
+   /* Copy all the table */
+   for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+   {
+      table[i].key_id = virtual_ascii_table[i].key_id;
+      table[i].default_value_p = virtual_ascii_table[i].default_value_p;
+      table[i].alphanumeric_value_p = virtual_ascii_table[i].alphanumeric_value_p;
+   }
+
+   for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+   {
+      if (table[i].key_id != KPD_KEY_NULL)
+      {
+         /* Retrieve virtual key position (define in fact the pkysical key Id) */
+         kpd_retrieve_virtual_key_position(table[i].key_id,
+                                           KPD_DEFAULT_MODE,
+                                           &position);
+
+         if (position == KPD_POS_NOT_AVAILABLE)
+            return RV_INTERNAL_ERR;
+
+         /* Update ASCII according to the physical key Id */
+         virtual_ascii_table[position].key_id = position;
+         virtual_ascii_table[position].default_value_p = table[i].default_value_p;
+         virtual_ascii_table[position].alphanumeric_value_p = table[i].alphanumeric_value_p;
+      }
+   }
+
+   return RV_OK;
+}
+
+
+/**
+ * function: kpd_get_virtual_key
+ */
+T_KPD_VIRTUAL_KEY_ID kpd_get_virtual_key( T_KPD_PHYSICAL_KEY_ID key_id,
+                                          T_KPD_MODE mode)
+{
+   return vpm_table[key_id][mode];
+}
+
+
+/**
+ * function: kpd_get_ascii_key_value
+ */
+T_RV_RET kpd_get_ascii_key_value(T_KPD_PHYSICAL_KEY_ID key_id,
+                                 T_KPD_MODE mode,
+                                 char** ascii_code_pp)
+{
+   /* Retrieve ASCII code according to the mode */
+   if (mode == KPD_DEFAULT_MODE)
+      *ascii_code_pp = virtual_ascii_table[key_id].default_value_p;
+   else if (mode == KPD_ALPHANUMERIC_MODE)
+      *ascii_code_pp = virtual_ascii_table[key_id].alphanumeric_value_p;
+   else
+      *ascii_code_pp = "";
+
+   return RV_OK;
+}
+
+/**
+ * function: kpd_retrieve_virtual_key_position
+ */
+T_RV_RET kpd_retrieve_virtual_key_position(  T_KPD_VIRTUAL_KEY_ID key_id,
+                                             T_KPD_MODE mode,
+                                             INT8* position_p)
+{
+   T_RV_RET ret = RV_INVALID_PARAMETER;
+   INT8 i = 0;
+
+   *position_p = KPD_POS_NOT_AVAILABLE;
+
+   if (key_id != KPD_KEY_NULL)
+   {
+      for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+         if (vpm_table[i][mode] == key_id)
+         {
+            *position_p = i;
+            ret = RV_OK;
+            break;
+         }
+   }
+
+   return ret;
+}
+
+
+/**
+ * function: kpd_get_default_keys
+ */
+T_RV_RET kpd_get_default_keys( T_KPD_VIRTUAL_KEY_TABLE* available_keys_p)
+{
+   UINT8 nb_available_keys = 0;
+   UINT8 i;
+
+   for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+   {
+      if (vpm_table[i][KPD_DEFAULT_MODE] != KPD_KEY_NULL)
+      {
+         available_keys_p->notified_keys[nb_available_keys] = vpm_table[i][KPD_DEFAULT_MODE];
+         nb_available_keys++;
+      }
+   }
+   available_keys_p->nb_notified_keys = nb_available_keys;
+
+   return RV_OK;
+}
+
+/**
+ * function: kpd_check_key_table
+ */
+T_RV_RET kpd_check_key_table(T_KPD_VIRTUAL_KEY_TABLE* keys_table_p, T_KPD_MODE mode)
+{
+   UINT8 i;
+   INT8 position;
+   T_KPD_VIRTUAL_KEY_ID virtual_key;
+   UINT8 nb_notified_keys = 0;
+   T_RV_RET ret = RV_OK;
+
+   if (keys_table_p->nb_notified_keys == KPD_NB_PHYSICAL_KEYS)
+   {
+      /* Facility: if number of key is KPD_NB_PHYSICAL_KEYS, table of notified_keys
+         is automatically fulfilled */
+      for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+      {
+         virtual_key = kpd_get_virtual_key(i, mode);
+         if (virtual_key != KPD_KEY_NULL)
+         {
+            keys_table_p->notified_keys[nb_notified_keys] = virtual_key;
+            nb_notified_keys++;
+         }
+      }
+      keys_table_p->nb_notified_keys = nb_notified_keys;
+   }
+   else
+   {
+      /* In another case (number of key less than KPD_NB_PHYSICAL_KEYS), verify
+         that all the virtual keys are defined in the mode requested by the client */
+      for (i = 0; i < keys_table_p->nb_notified_keys; i++)
+      {
+         ret = kpd_retrieve_virtual_key_position(keys_table_p->notified_keys[i],
+                                                 mode,
+                                                 &position);
+         if ( (ret != RV_OK) || (keys_table_p->notified_keys[i] == KPD_KEY_NULL) )
+            return RV_INVALID_PARAMETER;
+      }
+   }
+   return RV_OK;
+}
+
+/**
+ * function: kpd_define_new_config
+ */
+void kpd_define_new_config(T_KPD_VIRTUAL_KEY_TABLE* reference_keys_p,
+                           T_KPD_VIRTUAL_KEY_TABLE* new_keys_p)
+{
+   UINT8 i;
+   INT8 position;
+
+   /* Unset old values in the table */
+   for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+      vpm_table[i][KPD_MODE_CONFIG] = KPD_KEY_NULL;
+
+   /* Set values in the table */
+   for (i = 0; i < reference_keys_p->nb_notified_keys; i++)
+   {
+      /*  */
+      kpd_retrieve_virtual_key_position(reference_keys_p->notified_keys[i],
+                                        KPD_DEFAULT_MODE,
+                                        &position);
+      vpm_table[position][KPD_MODE_CONFIG] = new_keys_p->notified_keys[i];
+   }
+}
+
+/**
+ * function: kpd_vpm_table_is_valid
+ */
+BOOL kpd_vpm_table_is_valid(void)
+{
+   UINT8 i;
+
+   for (i = 0; i < KPD_NB_PHYSICAL_KEYS; i++)
+   {
+      if (vpm_table[i][0] != i) return FALSE;
+   }
+
+   return TRUE;
+}
+
+/*@}*/