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

PS2KB.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 "PS2KB.h"
//#include "nvic.h"
/**
 * Create.
 *
 * @param clk_pin Clock pin.
 * @param dat_pin Data pin.
 */
PS2KB::PS2KB(PinName clk_pin, PinName dat_pin, KeyboardCallback cb)
        : clk(clk_pin), dat(dat_pin) {
    init_work();
    callback=cb;
    clk.fall(this, &PS2KB::func_fall);
    
}

/**
 * Destory.
 */
PS2KB::~PS2KB() {
    //wdt.detach();
}

/**
 * Get a data from a PS/2 device.
 *
 * @return A data from a PS/2 device.
 *
int PS2KB::getc() {
    tot.reset();
    tot.start();
    while (work.cStart == work.cEnd) {
        wait_ms(1);
        if ((timeout > 0) && (tot.read_ms() > timeout)) {
            // printf("Timeout occured.\n");
            return EOF;
        }
    }
    tot.stop();

    char c = work.buffer[work.cStart++];
    work.cStart =  work.cStart % RINGBUFSIZ;

    return c;
    
}*/

/**
 * Set timeout.
 *
 * @param ms Timeout ms.
 */
 /*
void PS2KB::setTimeout(int ms) {
    timeout = ms;
}

void PS2KB::func_timeout(void) {
    work.bitcnt = 0;
}
*/
void PS2KB::func_fall(void) {
    //NVIC_SetPriority( EINT3_IRQn, 255 ); 
    int oddpar = 0;
    /*
     */
    switch (bitcnt) {
        case 0:
            /*
             * Start bit.
             */
            if (dat.read() != 0) {
                // printf("Illegal start bit condition.\n");
            }
            bitcnt++;
            break;
        case 9:
            /*
             * Parity bit.
             */
            for (int i = 0; i < 8; i++) {
                if ((buffer & (1 << i)) != 0) {
                    oddpar++;
                }
            }
            if (dat.read() == 1) {
                oddpar++;
            }
            if ((oddpar % 2) != 1) {
                // printf("Data parity error.\n");
            }
            bitcnt++;
            break;
        case 10:
            /*
             * Stop bit.
             */
            //if (dat.read() != 1) {
                // printf("Illegal stop bit condition.\n");
            //}
            //if (work.cStart != ((work.cEnd + 1) % RINGBUFSIZ)) {
                //work.cEnd++;
                //work.cEnd = work.cEnd % RINGBUFSIZ;
                bitcnt = 0;
                if(callback!=NULL){
                    callback(this, buffer);
                }
            //} else {
                // printf("Buffer overrun.\n");
            //}
            break;
        default:
            if ((1 <= bitcnt) && (bitcnt <= 8)) {
                /*
                 * data bit.
                 */
                if (dat.read() == 1) {
                    buffer |= (1 << (bitcnt - 1));
                } else {
                    buffer &= ~(1 << (bitcnt - 1));
                }
                bitcnt++;
            } else {
                /*
                 * Illegal internal state.
                 */
                // printf("Illegal internal state found.\n");
                init_work();
            }
            break;
    }
    //wdt.detach();
    //wdt.attach_us(this, &PS2KB::func_timeout, 250);
}

void PS2KB::init_work(void) {
    bitcnt = 0;
    //work.cStart = 0;
    //work.cEnd = 0;
}