Aleksandar Kodzhabashev
/
TrackballQuery
An example of using polling PS/2 using the modified mbed PS/2 library
mylib/PS2/PS2Mouse.cpp@14:168aa965b1b4, 2014-03-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |