feat: 支持将校准的色彩发送到 MQTT 中。
This commit is contained in:
parent
81d666557b
commit
1c08c17fd4
@ -33,6 +33,16 @@ pub struct ColorCalibration {
|
|||||||
b: f32,
|
b: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ColorCalibration {
|
||||||
|
pub fn to_bytes(&self) -> [u8; 3] {
|
||||||
|
[
|
||||||
|
(self.r * 255.0) as u8,
|
||||||
|
(self.g * 255.0) as u8,
|
||||||
|
(self.b * 255.0) as u8,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||||||
pub struct LedStripConfigGroup {
|
pub struct LedStripConfigGroup {
|
||||||
pub strips: Vec<LedStripConfig>,
|
pub strips: Vec<LedStripConfig>,
|
||||||
|
@ -181,6 +181,12 @@ async fn set_color_calibration(calibration: ColorCalibration) -> Result<(), Stri
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
async fn read_config() -> ambient_light::LedStripConfigGroup {
|
||||||
|
let config_manager = ambient_light::ConfigManager::global().await;
|
||||||
|
config_manager.configs().await
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
@ -204,6 +210,7 @@ async fn main() {
|
|||||||
move_strip_part,
|
move_strip_part,
|
||||||
reverse_led_strip_part,
|
reverse_led_strip_part,
|
||||||
set_color_calibration,
|
set_color_calibration,
|
||||||
|
read_config,
|
||||||
])
|
])
|
||||||
.register_uri_scheme_protocol("ambient-light", move |_app, request| {
|
.register_uri_scheme_protocol("ambient-light", move |_app, request| {
|
||||||
let response = ResponseBuilder::new().header("Access-Control-Allow-Origin", "*");
|
let response = ResponseBuilder::new().header("Access-Control-Allow-Origin", "*");
|
||||||
|
@ -5,10 +5,13 @@ use std::time::Duration;
|
|||||||
use time::{format_description, OffsetDateTime};
|
use time::{format_description, OffsetDateTime};
|
||||||
use tokio::{sync::OnceCell, task};
|
use tokio::{sync::OnceCell, task};
|
||||||
|
|
||||||
|
use crate::ambient_light::{ColorCalibration, ConfigManager};
|
||||||
|
|
||||||
const DISPLAY_TOPIC: &'static str = "display-ambient-light/display";
|
const DISPLAY_TOPIC: &'static str = "display-ambient-light/display";
|
||||||
const DESKTOP_TOPIC: &'static str = "display-ambient-light/desktop";
|
const DESKTOP_TOPIC: &'static str = "display-ambient-light/desktop";
|
||||||
const DISPLAY_BRIGHTNESS_TOPIC: &'static str = "display-ambient-light/board/brightness";
|
const DISPLAY_BRIGHTNESS_TOPIC: &'static str = "display-ambient-light/board/brightness";
|
||||||
const BOARD_SEND_CMD: &'static str = "display-ambient-light/board/cmd";
|
const BOARD_SEND_CMD: &'static str = "display-ambient-light/board/cmd";
|
||||||
|
const COLOR_CALIBRATION: &'static str = "display-ambient-light/desktop/color-calibration";
|
||||||
|
|
||||||
pub struct MqttRpc {
|
pub struct MqttRpc {
|
||||||
client: mqtt::AsyncClient,
|
client: mqtt::AsyncClient,
|
||||||
@ -165,6 +168,7 @@ impl MqttRpc {
|
|||||||
// self.subscribe_board()?;
|
// self.subscribe_board()?;
|
||||||
// self.subscribe_display()?;
|
// self.subscribe_display()?;
|
||||||
self.broadcast_desktop_online();
|
self.broadcast_desktop_online();
|
||||||
|
Self::publish_color_calibration_worker();
|
||||||
anyhow::Ok(())
|
anyhow::Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +186,31 @@ impl MqttRpc {
|
|||||||
.map_err(|err| anyhow::anyhow!("subscribe board failed. {:?}", err))
|
.map_err(|err| anyhow::anyhow!("subscribe board failed. {:?}", err))
|
||||||
.map(|_| ())
|
.map(|_| ())
|
||||||
}
|
}
|
||||||
|
fn publish_color_calibration_worker() {
|
||||||
|
tokio::spawn(async move {
|
||||||
|
let mqtt = Self::global().await;
|
||||||
|
let config_manager = ConfigManager::global().await;
|
||||||
|
let mut config_receiver = config_manager.clone_config_update_receiver();
|
||||||
|
|
||||||
|
let config = config_manager.configs().await;
|
||||||
|
if let Err(err) = mqtt
|
||||||
|
.publish_color_calibration(config.color_calibration)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
warn!("can not publish color calibration. {}", err);
|
||||||
|
}
|
||||||
|
|
||||||
|
while config_receiver.changed().await.is_ok() {
|
||||||
|
let config = config_receiver.borrow().clone();
|
||||||
|
if let Err(err) = mqtt
|
||||||
|
.publish_color_calibration(config.color_calibration)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
warn!("can not publish color calibration. {}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fn broadcast_desktop_online(&self) {
|
fn broadcast_desktop_online(&self) {
|
||||||
let client = self.client.to_owned();
|
let client = self.client.to_owned();
|
||||||
@ -238,4 +267,15 @@ impl MqttRpc {
|
|||||||
.await
|
.await
|
||||||
.map_err(|error| anyhow::anyhow!("mqtt publish failed. {}", error))
|
.map_err(|error| anyhow::anyhow!("mqtt publish failed. {}", error))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn publish_color_calibration(&self, payload: ColorCalibration) -> anyhow::Result<()> {
|
||||||
|
self.client
|
||||||
|
.publish(mqtt::Message::new(
|
||||||
|
COLOR_CALIBRATION,
|
||||||
|
payload.to_bytes(),
|
||||||
|
mqtt::QOS_1,
|
||||||
|
))
|
||||||
|
.await
|
||||||
|
.map_err(|error| anyhow::anyhow!("mqtt publish color calibration failed. {}", error))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
15
src/App.tsx
15
src/App.tsx
@ -1,8 +1,23 @@
|
|||||||
import { Routes, Route } from '@solidjs/router';
|
import { Routes, Route } from '@solidjs/router';
|
||||||
import { LedStripConfiguration } from './components/led-strip-configuration/led-strip-configuration';
|
import { LedStripConfiguration } from './components/led-strip-configuration/led-strip-configuration';
|
||||||
import { WhiteBalance } from './components/white-balance/white-balance';
|
import { WhiteBalance } from './components/white-balance/white-balance';
|
||||||
|
import { createEffect } from 'solid-js';
|
||||||
|
import { invoke } from '@tauri-apps/api';
|
||||||
|
import { setLedStripStore } from './stores/led-strip.store';
|
||||||
|
import { LedStripConfigContainer } from './models/led-strip-config';
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
createEffect(() => {
|
||||||
|
invoke<LedStripConfigContainer>('read_config').then((config) => {
|
||||||
|
console.log('read config', config);
|
||||||
|
setLedStripStore({
|
||||||
|
strips: config.strips,
|
||||||
|
mappers: config.mappers,
|
||||||
|
colorCalibration: config.color_calibration,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
|
Loading…
Reference in New Issue
Block a user