From 30340ed37b67ee6d3887ed8094123c783c0c8dec Mon Sep 17 00:00:00 2001 From: Johnathan Van Why Date: Wed, 6 Feb 2019 15:18:34 -0800 Subject: [PATCH] Remove the IPC drivers and test infrastructure. Because libtock-rs uses static linking, it is difficult to run two Rust apps on one board. Few or none of the existing Tock platforms support statically linking multiple apps, making the IPC code untestable. To avoid having code and examples that cannot practically be used -- and to allow tests to pass -- we can remove all IPC code and its use cases. --- examples/ble_ess.rs | 55 --------------------- examples/hardware_test.rs | 39 --------------- examples/hardware_test_server.rs | 38 --------------- examples/ipcclient.rs | 41 ---------------- examples/ipcserver.rs | 35 -------------- run_ipc_example.sh | 10 ---- src/ipc/ble_ess.rs | 49 ------------------- src/ipc/client.rs | 82 -------------------------------- src/ipc/mod.rs | 7 --- src/ipc/server.rs | 44 ----------------- src/lib.rs | 1 - 11 files changed, 401 deletions(-) delete mode 100644 examples/ble_ess.rs delete mode 100644 examples/hardware_test_server.rs delete mode 100644 examples/ipcclient.rs delete mode 100644 examples/ipcserver.rs delete mode 100755 run_ipc_example.sh delete mode 100644 src/ipc/ble_ess.rs delete mode 100644 src/ipc/client.rs delete mode 100644 src/ipc/mod.rs delete mode 100644 src/ipc/server.rs diff --git a/examples/ble_ess.rs b/examples/ble_ess.rs deleted file mode 100644 index 597a0fe9..00000000 --- a/examples/ble_ess.rs +++ /dev/null @@ -1,55 +0,0 @@ -#![feature(alloc)] -#![no_std] - -extern crate alloc; - -use alloc::fmt::Write; -use tock::console::Console; -use tock::ipc; -use tock::ipc::ble_ess::{self, ReadingType}; -use tock::sensors::*; -use tock::timer; -use tock::timer::Duration; - -fn main() { - let mut console = Console::new(); - let mut shared_buffer = ipc::reserve_shared_buffer(); - write!(&mut console, "Starting BLE ESS\n").unwrap(); - - let mut ess = match ble_ess::connect(&mut shared_buffer) { - Ok(ess) => ess, - _ => { - write!(&mut console, "BLE IPC Service not installed\n").unwrap(); - return; - } - }; - write!(&mut console, "Found BLE IPC Service\n").unwrap(); - - let mut humidity = HumiditySensor; - let mut temperature = TemperatureSensor; - let mut light = AmbientLightSensor; - loop { - // Temperature - let temp = temperature.read(); - write!(&mut console, "Temperature: {}\n", temp).unwrap(); - if let Err(_) = ess.set_reading(ReadingType::Temperature, temp) { - write!(&mut console, "Failed to set temperature\n").unwrap_or(()); - } - - // Light - let lx = light.read(); - write!(&mut console, "Light: {}\n", lx).unwrap(); - if let Err(_) = ess.set_reading(ReadingType::Light, lx) { - write!(&mut console, "Failed to set temperature\n").unwrap_or(()); - } - - // Humidity - let humid = humidity.read(); - write!(&mut console, "Humidity: {}\n", humid).unwrap(); - if let Err(_) = ess.set_reading(ReadingType::Humidity, humid) { - write!(&mut console, "Failed to set temperature\n").unwrap_or(()); - } - - timer::sleep(Duration::from_ms(5000)) - } -} diff --git a/examples/hardware_test.rs b/examples/hardware_test.rs index 4a9ffdf3..32b160fe 100644 --- a/examples/hardware_test.rs +++ b/examples/hardware_test.rs @@ -4,57 +4,18 @@ extern crate alloc; use alloc::string::String; -use alloc::vec::Vec; use tock::console::Console; -use tock::ipc; -use tock::ipc::IpcClientCallback; -use tock::ipc::ServerHandle; use tock::timer; use tock::timer::Duration; fn main() { - let mut server_buf = ipc::reserve_shared_buffer(); - let mut my_buf = ipc::reserve_shared_buffer(); - let mut console = Console::new(); - - // This sleep is neccessary to assure, that during installation of - // the client/server pair the tests are only run once. - timer::sleep(Duration::from_ms(3000)); - console.write(String::from("[test-results]\n")); let mut string = String::from("heap_test = \"Heap "); string.push_str("works.\"\n"); console.write(string); - let mut server = ServerHandle::discover_service(String::from("hardware_test_server")).unwrap(); - let mut payload: [u8; 32] = [0; 32]; - let m = String::from("client"); - let b = m.as_bytes(); - let l = b.len(); - payload[..l].clone_from_slice(b); - - let mut handle = server.share(&mut server_buf).unwrap(); - handle.write_bytes(&payload); - - let mut callback = IpcClientCallback::new(|_: usize, _: usize| { - handle.read_bytes(&mut my_buf.buffer); - let filtered = my_buf - .buffer - .iter() - .cloned() - .filter(|&x| x != 0) - .collect::>(); - let s = String::from_utf8_lossy(&filtered); - console.write(String::from(s).clone()); - console.write(String::from("test=\"done\"\n")); - }); - - let handle = server.subscribe_callback(&mut callback); - server.notify().unwrap(); - for _ in 0.. { timer::sleep(Duration::from_ms(500)) } - handle.unwrap(); } diff --git a/examples/hardware_test_server.rs b/examples/hardware_test_server.rs deleted file mode 100644 index 7de2962b..00000000 --- a/examples/hardware_test_server.rs +++ /dev/null @@ -1,38 +0,0 @@ -#![feature(alloc)] -#![no_std] - -extern crate alloc; - -use alloc::string::String; -use alloc::vec::Vec; -use tock::ipc; -use tock::ipc::IpcServerCallback; -use tock::ipc::IpcServerDriver; - -#[allow(unreachable_code)] -// Prints the payload and adds one to the first byte. -fn main() { - let mut callback = IpcServerCallback::new(|pid: usize, _: usize, message: &mut [u8]| { - let filtered = message - .iter() - .cloned() - .filter(|&x| x != 0) - .collect::>(); - let s = String::from_utf8_lossy(&filtered); - if s == String::from("client") { - let m = String::from("test_ipc = \"passed\"\n"); - let b = m.as_bytes(); - let l = b.len(); - message[..l].clone_from_slice(b); - ipc::notify_client(pid); - } - }); - - let _server = IpcServerDriver::start(&mut callback); - - loop { - tock::syscalls::yieldk(); - } - - _server.unwrap(); -} diff --git a/examples/ipcclient.rs b/examples/ipcclient.rs deleted file mode 100644 index 0b6e0149..00000000 --- a/examples/ipcclient.rs +++ /dev/null @@ -1,41 +0,0 @@ -#![feature(alloc)] -#![no_std] - -extern crate alloc; - -use alloc::string::String; -use tock::console::Console; -use tock::fmt; -use tock::ipc; -use tock::ipc::IpcClientCallback; -use tock::ipc::ServerHandle; -use tock::timer; - -// Calls the ipc_server and prints result -fn main() { - let mut server_buf = ipc::reserve_shared_buffer(); - let mut my_buf = ipc::reserve_shared_buffer(); - timer::sleep(timer::Duration::from_ms(1000)); - - loop { - let mut server = ServerHandle::discover_service(String::from("ipcserver")).unwrap(); - let payload: [u8; 32] = [5; 32]; - - let mut handle = server.share(&mut server_buf).unwrap(); - handle.write_bytes(&payload); - - let mut callback = IpcClientCallback::new(|_: usize, _: usize| { - let mut console = Console::new(); - handle.read_bytes(&mut my_buf.buffer); - console.write(String::from("Client: \"Payload: ")); - console.write(fmt::u32_as_decimal(my_buf.buffer[0] as u32)); - console.write(String::from("\"\n")); - }); - - let handle = server.subscribe_callback(&mut callback); - - server.notify().unwrap(); - timer::sleep(timer::Duration::from_ms(1000)); - handle.unwrap(); - } -} diff --git a/examples/ipcserver.rs b/examples/ipcserver.rs deleted file mode 100644 index c84381cd..00000000 --- a/examples/ipcserver.rs +++ /dev/null @@ -1,35 +0,0 @@ -#![feature(alloc)] -#![no_std] - -extern crate alloc; - -use alloc::string::String; -use tock::console::Console; -use tock::fmt::*; -use tock::ipc; -use tock::ipc::IpcServerCallback; -use tock::ipc::IpcServerDriver; - -#[allow(unreachable_code)] -// Prints the payload and adds one to the first byte. -fn main() { - let mut console = Console::new(); - console.write(String::from("Start service:\n")); - - let mut callback = IpcServerCallback::new(|pid: usize, _: usize, message: &mut [u8]| { - console.write(String::from("Server: \"Payload: ")); - - console.write(u32_as_hex(message[0] as u32)); - console.write(String::from("\"\n")); - message[0] += 1; - ipc::notify_client(pid); - }); - - let _server = IpcServerDriver::start(&mut callback); - - loop { - tock::syscalls::yieldk(); - } - - _server.unwrap(); -} diff --git a/run_ipc_example.sh b/run_ipc_example.sh deleted file mode 100755 index 1098bf1b..00000000 --- a/run_ipc_example.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -# Example only runs on a nRF52-DK board - -set -eux - -yes 0|tockloader uninstall --jlink --arch cortex-m4 --board nrf52dk --jtag-device nrf52 --app-address 0x20000 || true - -./run_example.sh ipcclient --dont-clear-apps -./run_example.sh ipcserver --dont-clear-apps diff --git a/src/ipc/ble_ess.rs b/src/ipc/ble_ess.rs deleted file mode 100644 index e4637b66..00000000 --- a/src/ipc/ble_ess.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::ipc::IPCBuffer; -use crate::ipc::ServerHandle; -use crate::shared_memory::SharedMemory; -use alloc::string::String; - -#[repr(u32)] -pub enum ReadingType { - Temperature = 0, - Humidity = 1, - Light = 2, -} - -pub struct BleEss<'a> { - server: ServerHandle, - pub memory: SharedMemory<'a>, -} - -pub fn connect(buffer: &mut IPCBuffer) -> Result { - let server = - ServerHandle::discover_service(String::from("org.tockos.services.ble-ess")).unwrap(); - let memory = server.share(buffer).unwrap(); - Ok(BleEss { server, memory }) -} - -impl<'a> BleEss<'a> { - pub fn set_reading(&mut self, sensor: ReadingType, data: I) -> Result<(), isize> - where - I: Into, - { - let sensor_type = sensor as u32; - let data = Into::::into(data) as u32; - let mut buf = [0; 8]; - - buf[0..4].copy_from_slice(&[ - (sensor_type & 0xff) as u8, - ((sensor_type >> 8) & 0xff) as u8, - ((sensor_type >> 16) & 0xff) as u8, - ((sensor_type >> 24) & 0xff) as u8, - ]); - buf[4..8].copy_from_slice(&[ - (data & 0xff) as u8, - ((data >> 8) & 0xff) as u8, - ((data >> 16) & 0xff) as u8, - ((data >> 24) & 0xff) as u8, - ]); - self.memory.write_bytes(&buf); - self.server.notify() - } -} diff --git a/src/ipc/client.rs b/src/ipc/client.rs deleted file mode 100644 index 4594f413..00000000 --- a/src/ipc/client.rs +++ /dev/null @@ -1,82 +0,0 @@ -use crate::callback::CallbackSubscription; -use crate::callback::SubscribableCallback; -use crate::shared_memory::SharedMemory; -use crate::syscalls; -use alloc::string::String; - -const DRIVER_NUMBER: usize = 0x10000; - -mod ipc_commands { - pub const DISCOVER_SERVICE: usize = 0; -} - -pub struct ServerHandle { - pid: usize, -} - -pub struct IpcClientCallback { - callback: CB, -} - -impl IpcClientCallback { - pub fn new(callback: CB) -> Self { - IpcClientCallback { callback } - } -} - -impl SubscribableCallback for IpcClientCallback { - fn call_rust(&mut self, pid: usize, len: usize, _: usize) { - (self.callback)(pid, len); - } -} - -pub fn reserve_shared_buffer() -> IPCBuffer { - IPCBuffer { buffer: [0; 32] } -} - -#[repr(align(32))] -pub struct IPCBuffer { - pub buffer: [u8; 32], -} - -impl ServerHandle { - pub fn share<'a>(&self, shared_buffer: &'a mut IPCBuffer) -> Result, isize> { - syscalls::allow(DRIVER_NUMBER, self.pid as usize, &mut shared_buffer.buffer) - } - - pub fn notify(&mut self) -> Result<(), isize> { - let res = unsafe { syscalls::command(DRIVER_NUMBER, self.pid as usize, 0, 0) }; - if res == 0 { - Ok(()) - } else { - Err(res) - } - } - - pub fn discover_service(mut name: String) -> Option { - let len = name.len(); - let pid = unsafe { - syscalls::allow_ptr( - DRIVER_NUMBER, - ipc_commands::DISCOVER_SERVICE, - name.as_bytes_mut().as_mut_ptr(), - len, - ) - }; - if pid >= 0 { - Some(ServerHandle { pid: pid as usize }) - } else { - None - } - } - - pub fn subscribe_callback<'a, CB>( - &self, - callback: &'a mut IpcClientCallback, - ) -> Result, isize> - where - IpcClientCallback: SubscribableCallback, - { - syscalls::subscribe(DRIVER_NUMBER, self.pid, callback) - } -} diff --git a/src/ipc/mod.rs b/src/ipc/mod.rs deleted file mode 100644 index 6c3d9345..00000000 --- a/src/ipc/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod ble_ess; -pub mod client; -pub mod server; - -pub use self::ble_ess::*; -pub use self::client::*; -pub use self::server::*; diff --git a/src/ipc/server.rs b/src/ipc/server.rs deleted file mode 100644 index a8f6795d..00000000 --- a/src/ipc/server.rs +++ /dev/null @@ -1,44 +0,0 @@ -use crate::callback::CallbackSubscription; -use crate::callback::SubscribableCallback; -use crate::syscalls; -use core::slice; - -const DRIVER_NUMBER: usize = 0x10000; - -mod ipc_commands { - pub const REGISTER_SERVICE: usize = 0; - pub const NOTIFY_CLIENT: usize = 1; -} - -pub struct IpcServerCallback { - callback: CB, -} - -impl IpcServerCallback { - pub fn new(callback: CB) -> Self { - IpcServerCallback { callback } - } -} - -impl SubscribableCallback for IpcServerCallback { - fn call_rust(&mut self, arg0: usize, arg1: usize, arg2: usize) { - // FIXME: This is unsafe because IpcServerCallback can be subscribed on any driver - let mut v = unsafe { slice::from_raw_parts_mut(arg2 as *mut u8, arg1) }; - (self.callback)(arg0, arg1, &mut v); - } -} - -pub fn notify_client(pid: usize) { - unsafe { syscalls::command(DRIVER_NUMBER, pid, ipc_commands::NOTIFY_CLIENT, 0) }; -} - -pub struct IpcServerDriver; - -impl IpcServerDriver { - pub fn start(callback: &mut IpcServerCallback) -> Result - where - IpcServerCallback: SubscribableCallback, - { - syscalls::subscribe(DRIVER_NUMBER, ipc_commands::REGISTER_SERVICE, callback) - } -} diff --git a/src/lib.rs b/src/lib.rs index 19061cc5..0a60a32e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,7 +25,6 @@ pub mod debug; pub mod electronics; pub mod fmt; pub mod gpio; -pub mod ipc; pub mod led; pub mod result; pub mod sensors;