Project

General

Profile

Statistics
| Revision:

root / lab4 / mouse.c @ 68

History | View | Annotate | Download (1.79 KB)

1 59 up20180642
#include <lcom/lcf.h>
2
3
#include "mouse.h"
4
5
#include "errors.h"
6
#include "kbc_macros.h"
7
#include "mouse_macros.h"
8
#include "kbc.h"
9
10
int (subscribe_mouse_interrupt)(uint8_t interrupt_bit, int *interrupt_id) {
11
    if (interrupt_id == NULL) return NULL_PTR;
12
    *interrupt_id = interrupt_bit;
13
    if (sys_irqsetpolicy(MOUSE_IRQ, IRQ_REENABLE | IRQ_EXCLUSIVE, interrupt_id)) return SBCR_ERROR;
14
    return SUCCESS;
15
}
16
17
int got_error_mouse_ih = 0;
18
uint8_t packet[3];
19
int counter = 0;
20
21
void (mouse_ih)(void) {
22
    uint8_t status = 0;
23
    got_error_mouse_ih = 0;
24
    if(counter >= 3) counter = 0;
25
26 68 up20180642
    if ((got_error_mouse_ih = util_sys_inb(STATUS_REG, &status))) return;
27 59 up20180642
28
    if (status & (TIME_OUT_REC | PARITY_ERROR)) {
29 68 up20180642
        got_error_mouse_ih = OTHER_ERROR;
30 59 up20180642
        return;
31
    }
32
33
    uint8_t byte = 0;
34
35 68 up20180642
    if ((got_error_mouse_ih = util_sys_inb(OUTPUT_BUF, &byte))) return;
36 59 up20180642
37
    /// This does not run if: I was expecting the first one but what I get is definitely not the first byte
38
    if((byte & FIRST_BYTE_ID)  || counter){
39
        packet[counter] = byte;
40
        counter++;
41
    }
42
}
43
44
struct packet (mouse_parse_packet)(const uint8_t *packet_bytes){
45
    struct packet pp;
46
    pp.bytes[0] = packet_bytes[0];
47
    pp.bytes[1] = packet_bytes[1];
48
    pp.bytes[2] = packet_bytes[2];
49
    pp.rb       = pp.bytes[0] & RIGHT_BUTTON;
50
    pp.mb       = pp.bytes[0] & MIDDLE_BUTTON;
51
    pp.lb       = pp.bytes[0] & LEFT_BUTTON;
52
    pp.delta_x  = pp.bytes[1];
53
    pp.delta_y  = pp.bytes[2];
54
    pp.x_ov     = pp.bytes[0] & X_OVERFLOW;
55
    pp.y_ov     = pp.bytes[0] & Y_OVERFLOW;
56
    return pp;
57
}
58
59
int (mouse_set_data_report)(int on){
60
    int ret = 0;
61
    if((ret = kbc_issue_cmd(MOUSE_WRITE_B))) return ret;
62 68 up20180642
    if((ret = kbc_issue_arg(DIS_DATA_REP))) return ret;
63 59 up20180642
    return SUCCESS;
64
}