]> git.donarmstrong.com Git - kiibohd-controller.git/blobdiff - Scan/Tandy1000/scan_loop.c
Preparing for Teensy 3 (ARM) integration, abstracting code hierarchy
[kiibohd-controller.git] / Scan / Tandy1000 / scan_loop.c
index 519dd92905f8c37f9c3f6f2f45e01f99f6e00c26..0c411b30acaa2ebc5d12223af286230d021f4b52 100644 (file)
@@ -21,8 +21,8 @@
 
 // ----- Includes -----
 
-// AVR Includes
-#include <avr/interrupt.h>
+// Compiler Includes
+#include <Lib/ScanLib.h>
 
 // Project Includes
 #include <led.h>
 
 
 // ----- Macros -----
+
 #define READ_CLK       CLK_READ &   (1 <<  CLK_PIN) ? 1 : 0
 #define READ_DATA     DATA_READ &   (1 << DATA_PIN) ? 0 : 1
 
 #define UNSET_INTR()  INTR_DDR &= ~(1 << INTR_PIN)
 #define   SET_INTR()  INTR_DDR |=  (1 << INTR_PIN)
 
+#define bufferAdd(byte) \
+               if ( KeyIndex_BufferUsed < KEYBOARD_BUFFER ) \
+                       KeyIndex_Buffer[KeyIndex_BufferUsed++] = byte
 
 
 // ----- Variables -----
 
-uint8_t KeyIndex_Array[KEYBOARD_SIZE + 1];
+// Buffer used to inform the macro processing module which keys have been detected as pressed
+volatile uint8_t KeyIndex_Buffer[KEYBOARD_BUFFER];
+volatile uint8_t KeyIndex_BufferUsed;
+
 
 // Scan Code Retrieval Variables
 uint8_t inputData    = 0xFF;
@@ -76,6 +83,12 @@ uint8_t packet_index = 0;
 // Setup
 inline void scan_setup()
 {
+       // Initially reset the keyboard (just in case we are in a wierd state)
+       scan_resetKeyboard();
+
+       // Setup SPI for data input using the clock and data inputs
+       // TODO
+       /*
        // Setup inputs
        CLK_DDR  &= ~(1 << CLK_PIN);
        DATA_DDR &= ~(1 << DATA_PIN);
@@ -83,22 +96,14 @@ inline void scan_setup()
        // Setup Pull-up's
        CLK_PORT  &= ~(1 << CLK_PIN);  // (CLK)
        DATA_PORT &= ~(1 << DATA_PIN); // (/DATA)
+       */
 
        // Setup Keyboard Interrupt
        INTR_DDR  &= ~(1 << INTR_PIN);
        INTR_PORT &= ~(1 << INTR_PIN);
 
-       /* Interrupt Style (Not working fully)
-       cli();
-       // Setup interrupt on the CLK pin TODO Better defines
-       EICRA |= 0x03; // Rising Edge Interrupt
-       EIMSK |= (1 << INT0);
-
-       // Setup interrupt on the DATA pin TODO Better defines
-       EICRA |= 0x08; // Falling Edge Interrupt
-       EIMSK |= (1 << INT1);
-       sei();
-       */
+       // Setup Keyboard Reset Line
+       // TODO
 }
 
 
@@ -145,6 +150,8 @@ inline uint8_t scan_loop()
        // Disable keyboard interrupt (does nothing if already off)
        UNSET_INTR();
 
+       /* XXX OLD CODE - Somewhat worked, has glitches, and is not compatible with the current API
+
        // Read the clock 8 times
        if ( READ_CLK )
        {
@@ -206,34 +213,48 @@ inline uint8_t scan_loop()
                while ( READ_CLK );
        }
 
+       */
+
        // Interrupt keyboard if there is no pending packet
        SET_INTR();
 
        return packet_index;
 }
 
-// Detection interrupt, signalled by a clock pulse from CLK_PIN
-ISR(INT0_vect)
+// Send data
+// XXX Not used with the Tandy1000
+uint8_t scan_sendData( uint8_t dataPayload )
 {
-       //cli(); // Disable Interrupts
-
-       // Append 1 bit of data
-       //inputData &= ~(READ_DATA << packet_index);
-       packet_index++;
+       return 0;
+}
 
-       //sei(); // Re-enable Interrupts
+// Signal KeyIndex_Buffer that it has been properly read
+// TODO
+void scan_finishedWithBuffer( uint8_t sentKeys )
+{
 }
 
-// Data Detected
-ISR(INT1_vect)
+// Signal that the keys have been properly sent over USB
+void scan_finishedWithUSBBuffer( uint8_t sentKeys )
 {
-       // Append 1 bit of data
-       inputData &= ~(1 << packet_index);
-       packet_index++;
+}
 
-       // Disable Clk Signal (Not needed if there's a data signal)
-       EIFR |= (1 << INTF0);
+// Reset/Hold keyboard
+// Warning! This will cause the keyboard to not send any data, so you can't disable with a keypress
+// The Tandy 1000 keyboard has a dedicated hold/processor interrupt line
+void scan_lockKeyboard( void )
+{
+       UNSET_INTR();
 }
 
+void scan_unlockKeyboard( void )
+{
+       SET_INTR();
+}
 
+// Reset Keyboard
+void scan_resetKeyboard( void )
+{
+       // TODO Tandy1000 has a dedicated reset line
+}