Started work on OTA

This commit is contained in:
Dreaded_X 2023-09-02 06:03:33 +02:00
parent 609d0f3049
commit 0f1e181b92
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
3 changed files with 42 additions and 11 deletions

2
Cargo.lock generated
View File

@ -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",
] ]

View File

@ -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]

View File

@ -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);
}
} }
} }
} }