mirror of
https://github.com/EFForg/rayhunter.git
synced 2026-04-28 08:29:58 -07:00
Rayhunter uses a mixture of spawn and spawn_blocking, then also does some blocking operations inside of async code. Move everything to async. This allows us to use the single-threaded runtime. Now the binary is 100kB smaller, and the memory usage also improved by ~100kB on tplink.
57 lines
1.5 KiB
Rust
57 lines
1.5 KiB
Rust
use crate::config;
|
|
use crate::display::DisplayState;
|
|
use crate::display::generic_framebuffer::{self, Dimensions, GenericFramebuffer};
|
|
/// Display support for the Wingtech CT2MHS01 hotspot.
|
|
///
|
|
/// Tested on (from `/etc/wt_version`):
|
|
/// WT_INNER_VERSION=SW_Q89323AA1_V057_M10_CRICKET_USR_MP
|
|
/// WT_PRODUCTION_VERSION=CT2MHS01_0.04.55
|
|
/// WT_HARDWARE_VERSION=89323_1_20
|
|
use async_trait::async_trait;
|
|
|
|
use tokio::sync::mpsc::Receiver;
|
|
use tokio::sync::oneshot;
|
|
use tokio_util::task::TaskTracker;
|
|
|
|
const FB_PATH: &str = "/dev/fb0";
|
|
|
|
#[derive(Copy, Clone, Default)]
|
|
struct Framebuffer;
|
|
|
|
#[async_trait]
|
|
impl GenericFramebuffer for Framebuffer {
|
|
fn dimensions(&self) -> Dimensions {
|
|
Dimensions {
|
|
height: 128,
|
|
width: 160,
|
|
}
|
|
}
|
|
|
|
async fn write_buffer(&mut self, buffer: Vec<(u8, u8, u8)>) {
|
|
let mut raw_buffer = Vec::new();
|
|
for (r, g, b) in buffer {
|
|
let mut rgb565: u16 = (r as u16 & 0b11111000) << 8;
|
|
rgb565 |= (g as u16 & 0b11111100) << 3;
|
|
rgb565 |= (b as u16) >> 3;
|
|
raw_buffer.extend(rgb565.to_le_bytes());
|
|
}
|
|
|
|
tokio::fs::write(FB_PATH, &raw_buffer).await.unwrap();
|
|
}
|
|
}
|
|
|
|
pub fn update_ui(
|
|
task_tracker: &TaskTracker,
|
|
config: &config::Config,
|
|
ui_shutdown_rx: oneshot::Receiver<()>,
|
|
ui_update_rx: Receiver<DisplayState>,
|
|
) {
|
|
generic_framebuffer::update_ui(
|
|
task_tracker,
|
|
config,
|
|
Framebuffer,
|
|
ui_shutdown_rx,
|
|
ui_update_rx,
|
|
)
|
|
}
|