From e28d4fdb22581126715de137a6bd73baad0c925b Mon Sep 17 00:00:00 2001 From: Nahuel Lofeudo Date: Sat, 18 Apr 2026 07:41:32 +0100 Subject: [PATCH] Adding more stuff in --- Cargo.toml | 11 +++++------ src/gtfs/loader.rs | 40 +++++++++++++++++++++++++--------------- src/gtfs/mod.rs | 7 ++----- src/main.rs | 23 ++++++++++++++--------- src/renderer/mod.rs | 36 ++++++++++++++++++++++++++++++++++++ src/renderer/structs.rs | 13 +++++++++++++ 6 files changed, 95 insertions(+), 35 deletions(-) create mode 100644 src/renderer/mod.rs create mode 100644 src/renderer/structs.rs diff --git a/Cargo.toml b/Cargo.toml index 1ff9fbf..f505392 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,11 @@ edition = "2024" host = "x86_64-unknown-linux-gnu" [dependencies] -sdl3 = "0.17.*" -sdl3-ttf-sys = "0.6.*" -serde = "*" -gtfs-structures = "0.47.*" -zip = "8.3.*" -csv = "1.4.*" +sdl3 = {version = "0.17", features = ["ttf"]} +serde = "1.0" +gtfs-structures = "0.47" +zip = "8.3" +csv = "1.4" [profile.dev] opt-level = 0 diff --git a/src/gtfs/loader.rs b/src/gtfs/loader.rs index 84c99ee..4632fd0 100644 --- a/src/gtfs/loader.rs +++ b/src/gtfs/loader.rs @@ -1,9 +1,16 @@ -use std::{collections::{HashMap, HashSet}, fs::File, hash::Hash}; use gtfs_structures::{Calendar, CalendarDate, RawStopTime, RawTrip, Route, Stop}; use serde::de::DeserializeOwned; +use std::{ + collections::{HashMap, HashSet}, + fs::File, + hash::Hash, +}; use zip::ZipArchive; -use crate::gtfs::{structs::Gtfs, utils::{route_ids_from_numbers, stop_ids_from_codes}}; +use crate::gtfs::{ + structs::Gtfs, + utils::{route_ids_from_numbers, stop_ids_from_codes}, +}; trait Filter { fn accept(&self, v: &T) -> bool; @@ -80,11 +87,11 @@ fn load_map( index: IndexFn, filter: FilterT, ) where - K: Eq + Hash, - V: DeserializeOwned, - IndexFn: Fn(&V) -> K, - FilterT: Filter, - { + K: Eq + Hash, + V: DeserializeOwned, + IndexFn: Fn(&V) -> K, + FilterT: Filter, +{ let file_reader = zip_reader.by_name(table_name).unwrap(); let mut rdr = csv::Reader::from_reader(file_reader); @@ -110,11 +117,11 @@ fn load_vector_map<'a, K, V, IndexFn, FilterT>( table_name: &str, index: IndexFn, filter: FilterT, -) where - K: Eq + Hash, - V: DeserializeOwned, - IndexFn: Fn(&V) -> K, - FilterT: Filter, +) where + K: Eq + Hash, + V: DeserializeOwned, + IndexFn: Fn(&V) -> K, + FilterT: Filter, { let file_reader = zip_reader.by_name(table_name).unwrap(); let mut rdr = csv::Reader::from_reader(file_reader); @@ -128,9 +135,12 @@ fn load_vector_map<'a, K, V, IndexFn, FilterT>( } } - -pub fn load_gtfs(gtfs: &mut Gtfs, zip_reader: &mut ZipArchive, route_numbers: &HashSet, stop_codes: &HashSet) { - +pub fn load_gtfs( + gtfs: &mut Gtfs, + zip_reader: &mut ZipArchive, + route_numbers: &HashSet, + stop_codes: &HashSet, +) { // Agencies load_vector(&mut gtfs.agencies, zip_reader, "agency.txt"); diff --git a/src/gtfs/mod.rs b/src/gtfs/mod.rs index 378584a..4fb75e0 100644 --- a/src/gtfs/mod.rs +++ b/src/gtfs/mod.rs @@ -2,20 +2,17 @@ mod loader; mod utils; pub mod structs; use std::{ - collections::{HashMap, HashSet}, + collections::{HashMap}, fs::File, }; use crate::gtfs::{loader::load_gtfs, structs::{Arrival, Gtfs, Preferences}}; - -pub fn get_next_stops(gtfs: &Gtfs) -> Vec { +pub fn _get_next_stops(_gtfs: &Gtfs) -> Vec { let arrivals = Vec::::new(); return arrivals; } - - /// Load a GTFS structure from a zip file pub fn load(src_file: &str, prefs: &Preferences) -> Gtfs { // Open zip file diff --git a/src/main.rs b/src/main.rs index 5e73967..a8e6ed4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,23 +1,28 @@ mod gtfs; -use std::{collections::HashSet, time::Instant}; +mod renderer; +use std::{collections::HashSet}; -use crate::gtfs::structs; const SRC_FILE: &str = "/home/nahuel/Downloads/GTFS_Realtime.zip"; fn main() { - let gtfs_prefs = structs::Preferences { + let gtfs_prefs = gtfs::structs::Preferences { route_numbers: HashSet::from([String::from("15A"), String::from("F1"), String::from("F2"), String::from("F3")]), stop_codes: HashSet::from([String::from("1117")]) }; + let screen_prefs = renderer::structs::Prefs { + font_path: String::from("todo!()"), + screen_width: 1920, + screen_height: 720, + }; + // Init GTFS static info - for _ in 0..1000 { - let start_gtfs = Instant::now(); - println!("Loading GTFS data..."); - let gtfs = gtfs::load(SRC_FILE, >fs_prefs); - println!("Loaded records in {:#?}. Data size: {:#?}", start_gtfs.elapsed(), ::std::mem::size_of_val(>fs)) - } + println!("Loading GTFS data..."); + let _gtfs = gtfs::load(SRC_FILE, >fs_prefs); + + // Init screen + let _screen = renderer::init(&screen_prefs); } diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs new file mode 100644 index 0000000..494b5cc --- /dev/null +++ b/src/renderer/mod.rs @@ -0,0 +1,36 @@ + +pub mod structs; +use sdl3::{pixels::Color}; +use structs::{Prefs, Screen}; + +/// Initialize video, allocate buffers and load fonts +/// Based on https://github.com/vhspace/sdl3-rs/blob/master/examples/ttf-demo.rs + +pub fn init(prefs: &Prefs) -> &mut structs::Screen { + // Initialize the screen + let sdl_context = sdl3::init().unwrap(); + let video_subsys = sdl_context.video().unwrap(); + + let window = video_subsys + .window("Dublin Bus", prefs.screen_width, prefs.screen_height) + .position_centered() + .borderless() + //.fullscreen() + .build().unwrap(); + + // Load font + let ttf_context = sdl3::ttf::init().unwrap(); + let mut font = ttf_context.load_font(&prefs.font_path, 128.0).unwrap(); + + // Clear screen + let mut canvas = window.into_canvas(); + canvas.set_draw_color(Color::BLACK); + canvas.clear(); + canvas.present(); + + let screen = Screen { + canvas: &canvas, + font: &font, + }; + return &mut &screen; +} \ No newline at end of file diff --git a/src/renderer/structs.rs b/src/renderer/structs.rs new file mode 100644 index 0000000..dc36ac2 --- /dev/null +++ b/src/renderer/structs.rs @@ -0,0 +1,13 @@ +use sdl3::{render::Canvas, ttf::Font, video::Window}; + + +pub struct Prefs { + pub font_path: String, + pub screen_width: u32, + pub screen_height: u32, +} + +pub struct Screen<'a> { + pub canvas: &'a Canvas, + pub font: &'a Font<'a>, +} \ No newline at end of file