4 个版本 (2 个重大更新)
使用旧的 Rust 2015
0.3.0 | 2017年8月10日 |
---|---|
0.2.0 | 2017年3月15日 |
0.1.1 | 2016年7月28日 |
0.1.0 | 2016年7月28日 |
在 #pixel 中排名第 90
每月下载量 22 次
13KB
153 行
___ _ __ ___ _ __ ___
/ _ \| '_ \ / __|____| '__/ __|
| (_) | |_) | (_|_____| | \__ \
\___/| .__/ \___| |_| |___/
|_|
OPC-RS
Rust 实现的 Open Pixel 控制协议
Open Pixel 控制
Open Pixel Control 是一种用于控制 RGB 灯光阵列(如 Total Control Lighting (http://www.coolneon.com/)和 Fadecandy 设备(《https://github.com/scanlime/fadecandy》)的协议。
文档
用法
客户端
extern crate opc;
extern crate tokio_core;
extern crate tokio_io;
extern crate futures;
extern crate rand;
use opc::{OpcCodec, Message, Command};
use futures::{stream, Future, Sink, future};
use tokio_io::AsyncRead;
use tokio_core::net::TcpStream;
use tokio_core::reactor::Core;
use std::io;
use std::time::Duration;
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let remote_addr = "192.168.1.230:7890".parse().unwrap();
let work = TcpStream::connect(&remote_addr, &handle)
.and_then(|socket| {
let transport = socket.framed(OpcCodec);
let messages = stream::unfold(vec![[0,0,0]; 1000], |mut pixels| {
for pixel in pixels.iter_mut() {
for c in 0..2 {
pixel[c] = rand::random();
}
};
let pixel_msg = Message {
channel: 0,
command: Command::SetPixelColors { pixels: pixels.clone() }
};
std::thread::sleep(Duration::from_millis(100));
Some(future::ok::<_,io::Error>((pixel_msg, pixels)))
});
transport.send_all(messages)
});
core.run(work).unwrap();
}
服务器
extern crate opc;
extern crate futures;
extern crate tokio_core;
extern crate tokio_io;
use opc::OpcCodec;
use futures::{Future, Stream};
use tokio_io::AsyncRead;
use tokio_core::net::TcpListener;
use tokio_core::reactor::Core;
fn main() {
let mut core = Core::new().unwrap();
let handle = core.handle();
let remote_addr = "127.0.0.1:7890".parse().unwrap();
let listener = TcpListener::bind(&remote_addr, &handle).unwrap();
// Accept all incoming sockets
let server = listener.incoming().for_each(move |(socket, _)| {
// `OpcCodec` handles encoding / decoding frames.
let transport = socket.framed(OpcCodec);
let process_connection = transport.for_each(|message| {
println!("GOT: {:?}", message);
Ok(())
});
// Spawn a new task dedicated to processing the connection
handle.spawn(process_connection.map_err(|_| ()));
Ok(())
});
// Open listener
core.run(server).unwrap();
}
依赖
~610KB
~11K SLoC