A version of the PS/2 library customized for MbedConsole. Also includes a few things that make it's behavior easier to control and a few bug fixes.

Dependents:   MbedConsole

Fork of PS2 by Shinichiro Nakamura

PS2Keyboard.cpp

Committer:
earlz
Date:
2012-09-28
Revision:
5:ead90ca02b18
Parent:
4:fc7f4cc9fbe8

File content as of revision 5:ead90ca02b18:

/**
 * PS/2 keyboard interface control class (Version 0.0.1)
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */
#include "PS2Keyboard.h"

PS2Keyboard::PS2Keyboard(PinName clk_pin, PinName dat_pin)
        : ps2kb_init(clk_pin, dat_pin), ps2kb(clk_pin, dat_pin, NULL) {
        count=0; //Modification by Jordan Earls!
}

PS2Keyboard::~PS2Keyboard() {
}

bool PS2Keyboard::processing(keyboard_event_t *p) {
    bool emit = false;
    const int c = ' ';//ps2kb.getc();
    //NVIC_SetPriority( EINT3_IRQn, 2 ); 
    //printf("character: %x\r\n", c);
    if (0 <= c) {
        //printf("Count: %i\r\n", count);
        scancode[count++] = c;
        //printf("Count: %i\r\n", count);
        switch (count) {
            case 1:
                if ((scancode[0] != 0xE0)
                        && (scancode[0] != 0xE1)
                        && (scancode[0] != 0xF0)) {
                    p->type = KeyMake;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            case 2:
                if (scancode[0] == 0xF0) {
                    p->type = KeyBreak;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                if ((scancode[0] == 0xE0)
                        && (scancode[1] != 0xF0)
                        && (scancode[1] != 0x12)) {
                    p->type = KeyMake;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            case 3:
                if ((scancode[0] == 0xE0)
                        && (scancode[1] == 0xF0)
                        && (scancode[2] != 0x7C)) {
                    p->type = KeyBreak;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            case 4:
                if ((scancode[0] == 0xE0)
                        && (scancode[1] == 0x12)
                        && (scancode[2] == 0xE0)
                        && (scancode[3] == 0x7C)) {
                    p->type = KeyMake;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            case 5:
                // Do nothing.
                break;
            case 6:
                if ((scancode[0] == 0xE0)
                        && (scancode[1] == 0xF0)
                        && (scancode[2] == 0x7C)
                        && (scancode[3] == 0xE0)
                        && (scancode[4] == 0xF0)
                        && (scancode[5] == 0x12)) {
                    p->type = KeyBreak;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            case 7:
                // Do nothing.
                break;
            case 8:
                if ((scancode[0] == 0xE1)
                        && (scancode[1] == 0x14)
                        && (scancode[2] == 0x77)
                        && (scancode[3] == 0xE1)
                        && (scancode[4] == 0xF0)
                        && (scancode[5] == 0x14)
                        && (scancode[6] == 0xF0)
                        && (scancode[7] == 0x77)) {
                    p->type = KeyMake;
                    p->length = count;
                    memcpy(p->scancode, scancode, sizeof(p->scancode));
                    emit = true;
                    count = 0;
                }
                break;
            default:
                count = 0;
                break;
        }
        count = count % sizeof(scancode);
    }
    return emit;
}