allow list get put delete of files
This commit is contained in:
@@ -1,18 +1,16 @@
|
||||
//offer ota and config mode
|
||||
|
||||
use std::{
|
||||
collections::VecDeque,
|
||||
io::{BufRead, Read, Seek, Write},
|
||||
str::from_utf8,
|
||||
sync::{atomic::AtomicBool, Arc},
|
||||
collections::VecDeque, fs, io::{BufRead, Read, Write}, str::from_utf8, sync::{atomic::AtomicBool, Arc}
|
||||
};
|
||||
|
||||
use crate::{espota::OtaUpdate, map_range_moisture, plant_hal::{FileInfo, PLANT_COUNT}, BOARD_ACCESS};
|
||||
use crate::{espota::OtaUpdate, map_range_moisture, plant_hal::FileInfo, BOARD_ACCESS};
|
||||
use chrono::DateTime;
|
||||
use url::Url;
|
||||
use core::result::Result::Ok;
|
||||
use embedded_svc::http::{Method, Query};
|
||||
use esp_idf_hal::{delay::Delay, io::Write};
|
||||
use esp_idf_svc::{fs, http::server::{Configuration, EspHttpConnection, EspHttpServer, Request}};
|
||||
use embedded_svc::http::Method;
|
||||
use esp_idf_hal::delay::Delay;
|
||||
use esp_idf_svc::{http::server::{Configuration, EspHttpConnection, EspHttpServer, Request}};
|
||||
use heapless::String;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
@@ -81,7 +79,7 @@ fn get_data(
|
||||
|
||||
let mut a: Vec<u8> = Vec::new();
|
||||
let mut b: Vec<u8> = Vec::new();
|
||||
for plant in 0..2 {
|
||||
for plant in 0..8 {
|
||||
let a_hz = board.measure_moisture_hz(plant, crate::plant_hal::Sensor::A)?;
|
||||
let b_hz = board.measure_moisture_hz(plant, crate::plant_hal::Sensor::B)?;
|
||||
let a_pct = map_range_moisture(a_hz as f32);
|
||||
@@ -176,11 +174,12 @@ fn wifi_scan(
|
||||
}
|
||||
|
||||
fn list_files(
|
||||
_request: &mut Request<&mut EspHttpConnection>,
|
||||
request: &mut Request<&mut EspHttpConnection>,
|
||||
) -> Result<Option<std::string::String>, anyhow::Error> {
|
||||
let filename = query_param(request.uri(),"filename").unwrap_or_default();
|
||||
let board = BOARD_ACCESS.lock().unwrap();
|
||||
let result = board.list_files()?;
|
||||
let file_list_json = serde_json::to_string(&FileList { file: result })?;
|
||||
let result = board.list_files(&filename);
|
||||
let file_list_json = serde_json::to_string(&result)?;
|
||||
return anyhow::Ok(Some(file_list_json));
|
||||
}
|
||||
|
||||
@@ -216,6 +215,20 @@ fn ota(
|
||||
finalizer.restart();
|
||||
}
|
||||
|
||||
fn query_param(uri:&str, param_name:&str) -> Option<std::string::String>{
|
||||
println!("{uri} get {param_name}");
|
||||
let parsed = Url::parse(&format!("http://127.0.0.1/{uri}")).unwrap();
|
||||
let value = parsed.query_pairs().filter(|it| it.0 == param_name).next();
|
||||
match value {
|
||||
Some(found) => {
|
||||
return Some(found.1.into_owned());
|
||||
},
|
||||
None => {
|
||||
return None
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
let server_config = Configuration {
|
||||
stack_size: 32768,
|
||||
@@ -255,7 +268,7 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/ota", Method::Post, |mut request| {
|
||||
.fn_handler("/ota", Method::Post, |request| {
|
||||
handle_error_to500(request, ota)
|
||||
})
|
||||
.unwrap();
|
||||
@@ -271,16 +284,16 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/list_files", Method::Get, move |request| {
|
||||
.fn_handler("/files", Method::Get, move |request| {
|
||||
handle_error_to500(request, list_files)
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/get_file", Method::Get, move |request| {
|
||||
let filename:String = request.uri().magic_here().get("filename");
|
||||
let file_handle = BOARD_ACCESS.lock().unwrap().get_file_handle(filename);
|
||||
.fn_handler("/file", Method::Get, move |request| {
|
||||
let filename = query_param(request.uri(),"filename").unwrap();
|
||||
let file_handle = BOARD_ACCESS.lock().unwrap().get_file_handle(&filename, false);
|
||||
match file_handle {
|
||||
Ok(file_handle) => {
|
||||
Ok(mut file_handle) => {
|
||||
let mut response = request.into_ok_response()?;
|
||||
const BUFFER_SIZE: usize = 512;
|
||||
let mut buffer: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
|
||||
@@ -288,7 +301,7 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
loop {
|
||||
let read = file_handle.read(&mut buffer)?;
|
||||
total_read += read;
|
||||
println!("sending {read} bytes of {total_read} for file {filename}");
|
||||
println!("sending {read} bytes of {total_read} for file {}", &filename);
|
||||
let to_write = &buffer[0..read];
|
||||
response.write(to_write)?;
|
||||
println!("wrote {read} bytes of {total_read} for file {filename}");
|
||||
@@ -296,6 +309,7 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
break;
|
||||
}
|
||||
}
|
||||
drop(file_handle);
|
||||
response.flush()?;
|
||||
|
||||
},
|
||||
@@ -312,11 +326,11 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/put_file", Method::Post, move |request| {
|
||||
let filename:String = request.uri().magic_here().get("filename");
|
||||
let file_handle = BOARD_ACCESS.lock().unwrap().get_file_handle(filename);
|
||||
.fn_handler("/file", Method::Post, move |mut request| {
|
||||
let filename = query_param(request.uri(),"filename").unwrap();
|
||||
let file_handle = BOARD_ACCESS.lock().unwrap().get_file_handle(&filename,true);
|
||||
match file_handle {
|
||||
Ok(file_handle) => {
|
||||
Ok(mut file_handle) => {
|
||||
const BUFFER_SIZE: usize = 512;
|
||||
let mut buffer: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
|
||||
let mut total_read: usize = 0;
|
||||
@@ -331,7 +345,7 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
break;
|
||||
}
|
||||
}
|
||||
request.into_ok_response().unwrap().write(format!("saved {total_read} bytes").as_bytes());
|
||||
request.into_ok_response().unwrap().write(format!("saved {total_read} bytes").as_bytes()).unwrap();
|
||||
},
|
||||
Err(err) => {
|
||||
//todo set headers here for filename to be error
|
||||
@@ -345,17 +359,26 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/get_file", Method::Post, move |request| {
|
||||
handle_error_to500(request, set_config)
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/put_file", Method::Post, move |request| {
|
||||
handle_error_to500(request, set_config)
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/file", Method::Delete, move |request| {
|
||||
let filename = query_param(request.uri(),"filename").unwrap();
|
||||
let copy = filename.clone();
|
||||
let board = BOARD_ACCESS.lock().unwrap();
|
||||
match board.delete_file(&filename) {
|
||||
Ok(_) => {
|
||||
let info = format!("Deleted file {copy}");
|
||||
request.into_ok_response().unwrap().write(info.as_bytes()).unwrap();
|
||||
},
|
||||
Err(err) => {
|
||||
let info = format!("Could not delete file {copy} {err:?}");
|
||||
request.into_status_response(400).unwrap().write(info.as_bytes()).unwrap();
|
||||
},
|
||||
}
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
server
|
||||
.fn_handler("/flashbattery", Method::Post, move |mut request| {
|
||||
|
||||
@@ -428,12 +451,6 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
.fn_handler("/", Method::Get, move |request| {
|
||||
let mut response = request.into_ok_response()?;
|
||||
response.write(include_bytes!("config.html"))?;let mut buf = [0_u8; 3072];
|
||||
let read = request.read(&mut buf)?;
|
||||
let actual_data = &buf[0..read];
|
||||
println!("Raw data {}", from_utf8(actual_data).unwrap());
|
||||
let config: Config = serde_json::from_slice(actual_data)?;
|
||||
|
||||
.write(include_bytes!("bundle.js"))?;
|
||||
anyhow::Ok(())
|
||||
})
|
||||
.unwrap();
|
||||
@@ -447,6 +464,15 @@ pub fn httpd(_reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
.fn_handler("/bundle.js", Method::Get, |request| {
|
||||
request
|
||||
.into_ok_response()?
|
||||
.write(include_bytes!("bundle.js"))?;
|
||||
anyhow::Ok(())
|
||||
|
||||
})
|
||||
.unwrap();
|
||||
server
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user