An example of using polling PS/2 using the modified mbed PS/2 library

Dependencies:   Servo mbed

Committer:
d3alek
Date:
Thu Mar 06 10:38:43 2014 +0000
Revision:
8:41b35bda9d48
Parent:
2:e35627187804
Child:
9:2c85d7f99a14
eof bug fixed, stream mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d3alek 0:94cffad90b69 1 /**
d3alek 0:94cffad90b69 2 * PS/2 mouse interface control class (Version 0.0.1)
d3alek 0:94cffad90b69 3 *
d3alek 0:94cffad90b69 4 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
d3alek 0:94cffad90b69 5 * http://shinta.main.jp/
d3alek 0:94cffad90b69 6 */
d3alek 0:94cffad90b69 7
d3alek 0:94cffad90b69 8 #include "PS2MS.h"
d3alek 0:94cffad90b69 9
d3alek 0:94cffad90b69 10 /**
d3alek 0:94cffad90b69 11 * Create.
d3alek 0:94cffad90b69 12 *
d3alek 0:94cffad90b69 13 * @param clk_pin Clock pin.
d3alek 0:94cffad90b69 14 * @param dat_pin Data pin.
d3alek 0:94cffad90b69 15 */
d3alek 0:94cffad90b69 16 PS2MS::PS2MS(PinName clk_pin, PinName dat_pin)
d3alek 0:94cffad90b69 17 : clk(clk_pin), dat(dat_pin) {
d3alek 0:94cffad90b69 18 init_work();
d3alek 0:94cffad90b69 19 clk.fall(this, &PS2MS::func_fall);
d3alek 0:94cffad90b69 20 timeout = 1;
d3alek 0:94cffad90b69 21 }
d3alek 0:94cffad90b69 22
d3alek 0:94cffad90b69 23 /**
d3alek 0:94cffad90b69 24 * Destory.
d3alek 0:94cffad90b69 25 */
d3alek 0:94cffad90b69 26 PS2MS::~PS2MS() {
d3alek 0:94cffad90b69 27 wdt.detach();
d3alek 0:94cffad90b69 28 }
d3alek 0:94cffad90b69 29
d3alek 0:94cffad90b69 30 int PS2MS::getc() {
d3alek 0:94cffad90b69 31 tot.reset();
d3alek 0:94cffad90b69 32 tot.start();
d3alek 0:94cffad90b69 33 while (work.cStart == work.cEnd) {
d3alek 0:94cffad90b69 34 wait_ms(1);
d3alek 0:94cffad90b69 35 if ((timeout > 0) && (tot.read_ms() > timeout)) {
d3alek 8:41b35bda9d48 36 //printf("T ");
d3alek 0:94cffad90b69 37 return EOF;
d3alek 0:94cffad90b69 38 }
d3alek 0:94cffad90b69 39 }
d3alek 0:94cffad90b69 40 tot.stop();
d3alek 0:94cffad90b69 41
d3alek 0:94cffad90b69 42 char c = work.buffer[work.cStart++];
d3alek 0:94cffad90b69 43 work.cStart = work.cStart % RINGBUFSIZ;
d3alek 0:94cffad90b69 44
d3alek 0:94cffad90b69 45 return c;
d3alek 0:94cffad90b69 46 }
d3alek 0:94cffad90b69 47
d3alek 0:94cffad90b69 48 /**
d3alek 0:94cffad90b69 49 * Set timeout.
d3alek 0:94cffad90b69 50 *
d3alek 0:94cffad90b69 51 * @param ms Timeout ms.
d3alek 0:94cffad90b69 52 */
d3alek 0:94cffad90b69 53 void PS2MS::setTimeout(int ms) {
d3alek 0:94cffad90b69 54 timeout = ms;
d3alek 0:94cffad90b69 55 }
d3alek 0:94cffad90b69 56
d3alek 0:94cffad90b69 57 void PS2MS::func_timeout(void) {
d3alek 0:94cffad90b69 58 work.bitcnt = 0;
d3alek 0:94cffad90b69 59 }
d3alek 0:94cffad90b69 60
d3alek 0:94cffad90b69 61 void PS2MS::func_fall(void) {
d3alek 0:94cffad90b69 62 int oddpar = 0;
d3alek 0:94cffad90b69 63 /*
d3alek 0:94cffad90b69 64 */
d3alek 0:94cffad90b69 65 switch (work.bitcnt) {
d3alek 0:94cffad90b69 66 case 0:
d3alek 0:94cffad90b69 67 /*
d3alek 0:94cffad90b69 68 * Start bit.
d3alek 0:94cffad90b69 69 */
d3alek 0:94cffad90b69 70 if (dat.read() != 0) {
d3alek 8:41b35bda9d48 71 //printf("Illegal start bit condition.\n");
d3alek 0:94cffad90b69 72 }
d3alek 0:94cffad90b69 73 work.bitcnt++;
d3alek 0:94cffad90b69 74 break;
d3alek 0:94cffad90b69 75 case 9:
d3alek 0:94cffad90b69 76 /*
d3alek 0:94cffad90b69 77 * Parity bit.
d3alek 0:94cffad90b69 78 */
d3alek 0:94cffad90b69 79 for (int i = 0; i < 8; i++) {
d3alek 0:94cffad90b69 80 if ((work.buffer[work.cEnd] & (1 << i)) != 0) {
d3alek 0:94cffad90b69 81 oddpar++;
d3alek 0:94cffad90b69 82 }
d3alek 0:94cffad90b69 83 }
d3alek 0:94cffad90b69 84 if (dat.read() == 1) {
d3alek 0:94cffad90b69 85 oddpar++;
d3alek 0:94cffad90b69 86 }
d3alek 0:94cffad90b69 87 if ((oddpar % 2) != 1) {
d3alek 8:41b35bda9d48 88 //printf("Data parity error.\n");
d3alek 0:94cffad90b69 89 }
d3alek 0:94cffad90b69 90 work.bitcnt++;
d3alek 0:94cffad90b69 91 break;
d3alek 0:94cffad90b69 92 case 10:
d3alek 0:94cffad90b69 93 /*
d3alek 0:94cffad90b69 94 * Stop bit.
d3alek 0:94cffad90b69 95 */
d3alek 0:94cffad90b69 96 if (dat.read() != 1) {
d3alek 8:41b35bda9d48 97 //printf("Illegal stop bit condition.\n");
d3alek 0:94cffad90b69 98 }
d3alek 0:94cffad90b69 99 if (work.cStart != ((work.cEnd + 1) % RINGBUFSIZ)) {
d3alek 0:94cffad90b69 100 work.cEnd++;
d3alek 0:94cffad90b69 101 work.cEnd = work.cEnd % RINGBUFSIZ;
d3alek 0:94cffad90b69 102 work.bitcnt = 0;
d3alek 0:94cffad90b69 103 } else {
d3alek 2:e35627187804 104 init_work();
d3alek 0:94cffad90b69 105 printf("Buffer overrun.\n");
d3alek 0:94cffad90b69 106 }
d3alek 0:94cffad90b69 107 break;
d3alek 0:94cffad90b69 108 default:
d3alek 0:94cffad90b69 109 if ((1 <= work.bitcnt) && (work.bitcnt <= 8)) {
d3alek 0:94cffad90b69 110 /*
d3alek 0:94cffad90b69 111 * data bit.
d3alek 0:94cffad90b69 112 */
d3alek 0:94cffad90b69 113 if (dat.read() == 1) {
d3alek 0:94cffad90b69 114 work.buffer[work.cEnd] |= (1 << (work.bitcnt - 1));
d3alek 0:94cffad90b69 115 } else {
d3alek 0:94cffad90b69 116 work.buffer[work.cEnd] &= ~(1 << (work.bitcnt - 1));
d3alek 0:94cffad90b69 117 }
d3alek 0:94cffad90b69 118 work.bitcnt++;
d3alek 0:94cffad90b69 119 } else {
d3alek 0:94cffad90b69 120 /*
d3alek 0:94cffad90b69 121 * Illegal internal state.
d3alek 0:94cffad90b69 122 */
d3alek 8:41b35bda9d48 123 //printf("Illegal internal state found.\n");
d3alek 0:94cffad90b69 124 init_work();
d3alek 0:94cffad90b69 125 }
d3alek 0:94cffad90b69 126 break;
d3alek 0:94cffad90b69 127 }
d3alek 0:94cffad90b69 128 wdt.detach();
d3alek 0:94cffad90b69 129 wdt.attach_us(this, &PS2MS::func_timeout, 250);
d3alek 0:94cffad90b69 130 }
d3alek 0:94cffad90b69 131
d3alek 0:94cffad90b69 132 void PS2MS::init_work(void) {
d3alek 0:94cffad90b69 133 work.bitcnt = 0;
d3alek 0:94cffad90b69 134 work.cStart = 0;
d3alek 0:94cffad90b69 135 work.cEnd = 0;
d3alek 0:94cffad90b69 136 }