Changeset 659bbff in avrstuff for aktoserial/code/main.c


Ignore:
Timestamp:
Jul 31, 2010, 6:22:24 PM (14 years ago)
Author:
Adrien Destugues <pulkomandy@…>
Branches:
main
Children:
d056b2b
Parents:
d851b8b
Message:
  • Firmware fonctionnel

git-svn-id: svn://pulkomandy.tk/avrstuff@12 c6672c3c-f6b6-47f9-9001-1fd6b12fecbe

File:
1 edited

Legend:

Unmodified
Added
Removed
  • aktoserial/code/main.c

    rd851b8b r659bbff  
    1111#include "keycodes.h"
    1212
    13 const uint8_t PROGMEM keymatrix[128] = {
    14 // 0         1                 2            3            4          5          6           7            8            9              A             B             C             D             E              F
    15 KEY_grave,   KEY_1,            KEY_2,       KEY_3,       KEY_4,     KEY_5,     KEY_6,      KEY_7,       KEY_8,       KEY_9,         KEY_0,        KEY_minus,    KEY_equals,   KEY_backslash, KEY_Reserved,  KEY_KP0,      //0
    16 KEY_Q,       KEY_W,            KEY_E,       KEY_R,       KEY_T,     KEY_Y,     KEY_U,      KEY_I,       KEY_O,       KEY_P,         KEY_rbracket, KEY_lbracket, KEY_Reserved, KEY_KP1,       KEY_KP2,       KEY_KP3,      //1
    17 KEY_A,       KEY_S,            KEY_D,       KEY_F,       KEY_G,     KEY_H,     KEY_J,      KEY_K,       KEY_L,       KEY_semicolon, KEY_apostroph,KEY_hash,     KEY_Reserved, KEY_KP4,       KEY_KP5,       KEY_KP6,      //2
    18 KEY_Euro,    KEY_Z,            KEY_X,       KEY_C,       KEY_V,     KEY_B,     KEY_N,      KEY_M,       KEY_comma,   KEY_dot,       KEY_slash,    KEY_Reserved, KEY_KPcomma,  KEY_KP7,       KEY_KP8,       KEY_KP9,      //3
    19 KEY_Spacebar,KEY_DeleteForward,KEY_Tab,     KEY_KPenter, KEY_Return,KEY_ESCAPE,KEY_DELETE, KEY_Reserved,KEY_Reserved,KEY_Reserved,  KEY_KPminus,  KEY_Reserved, KEY_UpArrow,  KEY_DownArrow, KEY_RightArrow,KEY_LeftArrow,//4
    20 KEY_F1,      KEY_F2,           KEY_F3,      KEY_F4,      KEY_F5,    KEY_F6,    KEY_F7,     KEY_F8,      KEY_F9,      KEY_F10,       KEY_KPRParen, KEY_KPLParen, KEY_KPslash,  KEY_KPasterisk,KEY_KPplus,    KEY_Help,     //5
    21 KEY_Reserved,KEY_Reserved,     KEY_capslock,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,  KEY_Reserved,  KEY_Reserved, //6
    22 KEY_Reserved,KEY_Reserved,     KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,  KEY_Reserved,  KEY_Reserved, //7
     13static uint8_t pressingCaps = 0;
     14
     15const uint8_t PROGMEM keymatrix[0x70] = {
     16// 0         1            2            3            4          5          6           7            8            9              A             B             C             D             E              F
     17KEY_grave,   KEY_1,       KEY_2,       KEY_3,       KEY_4,     KEY_5,     KEY_6,      KEY_7,       KEY_8,       KEY_9,         KEY_0,        KEY_minus,    KEY_equals,   KEY_F11,       KEY_Reserved,  KEY_KP0,      //0
     18KEY_Q,       KEY_W,       KEY_E,       KEY_R,       KEY_T,     KEY_Y,     KEY_U,      KEY_I,       KEY_O,       KEY_P,         KEY_lbracket, KEY_rbracket, KEY_Reserved, KEY_KP1,       KEY_KP2,       KEY_KP3,      //1
     19KEY_A,       KEY_S,       KEY_D,       KEY_F,       KEY_G,     KEY_H,     KEY_J,      KEY_K,       KEY_L,       KEY_semicolon, KEY_apostroph,KEY_hash,     KEY_Reserved, KEY_KP4,       KEY_KP5,       KEY_KP6,      //2
     20KEY_Euro,    KEY_Z,       KEY_X,       KEY_C,       KEY_V,     KEY_B,     KEY_N,      KEY_M,       KEY_comma,   KEY_dot,       KEY_slash,    KEY_Reserved, KEY_KPcomma,  KEY_KP7,       KEY_KP8,       KEY_KP9,      //3
     21KEY_Spacebar,KEY_DELETE,  KEY_Tab,     KEY_KPenter, KEY_Return,KEY_ESCAPE,KEY_DeleteForward,KEY_Reserved,KEY_Reserved,KEY_Reserved,  KEY_KPminus,  KEY_Reserved, KEY_UpArrow,  KEY_DownArrow, KEY_RightArrow,KEY_LeftArrow,//4
     22KEY_F1,      KEY_F2,      KEY_F3,      KEY_F4,      KEY_F5,    KEY_F6,    KEY_F7,     KEY_F8,      KEY_F9,      KEY_F10,       KEY_Home, KEY_End, KEY_KPslash,  KEY_KPasterisk,KEY_KPplus,    KEY_F12,     //5
     23KEY_Reserved,KEY_Reserved,KEY_capslock,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,KEY_Reserved,  KEY_Reserved,  KEY_Reserved, //6
    2324};
    2425
     
    3031const uint8_t PROGMEM modmatrix[8] = { // contains positions of modifiers in the matrix
    3132  // 0             1               2                 3         4         5         6                  7
    32 MOD_SHIFT_LEFT,MOD_SHIFT_RIGHT,MOD_NONE,MOD_CONTROL_LEFT,MOD_ALT_LEFT,MOD_NONE, MOD_GUI_LEFT, MOD_GUI_RIGHT,
     33MOD_SHIFT_LEFT,MOD_SHIFT_RIGHT,MOD_NONE,MOD_CONTROL_LEFT,MOD_ALT_LEFT,MOD_ALT_RIGHT, MOD_GUI_LEFT, MOD_GUI_RIGHT,
    3334};
    3435
    3536static uint8_t idleRate;
     37static uint8_t reportIndex = 2;
    3638static uint8_t reportBuffer[8];
    3739
    3840void fillReportBuffer(uint8_t key_code) {
    3941        uint8_t key, modifier;
    40         uint8_t reportIndex = 2; // reportBuffer[0] contains modifiers
    41         memset(reportBuffer, 0, sizeof(reportBuffer)); // clear report buffer
     42        key = pgm_read_byte(&keymatrix[key_code]);
     43        if (key_code >= 0x60 && key_code < 0x68)
     44                modifier = pgm_read_byte(&modmatrix[key_code - 0x60]);
     45        else
     46                modifier = MOD_NONE;
     47        if (key != KEY_Reserved && reportIndex < 8) {
     48                reportBuffer[reportIndex] = key; // set next available entry
     49                reportIndex++;
     50                if (key == KEY_capslock)
     51                        pressingCaps = 1;
     52        }
     53        reportBuffer[0] |= modifier;
     54}
     55
     56
     57void emptyReportBuffer(uint8_t key_code) {
     58       
     59        uint8_t key, modifier;
     60        uint8_t i;
    4261        key = pgm_read_byte(&keymatrix[key_code]);
    4362        if (key_code >= 0x60 && key_code < 0x68)
     
    4665                modifier = MOD_NONE;
    4766        if (key != KEY_Reserved) {
    48                 reportBuffer[reportIndex] = key; // set next available entry
    49                 reportIndex++;
     67                for (i = 2; i < reportIndex; i++) {
     68                        if (reportBuffer[i] == key) {
     69                                for (; i < 7; i++)
     70                                        reportBuffer[i] = reportBuffer[i+1];
     71                                reportBuffer[7] = 0;
     72                                reportIndex--;
     73                        }
     74                }
    5075        }
    51         reportBuffer[0] |= modifier;
     76        reportBuffer[0] &= ~modifier;
    5277}
    5378
     
    7297
    7398        //debug LED - output
    74         DDRD |= (1<<PD6);
     99        DDRC |= (1<<PC5);
     100        DDRC |= (1<<PC4);
    75101
    76102        // Keyboard
    77         uint8_t key_code = 0;
     103        uint8_t key_code = 255;
     104        memset(reportBuffer, 0, sizeof(reportBuffer)); // clear report buffer
    78105
    79106        // USB
     
    90117                if (char_waiting) {
    91118                        key_code = ak_read_scancode();
     119                        PORTC ^= (1<<PC4);
     120                        PORTC ^= (1<<PC5);
     121                        // if an update is needed, send the report
     122                        if ((key_code & 1) == 0)
     123                                fillReportBuffer(key_code>>1);
     124                        else
     125                                emptyReportBuffer(key_code>>1);
     126                        if (usbInterruptIsReady())
     127                                usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
    92128                }
    93129
     
    99135                                        idleCounter -= 5; // 22ms in units of 4ms
    100136                                } else { // yes, it is time now
    101                                         updateNeeded = 1;
    102137                                        idleCounter = idleRate;
     138                                        if (pressingCaps) {
     139                                                emptyReportBuffer(0x62);
     140                                                pressingCaps = 0;
     141                                        }
     142                                        if (usbInterruptIsReady())
     143                                                usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
    103144                                }
    104145                        }
    105146
    106                 }
    107                 // if an update is needed, send the report
    108                 if (updateNeeded && usbInterruptIsReady()) {
    109                         updateNeeded = 0;
    110                         //fillReportBuffer(key_code);
    111                         fillReportBuffer(KEY_Y);
    112                         usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
    113                         PORTD ^= (1<<PD6);
    114147                }
    115148        }
Note: See TracChangeset for help on using the changeset viewer.