diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 8a8bdcf..4090584 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -11,7 +11,7 @@ // see https://code.visualstudio.com/docs/editor/tasks#_can-a-background-task-be-used-as-a-prelaunchtask-in-launchjson "isBackground": true, // change this to your `beforeDevCommand`: - "command": "yarn", + "command": "pnpm", "args": [ "dev" ] @@ -20,7 +20,7 @@ "label": "ui:build", "type": "shell", // change this to your `beforeBuildCommand`: - "command": "yarn", + "command": "pnpm", "args": [ "build" ] diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 687029a..504afa4 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -770,7 +770,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -1916,7 +1916,7 @@ dependencies = [ "base64 0.21.0", "indexmap", "line-wrap", - "quick-xml 0.28.1", + "quick-xml 0.28.2", "serde", "time", ] @@ -2006,9 +2006,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.28.1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c1a97b1bc42b1d550bfb48d4262153fe400a12bab1511821736f7eac76d7e2" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" dependencies = [ "memchr", ] @@ -2272,14 +2272,14 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] name = "serde_json" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d721eca97ac802aa7777b701877c8004d950fc142651367300d21c1cc0194744" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa 1.0.6", "ryu", @@ -2294,7 +2294,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -2514,9 +2514,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.14" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf316d5356ed6847742d036f8a39c3b8435cac10bd528a4bd461928a6ab34d5" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -2859,7 +2859,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] @@ -2941,7 +2941,7 @@ checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" dependencies = [ "proc-macro2", "quote", - "syn 2.0.14", + "syn 2.0.15", ] [[package]] diff --git a/src-tauri/src/ambient_light/publisher.rs b/src-tauri/src/ambient_light/publisher.rs index 2b1ff03..c443764 100644 --- a/src-tauri/src/ambient_light/publisher.rs +++ b/src-tauri/src/ambient_light/publisher.rs @@ -23,8 +23,6 @@ pub struct LedColorsPublisher { sorted_colors_tx: Arc>>>, colors_rx: Arc>>>, colors_tx: Arc>>>, - display_colors_rx: Arc)>>>, - display_colors_tx: Arc)>>>, inner_tasks_version: Arc>, } @@ -35,7 +33,6 @@ impl LedColorsPublisher { let (sorted_tx, sorted_rx) = watch::channel(Vec::new()); let (tx, rx) = watch::channel(Vec::new()); - let (display_colors_tx, display_colors_rx) = broadcast::channel(8); LED_COLORS_PUBLISHER_GLOBAL .get_or_init(|| async { @@ -44,8 +41,6 @@ impl LedColorsPublisher { sorted_colors_tx: Arc::new(RwLock::new(sorted_tx)), colors_rx: Arc::new(RwLock::new(rx)), colors_tx: Arc::new(RwLock::new(tx)), - display_colors_rx: Arc::new(RwLock::new(display_colors_rx)), - display_colors_tx: Arc::new(RwLock::new(display_colors_tx)), inner_tasks_version: Arc::new(RwLock::new(0)), } }) @@ -56,13 +51,11 @@ impl LedColorsPublisher { &self, display_id: u32, sample_points: Vec>, + display_colors_tx: broadcast::Sender<(u32, Vec)>, ) { - let display_colors_tx = self.display_colors_tx.clone(); let internal_tasks_version = self.inner_tasks_version.clone(); tokio::spawn(async move { - let display_colors_tx = display_colors_tx.read().await.clone(); - let colors = screenshot_manager::get_display_colors(display_id, &sample_points); if let Err(err) = colors { @@ -78,7 +71,9 @@ impl LedColorsPublisher { interval.tick().await; tokio::time::sleep(Duration::from_millis(1)).await; - if internal_tasks_version.read().await.clone() != init_version { + let version = internal_tasks_version.read().await.clone(); + + if version != init_version { log::info!( "inner task version changed, stop. {} != {}", internal_tasks_version.read().await.clone(), @@ -121,14 +116,13 @@ impl LedColorsPublisher { }); } - fn start_all_colors_worker(&self, display_ids: Vec, mappers: Vec) { + fn start_all_colors_worker(&self, display_ids: Vec, mappers: Vec, mut display_colors_rx: broadcast::Receiver<(u32, Vec)>) { let sorted_colors_tx = self.sorted_colors_tx.clone(); let colors_tx = self.colors_tx.clone(); - let display_colors_rx = self.display_colors_rx.clone(); + log::debug!("start all_colors_worker"); tokio::spawn(async move { for _ in 0..10 { - let mut rx = display_colors_rx.read().await.resubscribe(); let sorted_colors_tx = sorted_colors_tx.write().await; let colors_tx = colors_tx.write().await; @@ -136,15 +130,14 @@ impl LedColorsPublisher { let mut all_colors: Vec>> = vec![None; display_ids.len()]; let mut start: tokio::time::Instant = tokio::time::Instant::now(); - log::info!("start all_colors_worker"); + log::debug!("start all_colors_worker task"); loop { - // log::info!("display_colors_rx changed"); - let color_info = rx.recv().await; + let color_info = display_colors_rx.recv().await; if let Err(err) = color_info { match err { broadcast::error::RecvError::Closed => { - break; + return; } broadcast::error::RecvError::Lagged(_) => { warn!("display_colors_rx lagged"); @@ -200,9 +193,6 @@ impl LedColorsPublisher { tokio::spawn(async move { let publisher = Self::global().await; - let mut inner_tasks_version = inner_tasks_version.write().await; - *inner_tasks_version = inner_tasks_version.overflowing_add(1).0; - let config_manager = ConfigManager::global().await; let mut config_receiver = config_manager.clone_config_update_receiver(); @@ -221,113 +211,34 @@ impl LedColorsPublisher { let configs = configs.unwrap(); + + let mut inner_tasks_version = inner_tasks_version.write().await; + *inner_tasks_version = inner_tasks_version.overflowing_add(1).0; + drop(inner_tasks_version); + + + let (display_colors_tx, display_colors_rx) = broadcast::channel::<(u32, Vec)>(8); + for sample_point_group in configs.sample_point_groups.clone() { let display_id = sample_point_group.display_id; let sample_points = sample_point_group.points; - publisher.start_one_display_colors_fetcher(display_id, sample_points); + publisher.start_one_display_colors_fetcher( + display_id, + sample_points, + display_colors_tx.clone(), + ); } let display_ids = configs.sample_point_groups; publisher.start_all_colors_worker( display_ids.iter().map(|c| c.display_id).collect(), configs.mappers, + display_colors_rx, ); - - break; } }); - // tokio::spawn(async move { - // loop { - // let sorted_colors_tx = sorted_colors_tx.write().await; - // let colors_tx = colors_tx.write().await; - // let screenshot_manager = ScreenshotManager::global().await; - - // let config_manager = ConfigManager::global().await; - // let config_receiver = config_manager.clone_config_update_receiver(); - // let configs = config_receiver.borrow().clone(); - // let configs = Self::get_colors_configs(&configs).await; - - // if let Err(err) = configs { - // warn!("Failed to get configs: {}", err); - // sleep(Duration::from_millis(100)).await; - // continue; - // } - - // let configs = configs.unwrap(); - - // let mut merged_screenshot_receiver = - // screenshot_manager.clone_merged_screenshot_rx().await; - - // let mut screenshots = HashMap::new(); - - // // let mut start = tokio::time::Instant::now(); - - // loop { - // let screenshot = merged_screenshot_receiver.recv().await; - - // if let Err(err) = screenshot { - // match err { - // tokio::sync::broadcast::error::RecvError::Closed => { - // warn!("closed"); - // continue; - // } - // tokio::sync::broadcast::error::RecvError::Lagged(_) => { - // warn!("lagged"); - // continue; - // } - // } - // } - - // let screenshot = screenshot.unwrap(); - // // log::info!("got screenshot: {:?}", screenshot.display_id); - - // screenshots.insert(screenshot.display_id, screenshot); - - // if screenshots.len() == configs.sample_point_groups.len() { - // // log::info!("{}", start.elapsed().as_millis().to_string()); - // { - // let screenshots = configs - // .sample_point_groups - // .iter() - // .map(|strip| screenshots.get(&strip.display_id).unwrap()) - // .collect::>(); - - // let colors = screenshot_manager - // .get_all_colors(&configs.sample_point_groups, &screenshots) - // .await; - - // let sorted_colors = - // ScreenshotManager::get_sorted_colors(&colors, &configs.mappers) - // .await; - - // match colors_tx.send(colors) { - // Ok(_) => { - // // log::info!("colors updated"); - // } - // Err(_) => { - // warn!("colors update failed"); - // } - // } - - // match sorted_colors_tx.send(sorted_colors) { - // Ok(_) => { - // // log::info!("colors updated"); - // } - // Err(_) => { - // warn!("colors update failed"); - // } - // } - // } - - // // screenshots.clear(); - // // start = tokio::time::Instant::now(); - // } - // } - // } - // }); - let rx = self.sorted_colors_rx.clone(); tokio::spawn(async move { let mut rx = rx.read().await.clone(); @@ -380,6 +291,7 @@ impl LedColorsPublisher { let mut colors_configs = Vec::new(); let mut merged_screenshot_receiver = screenshot_manager.clone_merged_screenshot_rx().await; + merged_screenshot_receiver.resubscribe(); let mut screenshots = HashMap::new(); @@ -431,10 +343,11 @@ impl LedColorsPublisher { colors_configs.push(colors_config); } + log::debug!("got all colors configs: {:?}", colors_configs.len()); + return Ok(AllColorConfig { sample_point_groups: colors_configs, mappers, - // screenshot_receivers: local_rx_list, }); } } diff --git a/src-tauri/src/screenshot_manager.rs b/src-tauri/src/screenshot_manager.rs index bb9d217..45ee23f 100644 --- a/src-tauri/src/screenshot_manager.rs +++ b/src-tauri/src/screenshot_manager.rs @@ -76,6 +76,15 @@ pub fn get_display_colors( height: (end_y - start_y + 1) as f64, }; + // log::info!( + // "origin: {:?}, size: {:?}, start_x: {}, start_y: {}, bounds: {:?}", + // origin, + // size, + // start_x, + // start_y, + // cg_display.bounds().size + // ); + let cg_image = CGDisplay::screenshot( CGRect::new(&origin, &size), kCGWindowListOptionOnScreenOnly, @@ -150,7 +159,7 @@ impl ScreenshotManager { warn!("take_screenshot_loop: {}", screenshot.err().unwrap()); return; } - let mut interval = time::interval(Duration::from_millis(3300)); + let mut interval = time::interval(Duration::from_millis(1000)); let mut start = tokio::time::Instant::now(); let screenshot = screenshot.unwrap(); @@ -189,7 +198,9 @@ impl ScreenshotManager { let screenshot = take_screenshot(display_id, scale_factor); if let Ok(screenshot) = screenshot { match merged_screenshot_tx.send(screenshot.clone()) { - Ok(_) => {} + Ok(_) => { + log::info!("take_screenshot_loop: merged_screenshot_tx.send success. display#{}", display_id); + } Err(err) => { // warn!("take_screenshot_loop: merged_screenshot_tx.send failed. display#{}. err: {}", display_id, err); } @@ -201,23 +212,6 @@ impl ScreenshotManager { } } - pub async fn get_all_colors( - &self, - configs: &Vec, - screenshots: &Vec<&Screenshot>, - ) -> Vec { - let mut all_colors = vec![]; - - for (index, screenshot) in screenshots.iter().enumerate() { - let config = &configs[index]; - let mut colors = screenshot.get_colors_by_sample_points(&config.points).await; - - all_colors.append(&mut colors); - } - - all_colors - } - pub fn get_sorted_colors(colors: &Vec, mappers: &Vec) -> Vec { let total_leds = mappers .iter()