KSM edits to RA8875

Dependents:   Liz_Test_Code

Revision:
75:ca78388cfd77
Parent:
74:686faa218914
Child:
76:c981284eb513
--- a/RA8875.h	Sun Nov 09 20:38:49 2014 +0000
+++ b/RA8875.h	Fri Nov 28 22:37:53 2014 +0000
@@ -8,11 +8,11 @@
 
 // Define this to enable code that monitors the performance of various
 // graphics commands.
-//#define PERF_METRICS
+#define PERF_METRICS
 
 // What better place for some test code than in here and the companion
 // .cpp file. See also the bottom of this file.
-//#define TESTENABLE
+#define TESTENABLE
 
 /// DOS colors - slightly color enhanced
 #define Black       (color_t)(RGB(0,0,0))
@@ -85,8 +85,7 @@
 ///
 /// @todo Add Scroll support for text.
 /// @todo Improve sync between internal and external font support - cursor, window, scroll.
-/// @todo Add Hardware reset signal.
-/// @todo Add Keypad Support.
+/// @todo Add Hardware reset signal - but testing to date indicates it is not needed.
 /// @todo Add high level objects - x-y graph, meter, others... but these will
 ///     probably be best served in another class, since they may not
 ///     be needed for many uses.
@@ -363,6 +362,7 @@
     ///
     uint8_t TouchPanelReadRaw(loc_t *x, loc_t *y);
     
+#if 0
     /// Append interrupt handler for specific RA8875 interrupt source
     ///
     /// @param[in]    bISRType        Interrupt Source, should be:
@@ -387,8 +387,7 @@
     /// @return       none
     ///
     void UnAppendISR(uint8_t bISRType);
-
-
+#endif
     /// Initialize the keypad interface on the RA8875 controller.
     ///
     /// Enables the keypad subsystem. It will scan the 4 x 5 matrix
@@ -414,11 +413,43 @@
         uint8_t longTimeAdjustment = 0,
         bool interruptEnable = false, bool wakeupEnable = false);
 
+    /// Create Key Code definitions for the key matrix.
+    ///
+    /// This API provides a table of 22 key-code assignments for the matrix of keys.
+    /// This can be used to translate the keys 1 - 20 into some other value, as
+    /// well as to communicate the "no key" (zero) and "error state" (21).
+    ///
+    /// In this way, a keypad could easily emulate a piece of a keyboard, transforming
+    /// 0 - 20 into the values 0, '0', '1', '2', '3', '4', '5', '6', '7', '8',
+    /// '9', '+', '-', '*' , '/', '=', '<bs>', '<cr>', and so on...
+    ///
+    /// @code
+    /// //        Return Value by Row, Column   Example reassignment
+    /// //    Column    0    1    2    3    4 
+    /// //          +-------------------------+  +-------------------------+
+    /// // Row   0  |   1    2    3    4    5 |  | '7'  '8'  '9'  ' '  ' ' |
+    /// //       1  |   6    7    8    9   10 |  | '4'  '5'  '6'  '/'  '-' |
+    /// //       2  |  11   12   13   14   15 |  | '1'  '2'  '3'  '*'  '+' |
+    /// //       3  |  16   17   18   19   20 |  | '0'  '.'  ','  ' ' '\n' |
+    /// //          +-------------------------+  +-------------------------+
+    /// //     Return value  0 = No Key pressed
+    /// //     Return value 21 = Error
+    /// @endcode
+    /// 
+    /// @param[in] CodeList is a pointer to an always available byte-array 
+    ///             where the first 22 bytes are used as the transformation 
+    ///             from raw code to your reassigned value.
+    ///            If CodeList is NULL, the original raw value key map is
+    ///             restored.
+    /// @returns noerror.
+    ///
+    RetCode_t SetKeyMap(const uint8_t * CodeList = NULL);
+
     /// Determine if a key has been hit
     ///
     /// @returns true if a key has been hit
     ///
-    bool _kbhit();
+    bool readable();
 
     /// Blocking read of the keypad.
     ///
@@ -426,26 +457,18 @@
     ///         to avoid hanging your processes.
     ///
     /// A keypad connected to the RA8875 is connected in a matrix of 4 rows and 5 columns.
-    /// The row where a key is pressed is returned in the lower 2 bits of the upper nibble,
-    /// and the column where a key is pressed is returned in the lower 3 bits of the lower nibble.
+    /// When pressed, this method will return a code in the range of 1 through 20, reserving
+    /// the value 0 to indicate that no key is pressed.
     ///
     /// Additionally, if configured to detect a "long press", bit 7 will be set to indicate
     /// this. In this situation, first a "normal press" would be detected and signaled and
     /// soon after that a "long press" of the same key would be detected and communicated.
     ///
-    /// Return value encoding: LxRR xCCC
-    /// L = Long Press was detected
-    /// RR = Row number 0 to 3
+    /// @return 8-bit where bit 7 indicates a long press. The remaining bits indicate the
+    ///     keypress using 0 = no key pressed, 1 - 20 = the key pressed.
     ///
-    /// @return 8-bit value coded as L0RR 0CCC:
-    ///     - L = 1 = Long Press detected
-    ///     - x = 0 = not used
-    ///     - R = 0-3 = Row Number
-    ///     - C = 0-4 = Column Number
-    ///
-    uint8_t _getch();
-
-
+    uint8_t getc();
+    
     /// Write a command to the display with a word of data.
     ///
     /// This is a high level command, and may invoke several primitives.
@@ -1505,6 +1528,8 @@
     ///
     unsigned char spiread();
     
+    const uint8_t * pKeyMap;
+    
     SPI spi;                        ///< spi port
     bool spiWriteSpeed;             ///< indicates if the current mode is write or read
     unsigned long spiwritefreq;     ///< saved write freq
@@ -1531,7 +1556,7 @@
         METRICCOUNT
     } method_e;
     unsigned long metrics[METRICCOUNT];
-    unsigned long idlecounter;
+    unsigned long idletime_usec;
     void RegisterPerformance(method_e method);
     Timer performance;
     #endif