From f4ad4b685692a5281b64de102a26dbd552ec8e6a Mon Sep 17 00:00:00 2001
From: Able <abl3theabove@gmail.com>
Date: Sun, 3 Nov 2024 16:48:36 -0600
Subject: [PATCH] mouse driver

---
 sysdata/programs/app_bar/README.md            |   2 +
 .../{mouse_driver => app_bar}/meta.toml       |   4 +-
 sysdata/programs/app_bar/src/main.hb          |  35 +++++
 sysdata/programs/mouse_driver/README.md       |   1 -
 sysdata/programs/mouse_driver/src/main.hb     |  79 ----------
 sysdata/programs/ps2_mouse_driver/README.md   |   2 +
 sysdata/programs/ps2_mouse_driver/meta.toml   |  11 ++
 sysdata/programs/ps2_mouse_driver/src/main.hb | 144 ++++++++++++++++++
 sysdata/system_config.toml                    |  11 +-
 9 files changed, 203 insertions(+), 86 deletions(-)
 create mode 100644 sysdata/programs/app_bar/README.md
 rename sysdata/programs/{mouse_driver => app_bar}/meta.toml (76%)
 create mode 100644 sysdata/programs/app_bar/src/main.hb
 delete mode 100644 sysdata/programs/mouse_driver/README.md
 delete mode 100644 sysdata/programs/mouse_driver/src/main.hb
 create mode 100644 sysdata/programs/ps2_mouse_driver/README.md
 create mode 100644 sysdata/programs/ps2_mouse_driver/meta.toml
 create mode 100644 sysdata/programs/ps2_mouse_driver/src/main.hb

diff --git a/sysdata/programs/app_bar/README.md b/sysdata/programs/app_bar/README.md
new file mode 100644
index 0000000..78d8cc6
--- /dev/null
+++ b/sysdata/programs/app_bar/README.md
@@ -0,0 +1,2 @@
+# app bar
+The app bar is a mini-bar meant to launch applications.
\ No newline at end of file
diff --git a/sysdata/programs/mouse_driver/meta.toml b/sysdata/programs/app_bar/meta.toml
similarity index 76%
rename from sysdata/programs/mouse_driver/meta.toml
rename to sysdata/programs/app_bar/meta.toml
index 21bdba8..80e868e 100644
--- a/sysdata/programs/mouse_driver/meta.toml
+++ b/sysdata/programs/app_bar/meta.toml
@@ -1,6 +1,6 @@
 [package]
-name = "mouse_driver"
-authors = [""]
+name = "app_bar"
+authors = ["able"]
 
 [dependants.libraries]
 
