Compare commits
8 Commits
feature/jo
...
jojo/impro
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b76902f63 | ||
|
|
9887ac97ac | ||
|
|
baee4ab135 | ||
|
|
1ace2e5730 | ||
|
|
0ffc57ae78 | ||
|
|
439c76c196 | ||
|
|
5bd7626843 | ||
| 30f374bfc4 |
26
src/flutr.rs
Normal file
26
src/flutr.rs
Normal 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
1
src/lib.rs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pub mod flutr;
|
||||||
30
src/main.rs
30
src/main.rs
@@ -1,26 +1,39 @@
|
|||||||
use address::Host;
|
use address::Host;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use image::{ImageReader, Rgb};
|
use image::ImageReader;
|
||||||
|
|
||||||
use clap::Parser;
|
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)]
|
#[derive(Parser, Debug)]
|
||||||
#[command(version, about, long_about = None)]
|
#[command(version, about, long_about = None)]
|
||||||
struct Args {
|
struct Args {
|
||||||
image_path: PathBuf,
|
image_path: PathBuf,
|
||||||
addr: Host,
|
host: Host,
|
||||||
|
|
||||||
#[arg(short, long, default_value_t = 1234)]
|
#[arg(default_value_t = 1234)]
|
||||||
port: u16,
|
port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Args::parse();
|
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 {
|
let image = match image_result {
|
||||||
Ok(img) => img,
|
Ok(img) => img,
|
||||||
@@ -29,12 +42,11 @@ fn main() {
|
|||||||
|
|
||||||
let rgb_image = image.into_rgb8();
|
let rgb_image = image.into_rgb8();
|
||||||
for pixel in rgb_image.enumerate_pixels() {
|
for pixel in rgb_image.enumerate_pixels() {
|
||||||
write_pixel(pixel);
|
result.add(pixel);
|
||||||
}
|
}
|
||||||
//println!("{:?}", &image);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_pixel(pixel: Pixel) {}
|
result
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_image(path: &PathBuf) -> Result<image::DynamicImage, image::error::ImageError> {
|
fn parse_image(path: &PathBuf) -> Result<image::DynamicImage, image::error::ImageError> {
|
||||||
ImageReader::open(path)?.with_guessed_format()?.decode()
|
ImageReader::open(path)?.with_guessed_format()?.decode()
|
||||||
|
|||||||
24
src/pixelmsgs.rs
Normal file
24
src/pixelmsgs.rs
Normal 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
37
tests/integration.rs
Normal 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}, ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user