forked from M-Labs/kirdy
Send report to connected socket
- Remove active report in flash settings
This commit is contained in:
parent
99cf17f7e4
commit
1867935047
23
src/main.rs
23
src/main.rs
|
@ -31,7 +31,6 @@ static mut ETH_DATA_BUFFER: [u8; 1024] = [0; 1024];
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Clone, Copy, Debug)]
|
#[derive(Deserialize, Serialize, Clone, Copy, Debug)]
|
||||||
pub struct DeviceSettings{
|
pub struct DeviceSettings{
|
||||||
report_readings: bool,
|
|
||||||
ip_settings: IpSettings,
|
ip_settings: IpSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,10 +58,11 @@ fn main() -> ! {
|
||||||
let (mut wd, mut flash_store, mut laser, mut thermostat,) = bootup(core_perif, perif);
|
let (mut wd, mut flash_store, mut laser, mut thermostat,) = bootup(core_perif, perif);
|
||||||
|
|
||||||
let mut device_settings = DeviceSettings {
|
let mut device_settings = DeviceSettings {
|
||||||
report_readings: false,
|
|
||||||
ip_settings: IpSettings::default()
|
ip_settings: IpSettings::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut active_report: [bool; net::net::NUM_OF_SOCKETS] = [false; net::net::NUM_OF_SOCKETS];
|
||||||
|
|
||||||
let mut state = State::default();
|
let mut state = State::default();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
@ -146,17 +146,20 @@ fn main() -> ! {
|
||||||
thermostat.power_down();
|
thermostat.power_down();
|
||||||
}
|
}
|
||||||
|
|
||||||
net::net::for_each(|mut socket| {
|
net::net::for_each(|mut socket, id| {
|
||||||
if net::net::eth_is_socket_active(socket) {
|
if net::net::eth_is_socket_active(socket) && net::net::eth_is_socket_connected(socket) {
|
||||||
if device_settings.report_readings {
|
if active_report[id] {
|
||||||
unsafe {
|
unsafe {
|
||||||
net::cmd_handler::send_status_report(&mut ETH_DATA_BUFFER, &mut laser, &mut thermostat, &mut socket);
|
net::cmd_handler::send_status_report(&mut ETH_DATA_BUFFER, &mut laser, &mut thermostat, &mut socket);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
active_report[id] = false;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
net::net::for_each(|mut socket| {
|
net::net::for_each(|mut socket, id| {
|
||||||
if net::net::eth_is_socket_active(socket) {
|
if net::net::eth_is_socket_active(socket) {
|
||||||
cortex_m::interrupt::free(|cs|
|
cortex_m::interrupt::free(|cs|
|
||||||
{
|
{
|
||||||
|
@ -174,7 +177,7 @@ fn main() -> ! {
|
||||||
info!("Ts: {:?}", sys_timer::now());
|
info!("Ts: {:?}", sys_timer::now());
|
||||||
debug!("Number of bytes recv: {:?}", bytes);
|
debug!("Number of bytes recv: {:?}", bytes);
|
||||||
// State Transition
|
// State Transition
|
||||||
net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, &mut socket, &mut laser, &mut thermostat, &mut state, &mut device_settings);
|
net::cmd_handler::execute_cmd(&mut ETH_DATA_BUFFER, bytes, &mut socket, &mut laser, &mut thermostat, &mut state, &mut device_settings, &mut active_report[id]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -226,7 +229,7 @@ fn main() -> ! {
|
||||||
wd.feed();
|
wd.feed();
|
||||||
laser.power_down();
|
laser.power_down();
|
||||||
thermostat.power_down();
|
thermostat.power_down();
|
||||||
net::net::for_each(|mut socket| {
|
net::net::for_each(|mut socket, _| {
|
||||||
if net::net::eth_is_socket_active(socket) {
|
if net::net::eth_is_socket_active(socket) {
|
||||||
unsafe {
|
unsafe {
|
||||||
net::cmd_handler::send_response(&mut ETH_DATA_BUFFER, net::cmd_handler::ResponseEnum::HardReset, None, &mut socket);
|
net::cmd_handler::send_response(&mut ETH_DATA_BUFFER, net::cmd_handler::ResponseEnum::HardReset, None, &mut socket);
|
||||||
|
@ -239,10 +242,10 @@ fn main() -> ! {
|
||||||
laser.power_down();
|
laser.power_down();
|
||||||
thermostat.power_down();
|
thermostat.power_down();
|
||||||
let mut any_socket_alive = false;
|
let mut any_socket_alive = false;
|
||||||
net::net::for_each(|socket| {
|
net::net::for_each(|socket, _| {
|
||||||
if net::net::eth_is_socket_active(socket) {
|
if net::net::eth_is_socket_active(socket) {
|
||||||
net::net::eth_close_socket(socket);
|
net::net::eth_close_socket(socket);
|
||||||
any_socket_alive = true;
|
any_socket_alive = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -221,7 +221,7 @@ pub struct TecSetICmd {
|
||||||
/// Make sure kirdy's firmware is flashed with release builds.
|
/// Make sure kirdy's firmware is flashed with release builds.
|
||||||
/// The received message must contain only one json cmd. TCP client should set TCP_NODELAY or equivalent flag in its TCP Socket
|
/// The received message must contain only one json cmd. TCP client should set TCP_NODELAY or equivalent flag in its TCP Socket
|
||||||
/// Settings to avoid unwanted buffering on TX Data and minimize TX latency.
|
/// Settings to avoid unwanted buffering on TX Data and minimize TX latency.
|
||||||
pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, socket: &mut SocketHandle, laser: &mut LdDrive, thermostat: &mut Thermostat, state: &mut State, device_settings: &mut DeviceSettings){
|
pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, socket: &mut SocketHandle, laser: &mut LdDrive, thermostat: &mut Thermostat, state: &mut State, device_settings: &mut DeviceSettings, active_report: &mut bool){
|
||||||
let mut cmd = TecSetICmd {
|
let mut cmd = TecSetICmd {
|
||||||
json: TecSetICmdJson::default()
|
json: TecSetICmdJson::default()
|
||||||
};
|
};
|
||||||
|
@ -266,7 +266,7 @@ pub fn execute_cmd(buffer: &mut [u8], buffer_size: usize, socket: &mut SocketHan
|
||||||
match cmd.json.data_bool{
|
match cmd.json.data_bool{
|
||||||
Some(val) => {
|
Some(val) => {
|
||||||
send_response(buffer, ResponseEnum::Acknowledge, None, socket);
|
send_response(buffer, ResponseEnum::Acknowledge, None, socket);
|
||||||
device_settings.report_readings = val;
|
*active_report = val;
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
send_response(buffer, ResponseEnum::InvalidDatatype, Some(ERR_MSG_MISSING_DATA_BOOL), socket);
|
send_response(buffer, ResponseEnum::InvalidDatatype, Some(ERR_MSG_MISSING_DATA_BOOL), socket);
|
||||||
|
|
|
@ -61,7 +61,7 @@ pub struct EthernetMgmtPins {
|
||||||
}
|
}
|
||||||
pub type EthInterface = Interface;
|
pub type EthInterface = Interface;
|
||||||
|
|
||||||
const NUM_OF_SOCKETS : usize = 4;
|
pub const NUM_OF_SOCKETS : usize = 4;
|
||||||
const TCP_BUFFER_SIZE: usize = 2048;
|
const TCP_BUFFER_SIZE: usize = 2048;
|
||||||
static mut RX_RING: Option<[RxRingEntry; 8]> = None;
|
static mut RX_RING: Option<[RxRingEntry; 8]> = None;
|
||||||
static mut TX_RING: Option<[TxRingEntry; 2]> = None;
|
static mut TX_RING: Option<[TxRingEntry; 2]> = None;
|
||||||
|
@ -225,6 +225,11 @@ impl ServerHandle {
|
||||||
self.iface.poll(now_fn(), &mut &mut self.dma, &mut self.socket_set);
|
self.iface.poll(now_fn(), &mut &mut self.dma, &mut self.socket_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_socket_connected(&mut self, socket_handles: SocketHandle)->bool {
|
||||||
|
let socket = self.socket_set.get_mut::<Socket>(socket_handles);
|
||||||
|
socket.state() == State::Established
|
||||||
|
}
|
||||||
|
|
||||||
pub fn poll_socket_status(&mut self, socket_handles: SocketHandle)-> bool {
|
pub fn poll_socket_status(&mut self, socket_handles: SocketHandle)-> bool {
|
||||||
let socket = self.socket_set.get_mut::<Socket>(socket_handles);
|
let socket = self.socket_set.get_mut::<Socket>(socket_handles);
|
||||||
if !socket.is_listening() && !socket.is_open() || socket.state() == State::CloseWait {
|
if !socket.is_listening() && !socket.is_open() || socket.state() == State::CloseWait {
|
||||||
|
@ -385,6 +390,17 @@ pub fn eth_recv(buffer: &mut [u8], socket_handles: SocketHandle)-> usize{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn eth_is_socket_connected(socket_handles: SocketHandle) -> bool {
|
||||||
|
unsafe {
|
||||||
|
if let Some(ref mut server_handle ) = SERVER_HANDLE {
|
||||||
|
server_handle.is_socket_connected(socket_handles)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
panic!("eth_is_socket_connected is called before init");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn eth_is_socket_active(socket_handles: SocketHandle) -> bool {
|
pub fn eth_is_socket_active(socket_handles: SocketHandle) -> bool {
|
||||||
unsafe {
|
unsafe {
|
||||||
if let Some(ref mut server_handle ) = SERVER_HANDLE {
|
if let Some(ref mut server_handle ) = SERVER_HANDLE {
|
||||||
|
@ -407,11 +423,11 @@ pub fn eth_close_socket(socket_handles: SocketHandle) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn for_each<F: FnMut(SocketHandle)>(mut callback: F) {
|
pub fn for_each<F: FnMut(SocketHandle, usize)>(mut callback: F) {
|
||||||
unsafe {
|
unsafe {
|
||||||
if let Some(ref mut server_handle ) = SERVER_HANDLE {
|
if let Some(ref mut server_handle ) = SERVER_HANDLE {
|
||||||
for i in 0..NUM_OF_SOCKETS {
|
for i in 0..NUM_OF_SOCKETS {
|
||||||
callback(server_handle.socket_handles[i]);
|
callback(server_handle.socket_handles[i], i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in New Issue