From f7819ddb7b1ac9cc28a158e829993edc757a4676 Mon Sep 17 00:00:00 2001 From: BucurCK Date: Sun, 2 Apr 2023 12:46:07 +0300 Subject: [PATCH] Start implementation on using ADC api --- Cargo.toml | 2 ++ apis/adc/Cargo.toml | 14 +++++++++++++ apis/adc/src/lib.rs | 46 +++++++++++++++++++++++++++++++++++++++++++ apis/adc/src/tests.rs | 0 examples/adc.rs | 22 +++++++++++++++++++++ src/lib.rs | 6 ++++++ 6 files changed, 90 insertions(+) create mode 100644 apis/adc/Cargo.toml create mode 100644 apis/adc/src/lib.rs create mode 100644 apis/adc/src/tests.rs create mode 100644 examples/adc.rs diff --git a/Cargo.toml b/Cargo.toml index aefbca93..1e4879ae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ libtock_low_level_debug = { path = "apis/low_level_debug" } libtock_platform = { path = "platform" } libtock_runtime = { path = "runtime" } libtock_temperature = { path = "apis/temperature" } +libtock_adc = { path = "apis/adc"} [profile.dev] panic = "abort" @@ -50,4 +51,5 @@ members = [ "tools/print_sizes", "ufmt", "unittest", + "apis/adc", ] diff --git a/apis/adc/Cargo.toml b/apis/adc/Cargo.toml new file mode 100644 index 00000000..eb650054 --- /dev/null +++ b/apis/adc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "libtock_adc" +version = "0.1.0" +authors = ["Tock Project Developers "] +license = "MIT/Apache-2.0" +edition = "2021" +repository = "https://www.github.com/tock/libtock-rs" +description = "libtock adc driver" + +[dependencies] +libtock_platform = { path = "../../platform" } + +[dev-dependencies] +libtock_unittest = { path = "../../unittest" } diff --git a/apis/adc/src/lib.rs b/apis/adc/src/lib.rs new file mode 100644 index 00000000..d94f1d57 --- /dev/null +++ b/apis/adc/src/lib.rs @@ -0,0 +1,46 @@ +#![no_std] + +//use core::cell::Cell; +use libtock_platform::{ + share, subscribe::OneId, CommandReturn, DefaultConfig, ErrorCode, Subscribe, Syscalls, Upcall, +}; + +pub struct Adc(S); + +impl Adc { + pub fn count(x: &mut u32) -> Result<(), ErrorCode> { + match S::command(DRIVER_NUM, COUNT, 0, 0).get_success_u32() { + Some(value) => { + *x = value; + Ok(()) + } + None => Err(ErrorCode::Fail), + } + } + + pub fn exists() -> Result<(), ErrorCode> { + let mut check = 0; + match Self::count(&mut check) { + Ok(_) if check >= 1 => Ok(()), + Ok(_) => Err(ErrorCode::Fail), + Err(_) => Err(ErrorCode::Fail), + } + } +} + +pub struct AdcListener(pub F); +impl Upcall> for AdcListener { + fn upcall(&self, adc_val: u32, _arg1: u32, _arg2: u32) { + self.0(adc_val as i32) + } +} + +// ----------------------------------------------------------------------------- +// Driver number and command IDs +// ----------------------------------------------------------------------------- + +const DRIVER_NUM: u32 = 0x00005; + +// Command IDs + +const COUNT: u32 = 0; diff --git a/apis/adc/src/tests.rs b/apis/adc/src/tests.rs new file mode 100644 index 00000000..e69de29b diff --git a/examples/adc.rs b/examples/adc.rs new file mode 100644 index 00000000..d29705f8 --- /dev/null +++ b/examples/adc.rs @@ -0,0 +1,22 @@ +#![no_main] +#![no_std] + +use core::fmt::Write; +use libtock::console::Console; + +use libtock::adc::Adc; +use libtock::runtime::{set_main, stack_size}; + +set_main! {main} +stack_size! {0x200} + +fn main() { + // let mut data = 0; + match Adc::exists() { + Ok(()) => writeln!(Console::writer(), "adc driver available").unwrap(), + Err(_) => { + writeln!(Console::writer(), "adc driver unavailable").unwrap(); + return; + } + } +} diff --git a/src/lib.rs b/src/lib.rs index c13b39db..e5d71622 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,3 +44,9 @@ pub mod temperature { pub type Temperature = temperature::Temperature; pub use temperature::TemperatureListener; } + +pub mod adc { + use libtock_adc as adc; + pub type Adc = adc::Adc; + pub use adc::AdcListener; +}