From 0d8738cf9b5671b0f236f2384b182a177f1f5338 Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 17 Aug 2026 12:11:36 +0200 Subject: [PATCH] Scheduler --- backend/src/core.rs | 0 backend/src/lib.rs | 13 ------- backend/src/scheduler.rs | 76 ++++++++++++++++++++++++++++++++++++++++ src/main.rs | 8 +---- 4 files changed, 77 insertions(+), 20 deletions(-) create mode 100644 backend/src/core.rs create mode 100644 backend/src/scheduler.rs diff --git a/backend/src/core.rs b/backend/src/core.rs new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/lib.rs b/backend/src/lib.rs index b93cf3f..8b13789 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -1,14 +1 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right -} -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} diff --git a/backend/src/scheduler.rs b/backend/src/scheduler.rs new file mode 100644 index 0000000..aa13b87 --- /dev/null +++ b/backend/src/scheduler.rs @@ -0,0 +1,76 @@ +use std::{cmp::Ordering, collections::BinaryHeap}; + +#[derive(Copy, Debug, Clone)] +pub enum EventType { + Pause, + Stop, + Reset, + PIBusWriteComplete, + PIDMAComplete, + SIDMAComplete, +} + +#[derive(Copy, Debug, Clone)] +pub struct Event { + time: u64, + event_type: EventType, +} + +impl Eq for Event {} + +impl PartialEq for Event { + fn eq(&self, other: &Self) -> bool { + self.time == other.time + && matches!( + (self.event_type, other.event_type), + (EventType::Pause, EventType::Pause) + | (EventType::Stop, EventType::Stop) + | (EventType::Reset, EventType::Reset) + | (EventType::PIBusWriteComplete, EventType::PIBusWriteComplete) + | (EventType::PIDMAComplete, EventType::PIDMAComplete) + | (EventType::SIDMAComplete, EventType::SIDMAComplete) + ) + } +} + +impl Ord for Event { + fn cmp(&self, other: &Self) -> Ordering { + self.time.cmp(&other.time).reverse() + } +} + +impl PartialOrd for Event { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +pub struct Scheduler { + events: BinaryHeap, + ticks: u64, +} + +impl Scheduler { + pub fn new() -> Self { + Self { + events: BinaryHeap::new(), + ticks: 0, + } + } + + pub fn enqueue_relative(&mut self, time: u64, event_type: EventType) { + self.enqueue_absolute(time + self.ticks, event_type) + } + + pub fn enqueue_absolute(&mut self, time: u64, event_type: EventType) { + self.events.push(Event { time, event_type }) + } + + pub fn pop(&mut self) -> Option { + self.events.pop() + } + + pub fn tick(&mut self, time: u64) { + self.ticks += time + } +} diff --git a/src/main.rs b/src/main.rs index b601939..f328e4d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1 @@ -#![allow(unused_imports)] - -use backend::add; - -fn main() { - println!("Hello, world!"); -} +fn main() {}