root / lab4 / lab4.c @ 16
History | View | Annotate | Download (5.87 KB)
1 | 13 | up20180645 | // IMPORTANT: you must include the following line in all your C files
|
---|---|---|---|
2 | #include <lcom/lcf.h> |
||
3 | |||
4 | #include <stdint.h> |
||
5 | #include <stdio.h> |
||
6 | 14 | up20180645 | #include "mouse.h" |
7 | 16 | up20180645 | #include "timer.h" |
8 | 13 | up20180645 | |
9 | // Any header files included below this line should have been created by you
|
||
10 | |||
11 | int main(int argc, char *argv[]) { |
||
12 | // sets the language of LCF messages (can be either EN-US or PT-PT)
|
||
13 | lcf_set_language("EN-US");
|
||
14 | |||
15 | // enables to log function invocations that are being "wrapped" by LCF
|
||
16 | // [comment this out if you don't want/need/ it]
|
||
17 | lcf_trace_calls("/home/lcom/labs/lab4/trace.txt");
|
||
18 | |||
19 | // enables to save the output of printf function calls on a file
|
||
20 | // [comment this out if you don't want/need it]
|
||
21 | lcf_log_output("/home/lcom/labs/lab4/output.txt");
|
||
22 | |||
23 | // handles control over to LCF
|
||
24 | // [LCF handles command line arguments and invokes the right function]
|
||
25 | if (lcf_start(argc, argv))
|
||
26 | return 1; |
||
27 | |||
28 | // LCF clean up tasks
|
||
29 | // [must be the last statement before return]
|
||
30 | lcf_cleanup(); |
||
31 | |||
32 | return 0; |
||
33 | } |
||
34 | |||
35 | 14 | up20180645 | extern uint8_t byte;
|
36 | 16 | up20180645 | extern int mouse_id; |
37 | 13 | up20180645 | |
38 | int (mouse_test_packet)(uint32_t cnt) {
|
||
39 | 14 | up20180645 | int r, ipc_status;
|
40 | 16 | up20180645 | uint8_t mouse_irq; |
41 | unsigned int size=0; //size of mouse packet is 3 byte long |
||
42 | 14 | up20180645 | message msg; |
43 | 16 | up20180645 | uint32_t counter_pp=0;
|
44 | 14 | up20180645 | |
45 | struct packet pp;
|
||
46 | |||
47 | 16 | up20180645 | |
48 | //mouse_enable_data_reporting();
|
||
49 | |||
50 | //sys_irqdisable(&mouse_id);
|
||
51 | if(write_cmd_mouse(0xF4)!=0){ //check if disabling stream mode worked (0xF4 is the byte to disable data report) |
||
52 | 14 | up20180645 | printf("Error disabling stream mode\n");
|
53 | 13 | up20180645 | return 1; |
54 | 14 | up20180645 | } |
55 | 16 | up20180645 | //sys_irqenable(&mouse_id);
|
56 | 14 | up20180645 | |
57 | 16 | up20180645 | if(mouse_subscribe_int(&mouse_irq)!=0){ //check if subscription worked |
58 | 14 | up20180645 | printf("Error subscribing int\n");
|
59 | return 1; |
||
60 | } |
||
61 | 16 | up20180645 | |
62 | 14 | up20180645 | |
63 | 16 | up20180645 | while (cnt > counter_pp)
|
64 | { /* ends when it has printed the number in ctn */
|
||
65 | /*Get a request message.*/
|
||
66 | if ((r = driver_receive(ANY, &msg, &ipc_status)) != 0) |
||
67 | { |
||
68 | printf("ERROR: driver_receive failed with: %d", r);
|
||
69 | continue;
|
||
70 | } |
||
71 | if (is_ipc_notify(ipc_status))
|
||
72 | { // received notification
|
||
73 | switch (_ENDPOINT_P(msg.m_source))
|
||
74 | { |
||
75 | case HARDWARE: // hardware interrupt notification |
||
76 | if (msg.m_notify.interrupts & mouse_irq)
|
||
77 | { // subscribed interrupt
|
||
78 | mouse_ih(); //must read only one byte
|
||
79 | if ((size == 0 && (BIT(3) & byte)) || size == 1 ||size ==2) |
||
80 | { //access the struct bytes
|
||
81 | pp.bytes[size] = byte; // bytes 0, 1 or 2
|
||
82 | size++; // increments the counter to know in the next interrupt
|
||
83 | } |
||
84 | if (size == 3) // 3 bytes haven been read and there's no error |
||
85 | { |
||
86 | size = 0; // reset to start counting new packets |
||
87 | parse_packet(&pp); // parses packet
|
||
88 | mouse_print_packet(&pp); // prints packet
|
||
89 | counter_pp++; //counts the prints for the end of the loop
|
||
90 | } |
||
91 | } |
||
92 | break;
|
||
93 | default:
|
||
94 | break; // no other notifications expected: do nothing |
||
95 | } |
||
96 | } |
||
97 | else
|
||
98 | { // received a standard message, not a notification
|
||
99 | // no standard messages expected: do nothing
|
||
100 | } |
||
101 | } |
||
102 | 14 | up20180645 | |
103 | 16 | up20180645 | if (mouse_unsubscribe_int() != 0) { //check if unsubscription worked |
104 | printf("Error unsubscribing int \n");
|
||
105 | return 1; |
||
106 | } |
||
107 | |||
108 | if(write_cmd_mouse(0xF5)!=0){ //check if disabling stream mode worked (0xF5 is the byte to disable data report) |
||
109 | printf("Error disabling stream mode\n");
|
||
110 | return 1; |
||
111 | } |
||
112 | |||
113 | |||
114 | byte=0;
|
||
115 | |||
116 | return 0; |
||
117 | } |
||
118 | |||
119 | int (mouse_test_remote)(uint16_t period, uint8_t cnt) {
|
||
120 | uint8_t counter_pp=0, status;
|
||
121 | |||
122 | struct packet pp;
|
||
123 | |||
124 | /*if(write_cmd_mouse(0xF5)!=0){ //check if disabling stream mode worked (0xF5 is the byte to disable data report)
|
||
125 | printf("Error disabling stream mode\n");
|
||
126 | return 1;
|
||
127 | }
|
||
128 | |||
129 | if(write_cmd_mouse(0xF0)!=0){ //check if enabling remote mode worked (0xF0 is the byte to enable remote mode)
|
||
130 | printf("Error disabling stream mode\n");
|
||
131 | return 1;
|
||
132 | }*/
|
||
133 | |||
134 | |||
135 | while (cnt > counter_pp)
|
||
136 | { /* ends when it has printed the number in ctn */
|
||
137 | if(write_cmd_mouse(0xEB)!=0){ //check if enabling remote mode worked (0xF0 is the byte to enable remote mode) |
||
138 | printf("Error disabling stream mode\n");
|
||
139 | return 1; |
||
140 | 14 | up20180645 | } |
141 | 16 | up20180645 | |
142 | if(util_sys_inb(STATUS_REG,&status)!=0){ |
||
143 | printf("Error verifying the status of buffer\n");
|
||
144 | return 1; |
||
145 | } |
||
146 | |||
147 | if((status & 0x01)==0x01){ |
||
148 | |||
149 | if((status & (STAT_REG_PAR|STAT_REG_TIMEOUT))==0){ |
||
150 | |||
151 | for(int size=0;size<3;size++){ |
||
152 | |||
153 | if(util_sys_inb(OUTPUT_BUF,&byte)!=0){ |
||
154 | printf("Error reading output_buf\n");
|
||
155 | return 1; |
||
156 | } |
||
157 | |||
158 | if (size == 0 && (BIT(3) & byte)){ // access the struct bytes |
||
159 | pp.bytes[size] = byte; // bytes 0, 1 or 2
|
||
160 | //continue;
|
||
161 | } |
||
162 | if(size==1){ |
||
163 | pp.bytes[size] = byte; // bytes 0, 1 or 2
|
||
164 | //continue;
|
||
165 | } |
||
166 | if(size==2){ |
||
167 | pp.bytes[size] = byte; |
||
168 | |||
169 | } |
||
170 | 14 | up20180645 | } |
171 | 16 | up20180645 | parse_packet(&pp); // parses packet
|
172 | mouse_print_packet(&pp); // prints packet
|
||
173 | |||
174 | } |
||
175 | 14 | up20180645 | } |
176 | 16 | up20180645 | counter_pp++; //counts the prints for the end of the loop
|
177 | tickdelay(micros_to_ticks(period*1000));
|
||
178 | |||
179 | } |
||
180 | 14 | up20180645 | |
181 | 16 | up20180645 | if (write_cmd_mouse(0xEA)!=0) { //check if set stream mode worked (0xEA is the byte to enable) |
182 | 14 | up20180645 | printf("Error unsubscribing int \n");
|
183 | return 1; |
||
184 | } |
||
185 | |||
186 | 16 | up20180645 | if(write_cmd_mouse(0xF5)!=0){ //check if disabling data report worked (0xF5 is the byte to disable data report) |
187 | printf("Error disabling stream mode\n");
|
||
188 | return 1; |
||
189 | } |
||
190 | |||
191 | if (sys_outb(0X64,0x60)!=0) |
||
192 | { // Sends Write Command
|
||
193 | printf("Could not reset KBC command byte to default!");
|
||
194 | return 1; |
||
195 | } |
||
196 | uint8_t default_cmd=minix_get_dflt_kbc_cmd_byte(); |
||
197 | if (sys_outb(0x60,default_cmd)!=0) |
||
198 | { // Writes Command Byte
|
||
199 | printf("Could not reset KBC command byte to default!");
|
||
200 | return 1; |
||
201 | } |
||
202 | |||
203 | byte=0;
|
||
204 | |||
205 | 14 | up20180645 | return 0; |
206 | 13 | up20180645 | } |
207 | |||
208 | int (mouse_test_async)(uint8_t idle_time) {
|
||
209 | /* To be completed */
|
||
210 | printf("%s(%u): under construction\n", __func__, idle_time);
|
||
211 | return 1; |
||
212 | } |
||
213 | |||
214 | 16 | up20180645 | int (mouse_test_gesture)(uint8_t x_len, uint8_t tolerance) {
|
215 | 13 | up20180645 | /* To be completed */
|
216 | printf("%s: under construction\n", __func__);
|
||
217 | return 1; |
||
218 | } |