8 Commits

Author SHA1 Message Date
Johannes Wendel
8b76902f63 Current state 2025-01-20 20:04:11 +01:00
Johannes Wendel
9887ac97ac Add integration test 2024-12-30 20:04:16 +01:00
Johannes Wendel
baee4ab135 Remove unused file 2024-12-30 19:35:18 +01:00
Johannes Wendel
1ace2e5730 Make cli-parameter work 2024-12-30 19:20:25 +01:00
Jonas Zeunert
0ffc57ae78 Switch to binary msg 2024-12-30 16:20:19 +01:00
Jonas Zeunert
439c76c196 First working version 2024-12-30 15:45:22 +01:00
Jonas Zeunert
5bd7626843 First naive implementation of tcp server. Not working right now 2024-12-30 15:42:10 +01:00
30f374bfc4 Merge pull request 'Make nix compatible' (#1) from feature/jojo-nix-cmaptibility into master
Reviewed-on: rhetenor/fluter#1
2024-12-30 14:26:35 +01:00
5 changed files with 109 additions and 9 deletions

26
src/flutr.rs Normal file
View File

@@ -0,0 +1,26 @@
use crate::pixelmsgs::PixelMsgs;
use address::Host;
use std::{io::Write, net::TcpStream};
pub struct FlutR {
stream: TcpStream,
msgs: PixelMsgs,
}
impl FlutR {
pub fn new(host: Host, port: u16, msgs: PixelMsgs) -> Result<Self, std::io::Error> {
let stream = TcpStream::connect(format!("{host}:{port}"))?;
Ok(FlutR { stream, msgs })
}
pub fn flut(&mut self) {
for msg in self.msgs.clone() {
let result = self.stream.write(&msg);
match result {
Ok(_) => (),
Err(err) => eprintln!("{err}"),
}
let _ = self.stream.flush();
}
}
}

1
src/lib.rs Normal file
View File

@@ -0,0 +1 @@
pub mod flutr;

View File

@@ -1,26 +1,39 @@
use address::Host;
use std::path::PathBuf;
use image::{ImageReader, Rgb};
use image::ImageReader;
use clap::Parser;
type Pixel<'a> = (u32, u32, &'a Rgb<u8>);
mod pixelmsgs;
use flutr::FlutR;
use pixelmsgs::Add;
use pixelmsgs::PixelMsgs;
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
image_path: PathBuf,
addr: Host,
host: Host,
#[arg(short, long, default_value_t = 1234)]
#[arg(default_value_t = 1234)]
port: u16,
}
fn main() {
let args = Args::parse();
let image_result = parse_image(&args.image_path);
let pixel_msgs = parse_image_to_msgs(&args.image_path);
let mut flutr = FlutR::new(args.host, args.port, pixel_msgs).unwrap();
flutr.flut();
}
fn parse_image_to_msgs(path: &PathBuf) -> PixelMsgs {
let mut result = PixelMsgs::default();
let image_result = parse_image(path);
let image = match image_result {
Ok(img) => img,
@@ -29,12 +42,11 @@ fn main() {
let rgb_image = image.into_rgb8();
for pixel in rgb_image.enumerate_pixels() {
write_pixel(pixel);
}
//println!("{:?}", &image);
result.add(pixel);
}
fn write_pixel(pixel: Pixel) {}
result
}
fn parse_image(path: &PathBuf) -> Result<image::DynamicImage, image::error::ImageError> {
ImageReader::open(path)?.with_guessed_format()?.decode()

24
src/pixelmsgs.rs Normal file
View File

@@ -0,0 +1,24 @@
use image::Rgb;
pub type PixelMsg = [u8; 10];
pub type PixelMsgs = Vec<PixelMsg>;
pub trait Add {
fn add(&mut self, item: (u32, u32, &Rgb<u8>));
}
impl Add for PixelMsgs {
fn add(&mut self, item: (u32, u32, &Rgb<u8>)) {
let pb: &[u8] = &[80, 66];
let x = (item.0 as u16).to_le_bytes();
let y = (item.1 as u16).to_le_bytes();
let color: &Rgb<u8> = item.2;
let r = color.0[0].to_le_bytes();
let g = color.0[1].to_le_bytes();
let b = color.0[2].to_le_bytes();
let msg = [pb, &x, &y, &r, &g, &b, &[0]].concat();
self.push(msg.try_into().unwrap());
}
}

37
tests/integration.rs Normal file
View File

@@ -0,0 +1,37 @@
use std::{
net::TcpListener,
io::Read,
thread,
};
use flutr::FlutR;
fn receive_bytes() -> [u8; 128]{
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
let mut stream = listener.accept().unwrap().0;
let mut buf: [u8; 128] = [0; 128];
stream.read(&mut buf).unwrap();
return buf;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let receive_thread = thread::spawn(move || {return receive_bytes();});
let flutr_server = Flutr::new();
let buf = receive_thread.join();
for x in buf.unwrap() {
print!("{x}, ");
}
}
}