root / lab4 / mouse.c @ 15
History | View | Annotate | Download (2.43 KB)
1 | 15 | up20180645 | #include "mouse.c" |
---|---|---|---|
2 | |||
3 | uint8_t byte; |
||
4 | |||
5 | int (util_sys_inb)(int port, uint8_t *value) { //transform 8 bit into 32 bit |
||
6 | |||
7 | uint32_t new_val; //initializing 32 bit variable
|
||
8 | |||
9 | if(sys_inb(port,&new_val)!=0){ //verifies if there is an error |
||
10 | printf("Error in util_sys_inb\n");
|
||
11 | return 1; |
||
12 | } |
||
13 | *value=new_val & 0xFF; //dereferencing "value" |
||
14 | #ifdef LAB3
|
||
15 | cnt++; |
||
16 | #endif
|
||
17 | |||
18 | return 0; |
||
19 | } |
||
20 | |||
21 | void (mouse_ih)(void){ |
||
22 | uint8_t status_reg; |
||
23 | |||
24 | if(util_sys_inb(STATUS_REG,&status_reg)!=0){ //checks if there is an error |
||
25 | printf("Error reading status register in the keyboard interruption\n");
|
||
26 | return;
|
||
27 | } |
||
28 | if(((status_reg & STAT_REG_OBF)==0) ||((status_reg&(STAT_REG_PAR|STAT_REG_TIMEOUT))!=0)){ //checks if there is a parity or timeout error (mask -> 0xC0, bit 7 and 6 set), checks if output buffer is empty |
||
29 | printf("Parity/Timeout error or output buffer is empty or data coming from the mouse\n");
|
||
30 | return;
|
||
31 | } |
||
32 | if(util_sys_inb(OUTPUT_BUF,&byte)!=0){//checks if there is an error |
||
33 | printf("Error reading output buffer in the keyboard interruption\n");
|
||
34 | return;
|
||
35 | } |
||
36 | |||
37 | } |
||
38 | |||
39 | int (mouse_subscribe_int)(uint8_t *bit_no) { //similar function to that of timer_subscribe_int |
||
40 | *bit_no = BIT(keyboard_id); |
||
41 | if(sys_irqsetpolicy(KEYBOARD_IRQ,(IRQ_REENABLE|IRQ_EXCLUSIVE),&keyboard_id)==1){ //operation to subscribe int |
||
42 | printf("Error subscribing int\n");
|
||
43 | return 1; |
||
44 | } |
||
45 | return 0; |
||
46 | } |
||
47 | |||
48 | int (mouse_unsubscribe_int)() { //similar function to that of timer_unsubscribe_int |
||
49 | if(sys_irqrmpolicy(&keyboard_id)==1){ |
||
50 | printf("Error unsubscribing int\n");
|
||
51 | return 1; |
||
52 | } |
||
53 | return 0; |
||
54 | } |
||
55 | |||
56 | int parse_packet(struct packet *pp){ |
||
57 | if((pp->bytes[0]&0x80) == 0x80){ |
||
58 | pp->y_ov=true;
|
||
59 | |||
60 | } |
||
61 | else{
|
||
62 | pp->y_ov=false;
|
||
63 | } |
||
64 | |||
65 | if((pp->bytes[0]&0x40)==0x40){ |
||
66 | pp->x_ov=true;
|
||
67 | |||
68 | } |
||
69 | else{
|
||
70 | pp->x_ov=false;
|
||
71 | } |
||
72 | |||
73 | if((pp->bytes[0]&0x02)==0x02){ |
||
74 | pp->rb=true;
|
||
75 | |||
76 | } |
||
77 | else{
|
||
78 | pp->rb=false;
|
||
79 | } |
||
80 | |||
81 | if((pp->bytes[0]&0x04)==0x04){ |
||
82 | pp->mb=true;
|
||
83 | } |
||
84 | else{
|
||
85 | pp->mb=false;
|
||
86 | } |
||
87 | |||
88 | if((pp->bytes[0]&0x01)==0x01){ |
||
89 | pp->lb=true;
|
||
90 | } |
||
91 | else{
|
||
92 | pp->lb=false;
|
||
93 | } |
||
94 | |||
95 | if((pp->bytes[0]&0x20)==0x20){ //it means y_delta is negative |
||
96 | pp->delta_y=~pp->bytes[2];
|
||
97 | pp->delta_y+=1;
|
||
98 | |||
99 | } |
||
100 | else{
|
||
101 | pp->delta_y=pp->bytes[2];
|
||
102 | } |
||
103 | |||
104 | if((pp->bytes[0]&0x10)==0x10){ //it means x_delta is negative |
||
105 | pp->delta_x=~pp->bytes[1];
|
||
106 | pp->delta_x+=1;
|
||
107 | |||
108 | } |
||
109 | else{
|
||
110 | pp->delta_y=pp->bytes[1];
|
||
111 | } |
||
112 | } |