Started work on OTA
This commit is contained in:
parent
609d0f3049
commit
0f1e181b92
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -958,6 +958,7 @@ dependencies = [
|
||||||
"defmt",
|
"defmt",
|
||||||
"hash32",
|
"hash32",
|
||||||
"rustc_version 0.4.0",
|
"rustc_version 0.4.0",
|
||||||
|
"serde",
|
||||||
"spin",
|
"spin",
|
||||||
"stable_deref_trait",
|
"stable_deref_trait",
|
||||||
]
|
]
|
||||||
|
@ -1418,6 +1419,7 @@ dependencies = [
|
||||||
"panic-probe",
|
"panic-probe",
|
||||||
"rand",
|
"rand",
|
||||||
"rust-mqtt",
|
"rust-mqtt",
|
||||||
|
"serde",
|
||||||
"serde-json-core",
|
"serde-json-core",
|
||||||
"static_cell",
|
"static_cell",
|
||||||
]
|
]
|
||||||
|
|
|
@ -53,7 +53,7 @@ cyw43-pio = { git = "https://github.com/embassy-rs/embassy", features = [
|
||||||
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
static_cell = { version = "1.1", features = ["nightly"] }
|
static_cell = { version = "1.1", features = ["nightly"] }
|
||||||
heapless = { version = "0.7.16", features = ["defmt"] }
|
heapless = { version = "0.7.16", features = ["defmt", "serde"] }
|
||||||
embedded-io-async = { version = "0.5", features = ["defmt-03"] }
|
embedded-io-async = { version = "0.5", features = ["defmt-03"] }
|
||||||
crc16 = "0.4"
|
crc16 = "0.4"
|
||||||
dsmr5 = "0.3"
|
dsmr5 = "0.3"
|
||||||
|
@ -68,6 +68,7 @@ rand = { version = "0.8.5", features = [
|
||||||
"std_rng",
|
"std_rng",
|
||||||
], default-features = false }
|
], default-features = false }
|
||||||
serde-json-core = "0.5.1"
|
serde-json-core = "0.5.1"
|
||||||
|
serde = { version = "1.0.188", default-features = false, features = ["derive"] }
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
|
|
48
src/main.rs
48
src/main.rs
|
@ -6,11 +6,11 @@ use core::str::FromStr;
|
||||||
|
|
||||||
use cyw43::PowerManagementMode;
|
use cyw43::PowerManagementMode;
|
||||||
use cyw43_pio::PioSpi;
|
use cyw43_pio::PioSpi;
|
||||||
use defmt::{debug, info, warn, Format};
|
use defmt::{debug, error, info, warn, Format};
|
||||||
use dsmr5::Readout;
|
use dsmr5::Readout;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_futures::{
|
use embassy_futures::{
|
||||||
select::{select, Either},
|
select::{select3, Either3},
|
||||||
yield_now,
|
yield_now,
|
||||||
};
|
};
|
||||||
use embassy_net::{tcp::TcpSocket, Config, IpEndpoint, Stack, StackResources};
|
use embassy_net::{tcp::TcpSocket, Config, IpEndpoint, Stack, StackResources};
|
||||||
|
@ -43,6 +43,7 @@ use rust_mqtt::{
|
||||||
},
|
},
|
||||||
packet::v5::publish_packet::QualityOfService,
|
packet::v5::publish_packet::QualityOfService,
|
||||||
};
|
};
|
||||||
|
use serde::Deserialize;
|
||||||
use static_cell::make_static;
|
use static_cell::make_static;
|
||||||
|
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
|
@ -52,9 +53,9 @@ bind_interrupts!(struct Irqs {
|
||||||
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
|
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
|
||||||
});
|
});
|
||||||
|
|
||||||
#[derive(Format)]
|
#[derive(Format, Deserialize)]
|
||||||
struct Test {
|
struct UpdateMessage<'a> {
|
||||||
counter: u32,
|
url: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[embassy_executor::task]
|
#[embassy_executor::task]
|
||||||
|
@ -281,6 +282,8 @@ async fn main(spawner: Spawner) {
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
client.subscribe_to_topic("pico/test/update").await.unwrap();
|
||||||
|
|
||||||
// Turn LED off when connected
|
// Turn LED off when connected
|
||||||
control.gpio_set(0, false).await;
|
control.gpio_set(0, false).await;
|
||||||
|
|
||||||
|
@ -288,21 +291,46 @@ async fn main(spawner: Spawner) {
|
||||||
let receiver = channel.receiver();
|
let receiver = channel.receiver();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
match select(keep_alive.next(), receiver.receive()).await {
|
match select3(
|
||||||
Either::First(_) => client.send_ping().await.unwrap(),
|
keep_alive.next(),
|
||||||
Either::Second(state) => {
|
receiver.receive(),
|
||||||
|
client.receive_message(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Either3::First(_) => client.send_ping().await.unwrap(),
|
||||||
|
Either3::Second(state) => {
|
||||||
// Blink the LED to show that a readout was received
|
// Blink the LED to show that a readout was received
|
||||||
control.gpio_set(0, true).await;
|
control.gpio_set(0, true).await;
|
||||||
control.gpio_set(0, false).await;
|
control.gpio_set(0, false).await;
|
||||||
|
|
||||||
let msg: Vec<u8, 4096> = serde_json_core::to_vec(&state).unwrap();
|
let msg: Vec<u8, 4096> = serde_json_core::to_vec(&state)
|
||||||
info!("len: {}", msg.len());
|
.expect("The buffer should be large enough to contain all the data");
|
||||||
|
|
||||||
client
|
client
|
||||||
.send_message("pico/test", &msg, QualityOfService::QoS0, false)
|
.send_message("pico/test", &msg, QualityOfService::QoS0, false)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
Either3::Third(message) => {
|
||||||
|
let message = match message {
|
||||||
|
Ok(message) => message,
|
||||||
|
Err(err) => {
|
||||||
|
error!("Failed to receive MQTT message: {}", err);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let message = match serde_json_core::from_slice::<UpdateMessage>(message.1) {
|
||||||
|
Ok((message, _)) => message,
|
||||||
|
Err(_) => {
|
||||||
|
error!("Unable to parse update message");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
info!("{}", message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user