This commit is contained in:
bQUARKz 2026-02-04 02:46:45 +00:00
parent 92df0ae074
commit 97c6ccb6f2
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
40 changed files with 113 additions and 146 deletions

38
Cargo.lock generated
View File

@ -1914,7 +1914,21 @@ dependencies = [
]
[[package]]
name = "prometeu-core"
name = "prometeu-firmware"
version = "0.1.0"
dependencies = [
"prometeu-abi",
"prometeu-bytecode",
"prometeu-hardware",
"prometeu-hardware-contract",
"prometeu-kernel",
"prometeu-vm",
"serde",
"serde_json",
]
[[package]]
name = "prometeu-hardware"
version = "0.1.0"
dependencies = [
"prometeu-abi",
@ -1927,20 +1941,6 @@ dependencies = [
"url",
]
[[package]]
name = "prometeu-firmware"
version = "0.1.0"
dependencies = [
"prometeu-abi",
"prometeu-bytecode",
"prometeu-core",
"prometeu-hardware-contract",
"prometeu-kernel",
"prometeu-vm",
"serde",
"serde_json",
]
[[package]]
name = "prometeu-hardware-contract"
version = "0.1.0"
@ -1957,10 +1957,9 @@ version = "0.1.0"
dependencies = [
"prometeu-abi",
"prometeu-bytecode",
"prometeu-core",
"prometeu-hardware",
"prometeu-hardware-contract",
"prometeu-vm",
"serde",
"serde_json",
]
@ -1981,8 +1980,11 @@ dependencies = [
"clap",
"cpal",
"pixels",
"prometeu-core",
"prometeu-abi",
"prometeu-firmware",
"prometeu-hardware",
"prometeu-hardware-contract",
"prometeu-kernel",
"ringbuf",
"serde_json",
"winit",

View File

@ -3,7 +3,7 @@ members = [
"crates/prometeu-abi",
"crates/prometeu-vm",
"crates/prometeu-kernel",
"crates/prometeu-core",
"crates/prometeu-hardware",
"crates/prometeu-runtime-desktop",
"crates/prometeu",
"crates/prometeu-bytecode",

View File

@ -31,7 +31,7 @@ This repository is organized as a Rust workspace and contains several components
- **[crates/](./crates)**: Software implementation in Rust.
- **[prometeu](./crates/prometeu)**: Unified command-line interface (CLI).
- **[prometeu-core](./crates/prometeu-core)**: The logical core, VM, and internal OS.
- **[prometeu-hardware](./crates/prometeu-hardware)**: The virtual hardware (GPU, SPU, Input).
- **[prometeu-runtime-desktop](crates/prometeu-runtime-desktop)**: Host for execution on Desktop systems.
- **[docs/](./docs)**: Technical documentation and system specifications.
- **[devtools-protocol/](devtools)**: Definition of the communication protocol for development tools.

View File

@ -1,20 +0,0 @@
mod asset;
mod gfx;
mod pad;
mod touch;
mod audio;
mod memory_banks;
pub mod hardware;
pub use crate::model::HandleId;
pub use asset::AssetManager;
pub use audio::{Audio, AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
pub use gfx::Gfx;
pub use memory_banks::MemoryBanks;
pub use pad::Pad;
pub use touch::Touch;
pub use prometeu_hardware_contract::{
AssetBridge, AudioBridge, BlendMode, GfxBridge, HardwareBridge, InputSignals, LoopMode,
PadBridge, TouchBridge,
};

View File

@ -1,35 +0,0 @@
//! # Prometeu Core
//!
//! This crate contains the engine and hardware definitions for the Prometeu Virtual Console.
//! It serves as the bridge between the physical host (desktop/web) and the virtualized
//! environment where games and apps run.
//!
//! ## Main Components:
//! - [`hardware`]: Virtual peripheral definitions (Graphics, Audio, Input).
//! - [`virtual_machine`]: The stack-based execution engine for Prometeu ByteCode.
//! - [`prometeu_os`]: Resource management, filesystem access, and syscall dispatching.
//! - [`model`]: Common data structures (Colors, Sprites, Cartridges).
//! - [`fs`]: Virtualized filesystem abstraction for sandboxed access.
//! - [`log`]: Centralized logging and telemetry service.
//!
//! The "Source of Truth" for the console's behavior lives here.
pub mod hardware;
// pub mod fs;
pub mod fs {
pub use prometeu_kernel::fs::*;
}
pub mod prometeu_os {
pub use prometeu_kernel::*;
}
// Facade/reexports for ABI modules (temporary during PR-00.x)
pub use prometeu_abi as abi;
pub use prometeu_abi::debugger_protocol;
pub use prometeu_abi::log;
pub use prometeu_abi::model;
pub use prometeu_abi::telemetry;
pub use hardware::hardware::Hardware;

View File

@ -5,7 +5,7 @@ edition = "2024"
license.workspace = true
[dependencies]
prometeu-core = { path = "../prometeu-core" }
prometeu-hardware = { path = "../prometeu-hardware" }
prometeu-vm = { path = "../prometeu-vm" }
prometeu-kernel = { path = "../prometeu-kernel" }
prometeu-bytecode = { path = "../prometeu-bytecode" }

View File

@ -1,13 +1,12 @@
use prometeu_abi::model::Cartridge;
use prometeu_abi::telemetry::CertificationConfig;
use prometeu_hardware_contract::{HardwareBridge, InputSignals};
use prometeu_kernel::PrometeuOS;
use prometeu_vm::VirtualMachine;
use crate::firmware::boot_target::BootTarget;
use crate::firmware::firmware_state::{FirmwareState, LoadCartridgeStep, ResetStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::hardware::{HardwareBridge, InputSignals};
use prometeu_core::abi::model::Cartridge;
use crate::prometeu_hub::PrometeuHub;
use prometeu_core::prometeu_os::PrometeuOS;
use prometeu_core::abi::telemetry::CertificationConfig;
/// PROMETEU Firmware.
///

View File

@ -1,7 +1,7 @@
use prometeu_abi::log::{LogLevel, LogSource};
use prometeu_abi::model::Color;
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_core::abi::model::Color;
#[derive(Debug, Clone)]
pub struct AppCrashesStep {

View File

@ -1,6 +1,6 @@
use prometeu_abi::log::{LogLevel, LogSource};
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
#[derive(Debug, Clone)]
pub struct GameRunningStep;

View File

@ -1,6 +1,6 @@
use crate::firmware::firmware_state::{AppCrashesStep, FirmwareState};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_abi::log::{LogLevel, LogSource};
#[derive(Debug, Clone)]
pub struct HubHomeStep;

View File

@ -1,8 +1,8 @@
use crate::firmware::boot_target::BootTarget;
use crate::firmware::firmware_state::{FirmwareState, HubHomeStep, LoadCartridgeStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_core::abi::model::CartridgeLoader;
use prometeu_abi::log::{LogLevel, LogSource};
use prometeu_abi::model::CartridgeLoader;
#[derive(Debug, Clone)]
pub struct LaunchHubStep;

View File

@ -1,7 +1,7 @@
use crate::firmware::firmware_state::{FirmwareState, GameRunningStep, HubHomeStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_core::abi::model::{AppMode, Cartridge, Color, Rect};
use prometeu_abi::log::{LogLevel, LogSource};
use prometeu_abi::model::{AppMode, Cartridge, Color, Rect};
#[derive(Debug, Clone)]
pub struct LoadCartridgeStep {

View File

@ -1,7 +1,7 @@
use prometeu_abi::log::{LogLevel, LogSource};
use crate::firmware::boot_target::BootTarget;
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep, SplashScreenStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
#[derive(Debug, Clone)]
pub struct ResetStep;

View File

@ -1,7 +1,7 @@
use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep};
use crate::firmware::prometeu_context::PrometeuContext;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_core::abi::model::Color;
use prometeu_abi::log::{LogLevel, LogSource};
use prometeu_abi::model::Color;
#[derive(Debug, Clone)]
pub struct SplashScreenStep {

View File

@ -1,8 +1,8 @@
use prometeu_hardware_contract::{HardwareBridge, InputSignals};
use prometeu_kernel::PrometeuOS;
use prometeu_vm::VirtualMachine;
use crate::firmware::boot_target::BootTarget;
use prometeu_core::hardware::{HardwareBridge, InputSignals};
use crate::prometeu_hub::PrometeuHub;
use prometeu_core::prometeu_os::PrometeuOS;
pub struct PrometeuContext<'a> {
pub vm: &'a mut VirtualMachine,

View File

@ -1,8 +1,8 @@
use prometeu_core::hardware::HardwareBridge;
use prometeu_core::abi::log::{LogLevel, LogSource};
use prometeu_core::abi::model::{Color, Rect};
use prometeu_abi::log::{LogLevel, LogSource};
use prometeu_abi::model::{Color, Rect};
use prometeu_hardware_contract::HardwareBridge;
use prometeu_kernel::PrometeuOS;
use crate::prometeu_hub::window_manager::WindowManager;
use prometeu_core::prometeu_os::PrometeuOS;
/// PrometeuHub: Launcher and system UI environment.
pub struct PrometeuHub {

View File

@ -1,4 +1,4 @@
use prometeu_core::abi::model::{Color, Rect, Window, WindowId};
use prometeu_abi::model::{Color, Rect, Window, WindowId};
/// PROMETEU Window Manager.
pub struct WindowManager {
@ -50,7 +50,7 @@ impl WindowManager {
#[cfg(test)]
mod tests {
use super::*;
use prometeu_core::abi::model::Rect;
use prometeu_abi::model::Rect;
#[test]
fn test_window_manager_focus() {

View File

@ -1,5 +1,5 @@
[package]
name = "prometeu-core"
name = "prometeu-hardware"
version = "0.1.0"
edition = "2024"
license.workspace = true

View File

@ -1,10 +1,10 @@
use crate::hardware::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller};
use crate::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, PreloadEntry, Sample, SlotRef, SlotStats, SoundBank, TileBank, TileSize};
use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock};
use std::thread;
use std::time::Instant;
use prometeu_abi::model::{AssetEntry, BankStats, BankType, Color, HandleId, LoadStatus, PreloadEntry, Sample, SlotRef, SlotStats, SoundBank, TileBank, TileSize};
use prometeu_hardware_contract::AssetBridge;
use crate::memory_banks::{SoundBankPoolInstaller, TileBankPoolInstaller};
/// Resident metadata for a decoded/materialized asset inside a BankPolicy.
#[derive(Debug)]
@ -673,7 +673,7 @@ impl AssetManager {
#[cfg(test)]
mod tests {
use super::*;
use crate::hardware::memory_banks::{MemoryBanks, SoundBankPoolAccess, TileBankPoolAccess};
use crate::memory_banks::{MemoryBanks, SoundBankPoolAccess, TileBankPoolAccess};
#[test]
fn test_asset_loading_flow() {

View File

@ -1,6 +1,5 @@
use crate::hardware::memory_banks::SoundBankPoolAccess;
use crate::model::Sample;
use std::sync::Arc;
use prometeu_abi::model::Sample;
use prometeu_hardware_contract::AudioBridge;
/// Maximum number of simultaneous audio voices supported by the hardware.
@ -10,6 +9,7 @@ pub const OUTPUT_SAMPLE_RATE: u32 = 48000;
/// Looping mode for samples (re-exported from the hardware contract).
pub use prometeu_hardware_contract::LoopMode;
use crate::memory_banks::SoundBankPoolAccess;
/// State of a single playback voice (channel).
///

View File

@ -1,5 +1,5 @@
use crate::hardware::memory_banks::TileBankPoolAccess;
use crate::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite, TileBank, TileMap, TileSize};
use crate::memory_banks::TileBankPoolAccess;
use prometeu_abi::model::{Color, HudTileLayer, ScrollableTileLayer, Sprite, Tile, TileBank, TileMap, TileSize};
use std::sync::Arc;
use prometeu_hardware_contract::GfxBridge;
@ -119,7 +119,7 @@ impl Gfx {
/// Initializes the graphics system with a specific resolution and shared memory banks.
pub fn new(w: usize, h: usize, tile_banks: Arc<dyn TileBankPoolAccess>) -> Self {
const EMPTY_SPRITE: Sprite = Sprite {
tile: crate::model::Tile { id: 0, flip_x: false, flip_y: false, palette_id: 0 },
tile: Tile { id: 0, flip_x: false, flip_y: false, palette_id: 0 },
x: 0,
y: 0,
bank_id: 0,
@ -483,7 +483,7 @@ impl Gfx {
/// Internal helper to copy a single tile's pixels to the framebuffer.
/// Handles flipping and palette resolution.
fn draw_tile_pixels(back: &mut [u16], screen_w: usize, screen_h: usize, x: i32, y: i32, tile: crate::model::Tile, bank: &TileBank) {
fn draw_tile_pixels(back: &mut [u16], screen_w: usize, screen_h: usize, x: i32, y: i32, tile: Tile, bank: &TileBank) {
let size = bank.tile_size as usize;
for local_y in 0..size {
@ -662,7 +662,7 @@ impl Gfx {
#[cfg(test)]
mod tests {
use super::*;
use crate::hardware::MemoryBanks;
use crate::memory_banks::MemoryBanks;
#[test]
fn test_draw_pixel() {

View File

@ -1,6 +1,11 @@
use crate::hardware::memory_banks::{SoundBankPoolAccess, SoundBankPoolInstaller, TileBankPoolAccess, TileBankPoolInstaller};
use crate::hardware::{AssetBridge, AssetManager, Audio, AudioBridge, Gfx, GfxBridge, HardwareBridge, MemoryBanks, Pad, PadBridge, Touch, TouchBridge};
use std::sync::Arc;
use prometeu_hardware_contract::{AssetBridge, AudioBridge, GfxBridge, HardwareBridge, PadBridge, TouchBridge};
use crate::asset::AssetManager;
use crate::audio::Audio;
use crate::gfx::Gfx;
use crate::memory_banks::{MemoryBanks, SoundBankPoolAccess, SoundBankPoolInstaller, TileBankPoolAccess, TileBankPoolInstaller};
use crate::pad::Pad;
use crate::touch::Touch;
/// Aggregate structure for all virtual hardware peripherals.
///

View File

@ -0,0 +1,14 @@
mod asset;
mod gfx;
mod pad;
mod touch;
mod audio;
mod memory_banks;
pub mod hardware;
pub use crate::asset::AssetManager;
pub use crate::audio::{Audio, AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
pub use crate::gfx::Gfx;
pub use crate::memory_banks::MemoryBanks;
pub use crate::pad::Pad;
pub use crate::touch::Touch;

View File

@ -1,5 +1,5 @@
use crate::model::{SoundBank, TileBank};
use std::sync::{Arc, RwLock};
use prometeu_abi::model::{SoundBank, TileBank};
/// Non-generic interface for peripherals to access graphical tile banks.
pub trait TileBankPoolAccess: Send + Sync {

View File

@ -1,6 +1,5 @@
use prometeu_hardware_contract::PadBridge;
use crate::hardware::InputSignals;
use crate::model::Button;
use prometeu_abi::model::Button;
use prometeu_hardware_contract::{InputSignals, PadBridge};
#[derive(Default, Clone, Copy, Debug)]
pub struct Pad {

View File

@ -1,6 +1,5 @@
use prometeu_hardware_contract::TouchBridge;
use crate::hardware::InputSignals;
use crate::model::Button;
use prometeu_abi::model::Button;
use prometeu_hardware_contract::{InputSignals, TouchBridge};
#[derive(Default, Clone, Copy, Debug)]
pub struct Touch {

View File

@ -1,7 +1,7 @@
use prometeu_core::Hardware;
use std::fs;
use std::path::Path;
use prometeu_abi::virtual_machine::{Value, VmFault};
use prometeu_hardware::hardware::Hardware;
use prometeu_hardware_contract::{HostContext, HostReturn, NativeInterface};
use prometeu_vm::{LogicalFrameEndingReason, VirtualMachine};

View File

@ -5,7 +5,6 @@ edition = "2024"
license.workspace = true
[dependencies]
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.149"
prometeu-vm = { path = "../prometeu-vm" }
prometeu-bytecode = { path = "../prometeu-bytecode" }
@ -13,4 +12,4 @@ prometeu-abi = { path = "../prometeu-abi" }
prometeu-hardware-contract = { path = "../prometeu-hardware-contract" }
[dev-dependencies]
prometeu-core = { path = "../prometeu-core" }
prometeu-hardware = { path = "../prometeu-hardware" }

View File

@ -415,11 +415,11 @@ impl PrometeuOS {
#[cfg(test)]
mod tests {
use prometeu_abi::virtual_machine::Value;
use prometeu_hardware::hardware::Hardware;
use prometeu_abi::virtual_machine::Value;
use prometeu_hardware_contract::{HostReturn, InputSignals};
use super::*;
use prometeu_abi::model::{AppMode, Cartridge};
use prometeu_core::Hardware;
fn call_syscall(os: &mut PrometeuOS, id: u32, vm: &mut VirtualMachine, hw: &mut dyn HardwareBridge) -> Result<(), VmFault> {
let args_count = Syscall::from_u32(id).expect(&format!("Invalid syscall id: 0x{:08X}", id)).args_count();

View File

@ -14,8 +14,11 @@ dist = true
include = ["../../VERSION.txt"]
[dependencies]
prometeu-core = { path = "../prometeu-core" }
prometeu-abi = { path = "../prometeu-abi" }
prometeu-firmware = { path = "../prometeu-firmware" }
prometeu-kernel = { path = "../prometeu-kernel" }
prometeu-hardware = { path = "../prometeu-hardware" }
prometeu-hardware-contract = { path="../prometeu-hardware-contract" }
winit = "0.30.12"
pixels = "0.15.0"
cpal = "0.15.3"

View File

@ -1,9 +1,10 @@
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
use prometeu_core::hardware::{AudioCommand, Channel, LoopMode, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
use prometeu_hardware::{AudioCommand, Channel, MAX_CHANNELS, OUTPUT_SAMPLE_RATE};
use ringbuf::traits::{Consumer, Producer, Split};
use ringbuf::HeapRb;
use std::sync::Arc;
use std::time::Duration;
use prometeu_hardware_contract::LoopMode;
pub struct HostAudio {
pub producer: Option<ringbuf::wrap::CachingProd<Arc<HeapRb<AudioCommand>>>>,

View File

@ -1,4 +1,4 @@
use prometeu_core::telemetry::CertificationConfig;
use prometeu_abi::telemetry::CertificationConfig;
pub fn load_cap_config(path: &str) -> Option<CertificationConfig> {
let content = std::fs::read_to_string(path).ok()?;

View File

@ -1,9 +1,9 @@
use prometeu_core::debugger_protocol::*;
use prometeu_abi::debugger_protocol::*;
use prometeu_firmware::{BootTarget, Firmware};
use prometeu_core::abi::model::CartridgeLoader;
use prometeu_core::Hardware;
use prometeu_abi::model::CartridgeLoader;
use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use prometeu_hardware::hardware::Hardware;
/// Host-side implementation of the PROMETEU DevTools Protocol.
///

View File

@ -1,6 +1,6 @@
use prometeu_core::fs::{FsBackend, FsEntry, FsError};
use std::fs;
use std::path::PathBuf;
use prometeu_kernel::fs::{FsBackend, FsEntry, FsError};
pub struct HostDirBackend {
root: PathBuf,

View File

@ -1,8 +1,8 @@
use prometeu_core::hardware::InputSignals;
use prometeu_core::Hardware;
use winit::event::{ElementState, MouseButton, WindowEvent};
use winit::keyboard::{KeyCode, PhysicalKey};
use winit::window::Window;
use prometeu_hardware::hardware::Hardware;
use prometeu_hardware_contract::InputSignals;
pub struct HostInputHandler {
pub signals: InputSignals,

View File

@ -1,4 +1,4 @@
use prometeu_core::log::{LogEvent, LogLevel, LogSource};
use prometeu_abi::log::{LogEvent, LogLevel, LogSource};
pub struct HostConsoleSink {
last_seq: Option<u64>,

View File

@ -8,7 +8,6 @@ use crate::utilities::draw_rgb565_to_rgba8;
use pixels::wgpu::PresentMode;
use pixels::{Pixels, PixelsBuilder, SurfaceTexture};
use prometeu_firmware::{BootTarget, Firmware};
use prometeu_core::Hardware;
use std::time::{Duration, Instant};
use winit::application::ApplicationHandler;
use winit::dpi::LogicalSize;
@ -16,8 +15,10 @@ use winit::event::{ElementState, WindowEvent};
use winit::event_loop::{ActiveEventLoop, ControlFlow};
use winit::keyboard::{KeyCode, PhysicalKey};
use winit::window::{Window, WindowAttributes, WindowId};
use prometeu_core::telemetry::CertificationConfig;
use prometeu_abi::model::Color;
use prometeu_abi::telemetry::CertificationConfig;
use prometeu_hardware::hardware::Hardware;
use prometeu_hardware::AudioCommand;
/// The Desktop implementation of the PROMETEU Runtime.
///
@ -124,9 +125,9 @@ impl HostRunner {
fn display_dbg_overlay(&mut self) {
let tel = &self.firmware.os.telemetry_last;
let color_text = prometeu_core::model::Color::WHITE;
let color_bg = prometeu_core::model::Color::INDIGO; // Dark blue to stand out
let color_warn = prometeu_core::model::Color::RED;
let color_text = Color::WHITE;
let color_bg = Color::INDIGO; // Dark blue to stand out
let color_warn = Color::RED;
self.hardware.gfx.fill_rect(5, 5, 175, 100, color_bg);
self.hardware.gfx.draw_text(10, 10, &format!("FPS: {:.1}", self.stats.current_fps), color_text);
@ -259,7 +260,7 @@ impl ApplicationHandler for HostRunner {
// 2. Maintain filesystem connection if it was lost (e.g., directory removed).
if let Some(root) = &self.fs_root {
use prometeu_core::fs::FsState;
use prometeu_kernel::fs::FsState;
if matches!(self.firmware.os.fs_state, FsState::Unmounted | FsState::Error(_)) {
if std::path::Path::new(root).exists() {
let backend = HostDirBackend::new(root);
@ -298,9 +299,9 @@ impl ApplicationHandler for HostRunner {
if is_paused != self.last_paused_state {
self.last_paused_state = is_paused;
let cmd = if is_paused {
prometeu_core::hardware::AudioCommand::MasterPause
AudioCommand::MasterPause
} else {
prometeu_core::hardware::AudioCommand::MasterResume
AudioCommand::MasterResume
};
self.hardware.audio.commands.push(cmd);
}
@ -343,10 +344,10 @@ impl ApplicationHandler for HostRunner {
#[cfg(test)]
mod tests {
use super::*;
use prometeu_core::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION;
use prometeu_firmware::BootTarget;
use std::io::{Read, Write};
use std::net::TcpStream;
use prometeu_abi::debugger_protocol::DEVTOOLS_PROTOCOL_VERSION;
#[test]
fn test_debug_port_opens() {

View File

@ -1,7 +1,7 @@
use prometeu_firmware::Firmware;
use prometeu_core::Hardware;
use std::time::{Duration, Instant};
use winit::window::Window;
use prometeu_hardware::hardware::Hardware;
pub struct HostStats {
pub last_stats_update: Instant,