PatchworkOS
Loading...
Searching...
No Matches
mouse.c
Go to the documentation of this file.
2#include <kernel/fs/file.h>
3#include <kernel/fs/sysfs.h>
4#include <kernel/fs/vfs.h>
6#include <kernel/sync/lock.h>
7
8#include <errno.h>
9#include <stdio.h>
10#include <stdlib.h>
11#include <sys/math.h>
12
14
15static atomic_uint64_t newId = ATOMIC_VAR_INIT(0);
16
18{
20
22 for (uint64_t i = 0; i < count / sizeof(mouse_event_t); i++)
23 {
25
26 if (WAIT_BLOCK_LOCK(&mouse->waitQueue, &mouse->lock, *offset != mouse->writeIndex) == ERR)
27 {
28 return i * sizeof(mouse_event_t);
29 }
30
31 ((mouse_event_t*)buffer)[i] = mouse->events[*offset];
32 *offset = (*offset + 1) % MOUSE_MAX_EVENT;
33 }
34
35 return count;
36}
37
39{
42 if (mouse->writeIndex != file->pos)
43 {
44 *revents |= POLLIN;
45 }
46 return &mouse->waitQueue;
47}
48
51 .poll = mouse_events_poll,
52};
53
55{
58 if (*offset >= nameLen)
59 {
60 return 0;
61 }
62
63 return BUFFER_READ(buffer, count, offset, mouse->name, nameLen);
64}
65
68};
69
70static void mouse_dir_cleanup(inode_t* inode)
71{
72 mouse_t* mouse = inode->private;
74 free(mouse);
75}
76
80
81mouse_t* mouse_new(const char* name)
82{
83 if (name == NULL)
84 {
85 errno = EINVAL;
86 return NULL;
87 }
88
89 if (mouseDir == NULL)
90 {
91 mouseDir = sysfs_dir_new(NULL, "mouse", NULL, NULL);
92 if (mouseDir == NULL)
93 {
94 return NULL;
95 }
96 }
97
98 mouse_t* mouse = calloc(1, sizeof(mouse_t));
99 if (mouse == NULL)
100 {
101 return NULL;
102 }
103 strncpy(mouse->name, name, MAX_NAME - 1);
104 mouse->name[MAX_NAME - 1] = '\0';
105 mouse->writeIndex = 0;
108
109 char id[MAX_NAME];
110 if (snprintf(id, MAX_NAME, "%llu", atomic_fetch_add(&newId, 1)) < 0)
111 {
113 free(mouse);
114 return NULL;
115 }
116
118 if (mouse->dir == NULL)
119 {
121 free(mouse);
122 return NULL;
123 }
125 if (mouse->eventsFile == NULL)
126 {
127 DEREF(mouse->dir); // mouse will be freed in mouse_dir_cleanup
128 return NULL;
129 }
131 if (mouse->nameFile == NULL)
132 {
133 DEREF(mouse->dir);
135 return NULL;
136 }
137
138 return mouse;
139}
140
142{
143 DEREF(mouse->dir);
144 // mouse will be freed in mouse_dir_cleanup
145}
146
147void mouse_push(mouse_t* mouse, mouse_buttons_t buttons, int64_t deltaX, int64_t deltaY)
148{
151 .time = timer_uptime(),
152 .buttons = buttons,
153 .deltaX = deltaX,
154 .deltaY = deltaY,
155 };
158}
#define MAX_NAME
Maximum length of names.
Definition MAX_NAME.h:11
mouse_t * mouse_new(const char *name)
Allocate and initialize a mouse structure.
Definition mouse.c:81
void mouse_free(mouse_t *mouse)
Free and deinitialize a mouse structure.
Definition mouse.c:141
void mouse_push(mouse_t *mouse, mouse_buttons_t buttons, int64_t deltaX, int64_t deltaY)
Push a new mouse event to the mouse event queue.
Definition mouse.c:147
#define MOUSE_MAX_EVENT
Maximum number of queued mouse events.
Definition mouse.h:24
#define BUFFER_READ(buffer, count, offset, src, size)
Helper macros for implementing file operations dealing with simple buffers.
Definition vfs.h:372
uint64_t wait_unblock(wait_queue_t *waitQueue, uint64_t amount, errno_t err)
Unblock threads waiting on a wait queue.
Definition wait.c:168
void wait_queue_init(wait_queue_t *waitQueue)
Initialize wait queue.
Definition wait.c:71
#define WAIT_ALL
Wait for all.
Definition wait.h:26
#define WAIT_BLOCK_LOCK(waitQueue, lock, condition)
Block with a spinlock.
Definition wait.h:101
void wait_queue_deinit(wait_queue_t *waitQueue)
Deinitialize wait queue.
Definition wait.c:77
static void lock_init(lock_t *lock)
Initializes a lock.
Definition lock.h:80
#define LOCK_SCOPE(lock)
Acquires a lock for the reminder of the current scope.
Definition lock.h:57
clock_t timer_uptime(void)
Time since boot.
Definition timer.c:73
#define DEREF(ptr)
Decrement reference count.
Definition ref.h:80
#define EINVAL
Invalid argument.
Definition errno.h:142
#define errno
Error number variable.
Definition errno.h:27
#define EOK
No error.
Definition errno.h:32
poll_events_t
Poll events type.
Definition io.h:288
@ POLLIN
File descriptor is ready to read.
Definition io.h:290
#define ROUND_DOWN(number, multiple)
Definition math.h:21
mouse_buttons_t
Mouse buttons enum.
Definition mouse.h:31
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static dentry_t * file
Definition log_file.c:17
EFI_PHYSICAL_ADDRESS buffer
Definition mem.c:15
static atomic_uint64_t newId
Definition mouse.c:15
static uint64_t mouse_events_read(file_t *file, void *buffer, uint64_t count, uint64_t *offset)
Definition mouse.c:17
static void mouse_dir_cleanup(inode_t *inode)
Definition mouse.c:70
static file_ops_t nameOps
Definition mouse.c:66
static wait_queue_t * mouse_events_poll(file_t *file, poll_events_t *revents)
Definition mouse.c:38
static inode_ops_t dirInodeOps
Definition mouse.c:77
static file_ops_t eventsOps
Definition mouse.c:49
static dentry_t * mouseDir
Definition mouse.c:13
static uint64_t mouse_name_read(file_t *file, void *buffer, uint64_t count, uint64_t *offset)
Definition mouse.c:54
static atomic_long count
Definition main.c:9
static mouse_t * mouse
Definition ps2_mouse.c:9
#define ATOMIC_VAR_INIT(value)
Definition stdatomic.h:74
#define atomic_fetch_add(object, operand)
Definition stdatomic.h:283
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__INT64_TYPE__ int64_t
Definition stdint.h:16
_PUBLIC int snprintf(char *_RESTRICT s, size_t n, const char *_RESTRICT format,...)
Definition snprintf.c:3
_PUBLIC void * calloc(size_t nmemb, size_t size)
Definition calloc.c:6
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC char * strncpy(char *_RESTRICT s1, const char *_RESTRICT s2, size_t n)
Definition strncpy.c:3
size_t strnlen_s(const char *s, size_t maxsize)
Definition strnlen_s.c:4
Directory entry structure.
Definition dentry.h:83
inode_t * inode
Definition dentry.h:87
File operations structure.
Definition file.h:57
uint64_t(* read)(file_t *file, void *buffer, uint64_t count, uint64_t *offset)
Definition file.h:61
File structure.
Definition file.h:37
void(* cleanup)(inode_t *inode)
Definition inode.h:98
Inode structure.
Definition inode.h:54
void * private
Definition inode.h:66
Mouse event structure.
Definition mouse.h:45
clock_t time
Clock ticks since boot when the event happened.
Definition mouse.h:46
Mouse structure.
Definition mouse.h:31
uint64_t writeIndex
Definition mouse.h:34
dentry_t * eventsFile
Definition mouse.h:38
mouse_event_t events[MOUSE_MAX_EVENT]
Definition mouse.h:33
char name[MAX_NAME]
Definition mouse.h:32
dentry_t * nameFile
Definition mouse.h:39
wait_queue_t waitQueue
Definition mouse.h:35
dentry_t * dir
Definition mouse.h:37
lock_t lock
Definition mouse.h:36
Wait queue structure.
Definition wait.h:166
dentry_t * sysfs_dir_new(dentry_t *parent, const char *name, const inode_ops_t *inodeOps, void *private)
Create a new directory inside a mounted SysFS instance.
Definition sysfs.c:174
dentry_t * sysfs_file_new(dentry_t *parent, const char *name, const inode_ops_t *inodeOps, const file_ops_t *fileOps, void *private)
Create a new file inside a mounted SysFS instance.
Definition sysfs.c:216