diff --git a/sysdata/programs/app_bar/src/main.hb b/sysdata/programs/app_bar/src/main.hb
new file mode 100644
index 0000000..c855a4d
--- /dev/null
+++ b/sysdata/programs/app_bar/src/main.hb
@@ -0,0 +1,35 @@
+stn := @use("../../../libraries/stn/src/lib.hb");
+.{string, memory, buffer, random, log} := stn;
+.{Vec2} := stn.math
+
+horizon_api := @use("../../../libraries/horizon_api/src/lib.hb")
+
+render := @use("../../../libraries/render/src/lib.hb")
+
+psf := @embed("../../../consolefonts/tamsyn/10x20r.psf")
+
+main := fn(): int {
+	screen := render.init(true)
+
+	// Clear the screen to black.
+	// render.clear(screen, render.black)
+
+	x := 0
+
+	mem_buf := memory.request_page(1)
+	color := random.any(render.Color)
+
+	str := "Window Title Bar\0"
+	font := render.text.font_from_psf2(@bitcast(&psf))
+
+	loop {
+		// Clear the screen
+		// render.clear(screen, render.black)
+
+		render.put_rect(screen, .(0, 0), .(screen.width - 1, 26), render.white)
+		// Sync the screen
+		render.sync(screen)
+	}
+
+	return 0
+}
\ No newline at end of file
diff --git a/sysdata/programs/mouse_driver/README.md b/sysdata/programs/mouse_driver/README.md
deleted file mode 100644
index b951afa..0000000
--- a/sysdata/programs/mouse_driver/README.md
+++ /dev/null
@@ -1 +0,0 @@
-# mouse_driver
\ No newline at end of file
diff --git a/sysdata/programs/mouse_driver/src/main.hb b/sysdata/programs/mouse_driver/src/main.hb
deleted file mode 100644
index f1c24f3..0000000
--- a/sysdata/programs/mouse_driver/src/main.hb
+++ /dev/null
@@ -1,79 +0,0 @@
-.{memory, buffer, log, string} := @use("../../../libraries/stn/src/lib.hb")
-render := @use("../../../libraries/render/src/lib.hb")
-
-ACK := 250
-
-wait_for := fn(for: u8): void {
-	log.info("Start waiting\0")
-	loop {
-		if (memory.inb(0x64) & 2 >> for) == for {
-			log.info("End waiting\0")
-			return
-		}
-	}
-}
-
-send_info := fn(info: u8): void {
-	wait_for(1)
-	memory.outb(0x64, info)
-}
-
-send_command := fn(command: u8): void {
-	send_info(0xD4)
-	wait_for(1)
-	memory.outb(0x60, command)
-}
-
-get_response := fn(): u8 {
-	wait_for(1)
-	return memory.inb(0x60)
-}
-
-main := fn(): int {
-	// screen := render.init(true)
-
-	format_page := memory.alloc(u8, 1024)
-
-	wait_for(0)
-	memory.outb(0x64, 0xA8)
-	log.info("Aux mouse device enabled.\0")
-
-	send_command(0xF6)
-	a := get_response()
-
-	send_command(0xF4)
-	b := get_response()
-
-	x := -0
-	y := -0
-
-	loop {
-		// render.clear(screen, render.black)
-
-		loop {
-			if (memory.inb(0x64) & 0x20) == 0x20 {
-				log.info("Yeah\0")
-
-				break
-			} else {
-			}
-		}
-
-		status := memory.inb(0x60)
-		log.info(string.display_int(status, format_page, 10))
-		d_x := memory.inb(0x60)
-		log.info(string.display_int(d_x, format_page, 10))
-		x = x + d_x
-		d_y := memory.inb(0x60)
-		y = y + d_y
-		log.info(string.display_int(d_y, format_page, 10))
-		// render.put_rect(screen, .(x, y), .(x + 10, y + 10), render.white)
-
-		log.info("XY\0")
-
-		log.info(string.display_int(x, format_page, 10))
-		log.info(string.display_int(y, format_page, 10))
-	}
-
-	return 0
-}
\ No newline at end of file
diff --git a/sysdata/programs/ps2_mouse_driver/README.md b/sysdata/programs/ps2_mouse_driver/README.md
new file mode 100644
index 0000000..4c17847
--- /dev/null
+++ b/sysdata/programs/ps2_mouse_driver/README.md
@@ -0,0 +1,2 @@
+# ps2_mouse_driver
+A small PS/2 mouse driver. This driver pushes changes to the input service in ableOS.
\ No newline at end of file
diff --git a/sysdata/programs/ps2_mouse_driver/meta.toml b/sysdata/programs/ps2_mouse_driver/meta.toml
new file mode 100644
index 0000000..e3bfc9a
--- /dev/null
+++ b/sysdata/programs/ps2_mouse_driver/meta.toml
@@ -0,0 +1,11 @@
+[package]
+name = "ps2_mouse_driver"
+authors = ["able", "peony"]
+
+[dependants.libraries]
+
+[dependants.binaries]
+hblang.version = "1.0.0"
+
+[build]
+command = "hblang src/main.hb"
diff --git a/sysdata/programs/ps2_mouse_driver/src/main.hb b/sysdata/programs/ps2_mouse_driver/src/main.hb
new file mode 100644
index 0000000..0b70519
--- /dev/null
+++ b/sysdata/programs/ps2_mouse_driver/src/main.hb
@@ -0,0 +1,144 @@
+.{memory, buffer, log, string, math} := @use("../../../libraries/stn/src/lib.hb")
+Vec2 := math.Vec2
+
+i9 := packed struct {sign: bool, value: u8}
+Button := struct {id: u8}
+LeftButton := Button.(1)
+RightButton := Button.(2)
+MiddleButton := Button.(4)
+Button4 := Button.(8)
+Button5 := Button.(16)
+
+mouse_moved := fn(delta: Vec2(i9)): void {
+	log.info("Mouse movement.\0")
+}
+button_event := fn(button: Button, pressed: bool): void {
+	if pressed {
+		log.info("Mouse-button pressed.\0")
+	} else {
+		log.info("Mouse-button released.\0")
+	}
+}
+
+send_byte := fn(target: u8, data: u8): void {
+	loop if (memory.inb(0x64) & 2) == 0 break
+	memory.outb(target, data)
+}
+
+reset_mouse := fn(): void {
+	@inline(send_byte, 0x64, 0xD4)
+	@inline(send_byte, 0x60, 0xFF)
+	loop if memory.inb(0x60) == 0xAA {
+		log.info("Self check passed.\0")
+		return
+	}
+}
+
+send_command_byte := fn(byte: u8): void {
+	@inline(send_byte, 0x64, 0xD4)
+	@inline(send_byte, 0x60, byte)
+	loop if memory.inb(0x60) == 0xFA {
+		log.info("ACK\0")
+		return
+	}
+}
+
+set_defaults := fn(): void @inline(send_command_byte, 0xF6)
+disable_streaming := fn(): void @inline(send_command_byte, 0xF5)
+enable_streaming := fn(): void @inline(send_command_byte, 0xF4)
+
+set_remote_mode := fn(): void @inline(send_command_byte, 0xF0)
+set_warp_mode := fn(): void @inline(send_command_byte, 0xEE)
+reset_warp_mode := fn(): void @inline(send_command_byte, 0xEC)
+set_stream_mode := fn(): void @inline(send_command_byte, 0xEA)
+
+set_non_linear_scaling := fn(): void @inline(send_command_byte, 0xE7)
+set_linear_scaling := fn(): void @inline(send_command_byte, 0xE6)
+
+resend_packet := fn(): void @inline(send_command_byte, 0xFE)
+
+SampleRate := struct {value: u8}
+sr10 := SampleRate.(10)
+sr20 := SampleRate.(20)
+sr40 := SampleRate.(40)
+sr60 := SampleRate.(60)
+sr80 := SampleRate.(80)
+sr100 := SampleRate.(100)
+sr200 := SampleRate.(200)
+
+set_sample_rate := fn(sample_rate: SampleRate): void {
+	@inline(send_command_byte, 0xE6)
+	@inline(send_command_byte, sample_rate.value)
+}
+
+Resolution := struct {value: u8}
+res_1count_per_mm := Resolution.(0)
+res_2count_per_mm := Resolution.(1)
+res_4count_per_mm := Resolution.(2)
+res_8count_per_mm := Resolution.(3)
+
+set_resolution := fn(resolution: Resolution): void {
+	@inline(send_command_byte, 0xE6)
+	@inline(send_command_byte, resolution.value)
+}
+
+button_states := @as(u8, 0)
+
+main := fn(): int {
+	format_page := memory.alloc(u8, 1024)
+
+	send_byte(0x64, 0xA8)
+	log.info("Aux mouse device enabled.\0")
+
+	reset_mouse()
+	set_defaults()
+	enable_streaming()
+
+	x := @as(i16, 0)
+	y := @as(i16, 0)
+
+	loop {
+		loop if (memory.inb(0x64) & 0x20) == 0x20 break
+
+		status := memory.inb(0x60)
+		if status == 0xAA {
+			loop if memory.inb(0x60) == 0 break
+			log.info("Mouse plugged in!\0")
+			reset_mouse()
+			set_defaults()
+			enable_streaming()
+			continue
+		}
+
+		changes := button_states ^ status & 7
+
+		if (changes & LeftButton.id) != 0 {
+			button_event(LeftButton, (status & LeftButton.id) != 0)
+		}
+		if (changes & RightButton.id) != 0 {
+			button_event(RightButton, (status & RightButton.id) != 0)
+		}
+		if (changes & MiddleButton.id) != 0 {
+			button_event(MiddleButton, (status & MiddleButton.id) != 0)
+		}
+
+		button_states ^= changes
+
+		log.info(string.display_int(status, format_page, 10))
+
+		dx := i9.(false, 0)
+		dy := i9.(false, 0)
+
+		dx.value = memory.inb(0x60)
+		dx.sign = (status & 0x10) > 0
+
+		dy.value = memory.inb(0x60) ^ 0xFF
+		dy.sign = (status & 0x20) == 0
+
+		if dy.value != 0 & dx.value != 0 {
+			mouse_moved(.(dx, dy))
+		}
+	}
+
+	return 0
+}
\ No newline at end of file
diff --git a/sysdata/system_config.toml b/sysdata/system_config.toml
index ada4508..8f8b179 100644
--- a/sysdata/system_config.toml
+++ b/sysdata/system_config.toml
@@ -37,8 +37,8 @@ resolution = "1024x768x24"
 # [boot.limine.ableos.modules.serial_driver_test]
 # path = "boot:///serial_driver_test.hbf"
 
-[boot.limine.ableos.modules.horizon]
-path = "boot:///horizon.hbf"
+# [boot.limine.ableos.modules.horizon]
+# path = "boot:///horizon.hbf"
 
 # [boot.limine.ableos.modules.horizon_testing_program]
 # path = "boot:///horizon_testing_program.hbf"
@@ -58,5 +58,8 @@ path = "boot:///horizon.hbf"
 # [boot.limine.ableos.modules.pumpkin_print]
 # path = "boot:///pumpkin_print.hbf"
 
-# [boot.limine.ableos.modules.mouse_driver]
-# path = "boot:///mouse_driver.hbf"
+[boot.limine.ableos.modules.ps2_mouse_driver]
+path = "boot:///ps2_mouse_driver.hbf"
+
+# [boot.limine.ableos.modules.app_bar]
+# path = "boot:///app_bar.hbf"