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;