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

Dependencies:   Servo mbed

Committer:
d3alek
Date:
Wed Mar 19 18:44:49 2014 +0000
Revision:
14:168aa965b1b4
Parent:
0:94cffad90b69
best achieved;

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 #include "PS2Mouse.h"
d3alek 0:94cffad90b69 8
d3alek 0:94cffad90b69 9 PS2Mouse::PS2Mouse(PinName clk_pin, PinName dat_pin)
d3alek 0:94cffad90b69 10 : ps2ms_init(clk_pin, dat_pin), ps2ms(clk_pin, dat_pin) {
d3alek 0:94cffad90b69 11 cnt = 0;
d3alek 0:94cffad90b69 12 }
d3alek 0:94cffad90b69 13
d3alek 0:94cffad90b69 14 PS2Mouse::~PS2Mouse() {
d3alek 0:94cffad90b69 15 }
d3alek 0:94cffad90b69 16
d3alek 0:94cffad90b69 17 const char *byte_to_binary(int x)
d3alek 0:94cffad90b69 18 {
d3alek 0:94cffad90b69 19 static char b[9];
d3alek 0:94cffad90b69 20 b[0] = '\0';
d3alek 0:94cffad90b69 21
d3alek 0:94cffad90b69 22 int z;
d3alek 0:94cffad90b69 23 for (z = 128; z > 0; z >>= 1)
d3alek 0:94cffad90b69 24 {
d3alek 0:94cffad90b69 25 strcat(b, ((x & z) == z) ? "1" : "0");
d3alek 0:94cffad90b69 26 }
d3alek 0:94cffad90b69 27
d3alek 0:94cffad90b69 28 return b;
d3alek 0:94cffad90b69 29 }
d3alek 0:94cffad90b69 30
d3alek 0:94cffad90b69 31 bool PS2Mouse::processing(mouse_event_t *p) {
d3alek 0:94cffad90b69 32 bool emit = false;
d3alek 0:94cffad90b69 33 for (int i = 0; i < 4; i++) {
d3alek 0:94cffad90b69 34 const int c = ps2ms.getc();
d3alek 0:94cffad90b69 35 if (0 <= c) {
d3alek 0:94cffad90b69 36 switch (cnt % 4) {
d3alek 0:94cffad90b69 37 case 0:
d3alek 0:94cffad90b69 38 mi.byte1.byte = c;
d3alek 0:94cffad90b69 39 /*
d3alek 0:94cffad90b69 40 * Check and reset a buffer if state is wrong.
d3alek 0:94cffad90b69 41 */
d3alek 0:94cffad90b69 42 if (mi.byte1.bit.always1 == 0) {
d3alek 0:94cffad90b69 43 cnt = -1;
d3alek 0:94cffad90b69 44 while (0 <= ps2ms.getc()) {
d3alek 0:94cffad90b69 45 }
d3alek 0:94cffad90b69 46 }
d3alek 0:94cffad90b69 47 break;
d3alek 0:94cffad90b69 48 case 1:
d3alek 0:94cffad90b69 49 mi.byte2.byte = c;
d3alek 0:94cffad90b69 50 break;
d3alek 0:94cffad90b69 51 case 2:
d3alek 0:94cffad90b69 52 mi.byte3.byte = c;
d3alek 0:94cffad90b69 53 break;
d3alek 0:94cffad90b69 54 case 3:
d3alek 0:94cffad90b69 55 mi.byte4.byte = c;
d3alek 0:94cffad90b69 56 /*
d3alek 0:94cffad90b69 57 * Store a event data.
d3alek 0:94cffad90b69 58 */
d3alek 0:94cffad90b69 59 if (mi.byte1.bit.overflowX) {
d3alek 0:94cffad90b69 60 printf("OverflowX!\n\r");
d3alek 0:94cffad90b69 61 }
d3alek 0:94cffad90b69 62 if (mi.byte1.bit.overflowY) {
d3alek 0:94cffad90b69 63 printf("OverflowY!\n\r");
d3alek 0:94cffad90b69 64 }
d3alek 0:94cffad90b69 65 if (mi.byte1.bit.signX) {
d3alek 0:94cffad90b69 66 printf("SignX!\n\r");
d3alek 0:94cffad90b69 67 }
d3alek 0:94cffad90b69 68 if (mi.byte1.bit.signY) {
d3alek 0:94cffad90b69 69 printf("SignY!\n\r");
d3alek 0:94cffad90b69 70 }
d3alek 0:94cffad90b69 71 p->left = mi.byte1.bit.btnLeft ? true : false;
d3alek 0:94cffad90b69 72 p->center = mi.byte1.bit.btnCenter ? true : false;
d3alek 0:94cffad90b69 73 p->right = mi.byte1.bit.btnRight ? true : false;
d3alek 0:94cffad90b69 74 p->x = mi.byte1.bit.signX ? (-256 + mi.byte2.byte) : mi.byte2.byte;
d3alek 0:94cffad90b69 75 p->y = mi.byte1.bit.signY ? (-256 + mi.byte3.byte) : mi.byte3.byte;
d3alek 0:94cffad90b69 76 p->z = mi.byte4.bit.signZ ? (-128 + mi.byte4.bit.value) : mi.byte4.bit.value;
d3alek 0:94cffad90b69 77 emit = true;
d3alek 0:94cffad90b69 78 break;
d3alek 0:94cffad90b69 79 }
d3alek 0:94cffad90b69 80 cnt++;
d3alek 0:94cffad90b69 81 }
d3alek 0:94cffad90b69 82 }
d3alek 0:94cffad90b69 83 return emit;
d3alek 0:94cffad90b69 84 }