Skip to content

Commit

Permalink
✨ Algorithm adjustments possible
Browse files Browse the repository at this point in the history
  • Loading branch information
mawoka-myblock committed Oct 26, 2024
1 parent e201e2c commit a6bd5c8
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 11 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@
/.embuild
/target
/Cargo.lock
KiCad/*.lck
8 changes: 4 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ fn main() -> Result<()> {
let gitcl = GixBuilder::all_git()?;
let rustc = RustcBuilder::all_rustc()?;
Emitter::default()
.add_instructions(&build)?
.add_instructions(&gitcl)?
.add_instructions(&rustc)?
.emit()?;
.add_instructions(&build)?
.add_instructions(&gitcl)?
.add_instructions(&rustc)?
.emit()?;
embuild::espidf::sysenv::output();
Ok(())
}
95 changes: 95 additions & 0 deletions src/algorithm_setup.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Algorithm Setup</title>
<style>
body {{
font-family: 'Arial', sans-serif;
background-color: #f0f4f8;
margin: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}}

.container {{
background-color: white;
box-shadow: 0px 8px 20px rgba(0, 0, 0, 0.1);
padding: 20px;
border-radius: 12px;
width: 90%;
max-width: 400px;
}}

h1 {{
text-align: center;
color: #333;
margin-bottom: 20px;
}}

label {{
font-weight: bold;
color: #555;
display: block;
margin-bottom: 8px;
}}

input[type="text"],
input[type="password"] {{
width: 94%;
padding: 10px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 6px;
font-size: 1rem;
}}

.btn {{
display: inline-block;
background-color: #00796b;
color: white;
padding: 10px 15px;
font-size: 1rem;
border-radius: 8px;
border: none;
width: 100%;
cursor: pointer;
text-align: center;
}}

.btn:hover {{
background-color: #004d40;
}}

.message {{
text-align: center;
font-size: large;
color: #d32f2f;
margin-top: 10px;
font-size: 0.9rem;
}}
</style>
</head>

<body>
<div class="container">
<h1>Algorithm Setup</h1>
<p>The Td value can be adjusted by providing custom values here. The equation is Final_TD = <b>m</b> * Raw_TD +
<b>b</b> By adjusting these values, you can alter your measured Td.</p>
<form method="get">
<label for="m">m-value (1)</label>
<input type="number" id="m" name="m" placeholder="1" value="{m_val}" required>

<label for="b">b-value (0)</label>
<input type="number" id="b" name="b" placeholder="0" value="{b_val}" required>

<button type="submit" class="btn">Save</button>
</form>
</div>
</body>

</html>
45 changes: 45 additions & 0 deletions src/helpers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
use anyhow::bail;
use esp_idf_svc::nvs::{EspNvs, EspNvsPartition, NvsDefault};
use log::warn;

pub fn get_saved_algorithm_variables(nvs: EspNvsPartition<NvsDefault>) -> (f32, f32) {
let nvs = match EspNvs::new(nvs, "algo", true) {
Ok(nvs) => nvs,
Err(_) => {
warn!("NVS init failed");
return (0., 1.);
}
};
let mut b_val_buffer = vec![0; 256];
let b_value: f32 = nvs
.get_str("b", &mut b_val_buffer)
.ok()
.flatten()
.and_then(|s| s.parse::<f32>().ok())
.unwrap_or(0.0);
let mut m_val_buffer = vec![0; 256];
let m_value = nvs
.get_str("m", &mut m_val_buffer)
.ok()
.flatten()
.and_then(|s| s.parse::<f32>().ok())
.unwrap_or(1.0);
(b_value, m_value)
}

pub fn save_algorithm_variables(
b: &str,
m: &str,
nvs: EspNvsPartition<NvsDefault>,
) -> anyhow::Result<()> {
let mut nvs = match EspNvs::new(nvs, "algo", true) {
Ok(nvs) => nvs,
Err(_) => {
bail!("NVS failed");
}
};

nvs.set_str("m", m)?;
nvs.set_str("b", b)?;
Ok(())
}
66 changes: 63 additions & 3 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#![feature(iter_intersperse)]

use std::borrow::Cow;
use std::collections::HashMap;

use core::time::Duration;
Expand Down Expand Up @@ -38,6 +39,7 @@ use esp_idf_svc::http::server::ws::EspHttpWsConnection;
use esp_idf_svc::sys::EspError;
use ws2812_esp32_rmt_driver::{driver::color::LedPixelColorGrb24, LedPixelEsp32Rmt, RGB8};
// mod dns;
mod helpers;
mod led;
mod wifi;

Expand Down Expand Up @@ -149,6 +151,7 @@ fn main() -> Result<(), ()> {

let mut server = EspHttpServer::new(&server_configuration).unwrap();
let cloned_nvs = Arc::new(nvs.clone());
let cloned_nvs_for_algo = Arc::new(nvs.clone());

server
.fn_handler("/", Method::Get, |req| {
Expand All @@ -166,7 +169,7 @@ fn main() -> Result<(), ()> {
let password = url_params.get("password");
if ssid.is_none() && password.is_none() {
let saved_ssid =
wifi::get_wifi_ssid(cloned_nvs.as_ref().clone()).unwrap_or_default();
wifi::get_wifi_ssid(cloned_nvs.clone().as_ref().clone()).unwrap_or_default();
req.into_ok_response()?
.write_all(serve_wifi_setup_page(&saved_ssid, "").as_ref())
.map(|_| ())?;
Expand All @@ -187,7 +190,7 @@ fn main() -> Result<(), ()> {
match wifi::save_wifi_creds(
ssid.unwrap(),
password.unwrap(),
cloned_nvs.as_ref().clone(),
cloned_nvs.clone().as_ref().clone(),
) {
Ok(_) => {
req.into_ok_response()?
Expand Down Expand Up @@ -219,6 +222,51 @@ fn main() -> Result<(), ()> {
};
})
.unwrap();
server
.fn_handler::<anyhow::Error, _>("/algorithm", Method::Get, move |req| {
let url = Url::parse(&format!("http://google.com{}", req.uri())).unwrap();
let url_params: HashMap<_, _> = url.query_pairs().into_owned().collect();
let m_value = url_params.get("m");
let b_value = url_params.get("b");
if m_value.is_none() && b_value.is_none() {
let saved_algorithm =
helpers::get_saved_algorithm_variables(cloned_nvs_for_algo.as_ref().clone());
req.into_ok_response()?
.write_all(serve_algo_setup_page(saved_algorithm.0, saved_algorithm.1).as_ref())
.map(|_| ())?;
return Ok(());
}
let mod_b_value = b_value
.map(Cow::Borrowed)
.unwrap_or_else(|| Cow::Owned("0.0".to_string()));
let mod_m_value = m_value
.map(Cow::Borrowed)
.unwrap_or_else(|| Cow::Owned("1.0".to_string()));
match helpers::save_algorithm_variables(
&mod_b_value,
&mod_m_value,
cloned_nvs_for_algo.as_ref().clone(),
) {
Ok(_) => {
req.into_ok_response()?
.write_all(
serve_algo_setup_page(
mod_b_value.parse::<f32>().unwrap_or(0.0),
mod_m_value.parse::<f32>().unwrap_or(1.0),
)
.as_ref(),
)
.map(|_| ())?;
return Ok(());
}
Err(e) => {
error!("{:?}", e);
FreeRtos.delay_ms(50);
reset::restart();
}
};
})
.unwrap();

#[cfg(feature = "ota")]
server
Expand All @@ -241,9 +289,12 @@ fn main() -> Result<(), ()> {
})
.unwrap();

let cloned_nvs_for_ws = Arc::new(nvs.clone());
server
.ws_handler("/ws", move |ws: &mut EspHttpWsConnection| {
let mut last_sent = Instant::now();
let saved_algorithm =
helpers::get_saved_algorithm_variables(cloned_nvs_for_ws.as_ref().clone());

loop {
if ws.is_closed() {
Expand Down Expand Up @@ -271,7 +322,8 @@ fn main() -> Result<(), ()> {
FreeRtos.delay_ms(2);
let reading = veml.lock().unwrap().read_lux().unwrap();
let td_value = (reading / baseline_reading) * 100.0;
ws_message = td_value.to_string();
let adjusted_td_value = saved_algorithm.1 * td_value + saved_algorithm.0;
ws_message = adjusted_td_value.to_string();
led_light.lock().unwrap().set_duty(25).unwrap();
log::info!("Reading: {}", td_value);
}
Expand Down Expand Up @@ -301,6 +353,14 @@ fn serve_wifi_setup_page(current_ssid: &str, error: &str) -> String {
error = error
)
}

fn serve_algo_setup_page(b_val: f32, m_val: f32) -> String {
format!(
include_str!("algorithm_setup.html"),
b_val = b_val,
m_val = m_val
)
}
/*
async fn start_dns() -> anyhow::Result<()> {
let stack = edge_nal_std::Stack::new();
Expand Down
13 changes: 9 additions & 4 deletions src/wifi.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
use core::str;
use std::{str::FromStr, sync::{Arc, Mutex}};
use std::{
str::FromStr,
sync::{Arc, Mutex},
};

use anyhow::bail;
use esp_idf_svc::{
Expand Down Expand Up @@ -91,7 +94,7 @@ pub async fn wifi_setup(
wifi: &mut AsyncWifi<EspWifi<'static>>,
nvs: EspNvsPartition<NvsDefault>,
led: Arc<Mutex<LedType<'_>>>,
wifi_status: Arc<Mutex<WifiEnum>>
wifi_status: Arc<Mutex<WifiEnum>>,
) -> anyhow::Result<WifiEnum> {
let nvs = match EspNvs::new(nvs, "wifi", true) {
Ok(nvs) => nvs,
Expand Down Expand Up @@ -148,7 +151,7 @@ pub fn save_wifi_creds(
Ok(())
}

pub fn get_wifi_ssid(nvs: EspNvsPartition<NvsDefault>)-> Option<String> {
pub fn get_wifi_ssid(nvs: EspNvsPartition<NvsDefault>) -> Option<String> {
let nvs = match EspNvs::new(nvs, "wifi", true) {
Ok(nvs) => nvs,
Err(_) => {
Expand All @@ -157,7 +160,9 @@ pub fn get_wifi_ssid(nvs: EspNvsPartition<NvsDefault>)-> Option<String> {
}
};
let mut wifi_ssid_buffer = vec![0; 256];
nvs.get_str("ssid", &mut wifi_ssid_buffer).unwrap().map(|s| s.to_string())
nvs.get_str("ssid", &mut wifi_ssid_buffer)
.unwrap()
.map(|s| s.to_string())
}

async fn wifi_hotspot(wifi: &mut AsyncWifi<EspWifi<'static>>) -> anyhow::Result<()> {
Expand Down

0 comments on commit a6bd5c8

Please sign in to comment.