Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
		
							parent
							
								
									e7fca67a9f
								
							
						
					
					
						commit
						cdadc55a34
					
				
							
								
								
									
										104
									
								
								kernel/event.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								kernel/event.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,104 @@ | ||||||
|  | 
 | ||||||
|  | #include "event.h" | ||||||
|  | #include "device.h" | ||||||
|  | #include "keyboard.h" | ||||||
|  | #include "mouse.h" | ||||||
|  | #include "interrupt.h" | ||||||
|  | #include "string.h" | ||||||
|  | #include "process.h" | ||||||
|  | 
 | ||||||
|  | #define EVENT_BUFFER_SIZE 32 | ||||||
|  | 
 | ||||||
|  | static struct event buffer[EVENT_BUFFER_SIZE]; | ||||||
|  | 
 | ||||||
|  | static int head=0; | ||||||
|  | static int tail=0; | ||||||
|  | static int overflow_count=0; | ||||||
|  | 
 | ||||||
|  | static struct list queue = LIST_INIT; | ||||||
|  | 
 | ||||||
|  | /* INTERRUPT CONTEXT */ | ||||||
|  | 
 | ||||||
|  | void event_post( uint16_t type, uint16_t code, int16_t x, int16_t y ) | ||||||
|  | { | ||||||
|  | 	/* If ring buffer is full, return immediately. */ | ||||||
|  | 	int next = (head+1) % EVENT_BUFFER_SIZE; | ||||||
|  | 	if(next==tail) { | ||||||
|  | 		overflow_count++; | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Copy event to current buffer position */ | ||||||
|  | 	struct event *e = &buffer[head]; | ||||||
|  | 	e->type = type; | ||||||
|  | 	e->code = code; | ||||||
|  | 	e->x = x; | ||||||
|  | 	e->y = y; | ||||||
|  | 
 | ||||||
|  | 	/* Advance head pointer and wake up waiting process (if any) */ | ||||||
|  | 	head = next; | ||||||
|  | 	process_wakeup(&queue); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int event_read_raw( struct event *e, int size, int blocking ) | ||||||
|  | { | ||||||
|  | 	int total=0; | ||||||
|  | 
 | ||||||
|  | 	if(size<sizeof(struct event)) return KERROR_INVALID_REQUEST; | ||||||
|  | 
 | ||||||
|  | 	interrupt_block(); | ||||||
|  | 
 | ||||||
|  | 	while(size>=sizeof(struct event)) { | ||||||
|  | 
 | ||||||
|  | 		if(head==tail) { | ||||||
|  | 			if(blocking && total==0) { | ||||||
|  | 				process_wait(&queue); | ||||||
|  | 				continue; | ||||||
|  | 			} else { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		*e = buffer[tail]; | ||||||
|  | 		tail = (tail+1) % EVENT_BUFFER_SIZE; | ||||||
|  | 		total++; | ||||||
|  | 		size -= sizeof(struct event); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	interrupt_unblock(); | ||||||
|  | 
 | ||||||
|  | 	return total; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int event_read( struct event *e, int size ) | ||||||
|  | { | ||||||
|  | 	return event_read_raw(e,size,1); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int event_read_nonblock( struct event *e, int size ) | ||||||
|  | { | ||||||
|  | 	return event_read_raw(e,size,0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int event_read_keyboard() | ||||||
|  | { | ||||||
|  | 	struct event e; | ||||||
|  | 	while(event_read(&e,sizeof(e))) { | ||||||
|  | 		if(e.type==EVENT_KEY_DOWN) { | ||||||
|  | 			return e.code; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return 'x'; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void event_init() | ||||||
|  | { | ||||||
|  | 	mouse_init(); | ||||||
|  | 	keyboard_init(); | ||||||
|  | 	printf("event: ready\n"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user