From 04e2022230bcb5fb0c158796d34c21fd2157d196 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Thu, 20 Apr 2023 01:42:17 +0100
Subject: [PATCH] feat: new loaders and better stout controller

---
 src/devices/stdout.rs | 12 +++++++++++-
 src/gb.rs             | 18 +++++++++++++++++-
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/devices/stdout.rs b/src/devices/stdout.rs
index a2f7528c..048a83f7 100644
--- a/src/devices/stdout.rs
+++ b/src/devices/stdout.rs
@@ -4,11 +4,19 @@ use crate::serial::SerialDevice;
 
 pub struct StdoutDevice {
     flush: bool,
+    callback: fn(image_buffer: &Vec<u8>),
 }
 
 impl StdoutDevice {
     pub fn new(flush: bool) -> Self {
-        Self { flush }
+        Self {
+            flush,
+            callback: |_| {},
+        }
+    }
+
+    pub fn set_callback(&mut self, callback: fn(image_buffer: &Vec<u8>)) {
+        self.callback = callback;
     }
 }
 
@@ -22,6 +30,8 @@ impl SerialDevice for StdoutDevice {
         if self.flush {
             stdout().flush().unwrap();
         }
+        let data = vec![byte];
+        (self.callback)(&data);
     }
 
     fn allow_slave(&self) -> bool {
diff --git a/src/gb.rs b/src/gb.rs
index 08c28c58..ba55c2fe 100644
--- a/src/gb.rs
+++ b/src/gb.rs
@@ -8,7 +8,7 @@ use crate::{
     pad::{Pad, PadKey},
     ppu::{Ppu, PpuMode, Tile, FRAME_BUFFER_SIZE},
     rom::Cartridge,
-    serial::{Serial, SerialDevice},
+    serial::{NullDevice, Serial, SerialDevice},
     timer::Timer,
     util::read_file,
 };
@@ -484,6 +484,19 @@ impl GameBoy {
         self.load_rom(data).clone()
     }
 
+    pub fn load_null_ws(&mut self) {
+        let null = Box::<NullDevice>::default();
+        self.attach_serial(null);
+    }
+
+    pub fn load_logger_ws(&mut self) {
+        let mut logger = Box::<StdoutDevice>::default();
+        logger.set_callback(|data| {
+            logger_callback(data.to_vec());
+        });
+        self.attach_serial(logger);
+    }
+
     pub fn load_printer_ws(&mut self) {
         let mut printer = Box::<PrinterDevice>::default();
         printer.set_callback(|image_buffer| {
@@ -534,6 +547,9 @@ extern "C" {
     #[wasm_bindgen(js_namespace = window)]
     fn panic(message: &str);
 
+    #[wasm_bindgen(js_namespace = window, js_name = loggerCallback)]
+    fn logger_callback(data: Vec<u8>);
+
     #[wasm_bindgen(js_namespace = window, js_name = printerCallback)]
     fn printer_callback(image_buffer: Vec<u8>);
 }
-- 
GitLab