Skip to content

Commit

Permalink
additional no_std support
Browse files Browse the repository at this point in the history
  • Loading branch information
rudib committed Dec 19, 2021
1 parent 3041a0d commit bca093a
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 5 deletions.
6 changes: 3 additions & 3 deletions finny/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ readme = "../README.md"
derive_more = "0.99.11"
finny_derive = { path = "../finny_derive", version = "0.2.0" }
arraydeque = { version = "0.4", default-features = false }
slog = { version = "2.7.0", optional = true }

slog = { version = "2.7.0", optional = true, default-features = false }
heapless = { version = "0.7" }

[features]
default = ["std", "inspect_slog", "timers_std"]
std = ["arraydeque/std", "timers_std"]
std = ["arraydeque/std", "timers_std", "slog/std"]
inspect_slog = ["slog"]
timers_std = []
generate_plantuml = ["finny_derive/generate_plantuml"]
80 changes: 80 additions & 0 deletions finny/src/fsm/queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,79 @@ mod queue_array {

pub use self::queue_array::*;


pub mod heapless_shared {
//! A heapless queue with Clone and Arc support.

use core::sync::atomic::{AtomicUsize, Ordering};

use crate::FsmError;

use super::*;

extern crate alloc;
use alloc::sync::Arc;
use heapless::mpmc::Q64;

/// An unbound event queue that uses `VecDeque`.
pub struct FsmEventQueueHeaplessShared<F: FsmBackend> {
inner: Arc<Inner<F>>
}

impl<F> Clone for FsmEventQueueHeaplessShared<F> where F: FsmBackend {
fn clone(&self) -> Self {
Self { inner: self.inner.clone() }
}
}

struct Inner<F: FsmBackend> {
queue: Q64<<F as FsmBackend>::Events>,
len: AtomicUsize
}

impl<F: FsmBackend> FsmEventQueueHeaplessShared<F> {
pub fn new() -> Self {
let q = Q64::new();
let inner = Inner {
queue: q,
len: AtomicUsize::new(0)
};
FsmEventQueueHeaplessShared {
inner: Arc::new(inner)
}
}
}

impl<F: FsmBackend> FsmEventQueue<F> for FsmEventQueueHeaplessShared<F> {
fn dequeue(&mut self) -> Option<<F as FsmBackend>::Events> {
match self.inner.queue.dequeue() {
Some(e) => {
self.inner.len.fetch_sub(1, Ordering::SeqCst);
Some(e)
},
None => None
}
}

fn len(&self) -> usize {
self.inner.len.load(Ordering::SeqCst)
}
}

impl<F: FsmBackend> FsmEventQueueSender<F> for FsmEventQueueHeaplessShared<F> {
fn enqueue<E: Into<<F as FsmBackend>::Events>>(&mut self, event: E) -> FsmResult<()> {
match self.inner.queue.enqueue(event.into()) {
Ok(_) => {
self.inner.len.fetch_add(1, Ordering::SeqCst);
Ok(())
},
Err(_) => Err(FsmError::QueueOverCapacity)
}
}
}

}

pub struct FsmEventQueueNull<F> {
_ty: PhantomData<F>
}
Expand Down Expand Up @@ -260,6 +333,13 @@ fn test_dequeue_vec_shared() {
test_queue(queue);
}

#[test]
fn test_heapless_shared() {
use self::heapless_shared::FsmEventQueueHeaplessShared;
let queue = FsmEventQueueHeaplessShared::<TestFsm>::new();
test_queue(queue);
}

#[cfg(test)]
fn test_queue<Q: FsmEventQueue<TestFsm>>(mut queue: Q) {
use super::tests_fsm::{Events, EventA};
Expand Down
4 changes: 4 additions & 0 deletions finny/src/inspect/slog.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
extern crate alloc;

use slog::{info, o, error};
use crate::{FsmBackend, FsmBackendImpl, FsmEvent, Inspect, InspectEvent, InspectFsmEvent};
use crate::lib::*;
use AsRef;
use core::fmt::Debug;
use core::any::Any;
use alloc::string::ToString;
use alloc::format;

pub struct InspectSlog {
pub logger: slog::Logger
Expand Down
4 changes: 2 additions & 2 deletions finny_derive/src/codegen_meta.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ pub fn generate_fsm_meta(fsm: &FsmFnInput) -> TokenStream {

impl #fsm_info_ty {
pub fn plantuml_inner() -> String {
use std::fmt::Write;
use alloc::fmt::Write;

let mut output = ( #plant_uml_str ).to_string();

Expand All @@ -165,7 +165,7 @@ pub fn generate_fsm_meta(fsm: &FsmFnInput) -> TokenStream {
}

pub fn plantuml() -> String {
use std::fmt::Write;
use alloc::fmt::Write;

let mut output = String::new();

Expand Down

0 comments on commit bca093a

Please sign in to comment.