From 8e4fbaf80e8a34a2d3c8605ef128a4847bf77d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20J=C3=B6rdens?= Date: Mon, 27 May 2019 18:43:39 +0000 Subject: [PATCH] json command interface close #3 --- src/main.rs | 76 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index c6273be..9c8f670 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ use core::fmt::Write; use cortex_m_rt::{entry, exception}; use stm32h7::stm32h7x3::{self as stm32, Peripherals, CorePeripherals, interrupt}; use cortex_m::interrupt::Mutex; -use heapless::{String, consts::*}; +use heapless::{String, Vec, consts::*}; use smoltcp as net; @@ -647,6 +647,7 @@ fn main() -> ! { let mut socket_set_entries: [_; 8] = Default::default(); let mut sockets = net::socket::SocketSet::new(&mut socket_set_entries[..]); create_socket!(sockets, tcp_rx_storage0, tcp_tx_storage0, tcp_handle0); + create_socket!(sockets, tcp_rx_storage0, tcp_tx_storage0, tcp_handle1); unsafe { eth::enable_interrupt(); } unsafe { cp.NVIC.set_priority(stm32::Interrupt::ETH, 196); } // mid prio @@ -667,7 +668,7 @@ fn main() -> ! { { let socket = &mut *sockets.get::(tcp_handle0); if !(socket.is_open() || socket.is_listening()) { - socket.listen(80).unwrap_or_else(|e| warn!("TCP listen error: {:?}", e)); + socket.listen(1234).unwrap_or_else(|e| warn!("TCP listen error: {:?}", e)); } else if last != time && socket.can_send() { last = time; let s = unsafe { Status{ @@ -677,11 +678,18 @@ fn main() -> ! { x1: IIR_STATE[1][0], y1: IIR_STATE[1][2], }}; - let mut u: String = to_string(&s).unwrap(); - u.push('\n').unwrap(); - socket.write_str(&u).unwrap(); + send_response(socket, &s); } } + { + let socket = &mut *sockets.get::(tcp_handle1); + if !(socket.is_open() || socket.is_listening()) { + socket.listen(1235).unwrap_or_else(|e| warn!("TCP listen error: {:?}", e)); + } else { + handle_command(socket); + } + } + if !match iface.poll(&mut sockets, net::time::Instant::from_millis(time as i64)) { Ok(changed) => changed, Err(net::Error::Unrecognized) => true, @@ -692,13 +700,63 @@ fn main() -> ! { } } - -#[derive(Deserialize)] -struct Update { - servo: i8, +#[derive(Deserialize,Serialize)] +struct Request { + channel: i8, iir: IIR, } +#[derive(Serialize)] +struct Response<'a> { + code: i32, + message: &'a str, +} + +fn send_response(socket: &mut net::socket::TcpSocket, msg: &T) { + let mut u: String = to_string(msg).unwrap(); + u.push('\n').unwrap(); + socket.write_str(&u).unwrap(); +} + +fn handle_command(socket: &mut net::socket::TcpSocket) { + let mut data: Vec = Vec::new(); + let mut discard: bool = false; + while socket.can_recv() { + if socket.recv(|buf| { + let (len, found) = match buf.iter().position(|&c| c as char == '\n') { + Some(end) => (end + 1, true), + None => (buf.len(), false), + }; + if data.len() + len >= data.capacity() { + discard = true; + data.clear(); + } else if !discard && len > 0 { + data.extend_from_slice(&buf[..len - 1]).unwrap(); + } + (len, found) + }).unwrap() { + let resp = if discard { + discard = false; + Response{ code: 500, message: "command buffer overflow" } + } else { + match from_slice::(&data) { + Ok(request) => { + cortex_m::interrupt::free(|_| { + unsafe { IIR_CH[request.channel as usize] = request.iir; }; + }); + Response{ code: 200, message: "ok" } + }, + Err(err) => { + warn!("parse error {}", err); + Response{ code: 550, message: "parse error" } + }, + } + }; + send_response(socket, &resp); + socket.close(); + } + } +} #[derive(Serialize)] struct Status {