Skip to content

Commit

Permalink
use FakeTemperatureSensor as an actor
Browse files Browse the repository at this point in the history
  • Loading branch information
japaric committed Jun 7, 2022
1 parent 461da31 commit dfb263e
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 12 deletions.
28 changes: 21 additions & 7 deletions actor-example/actors/src/fake_temperature_sensor.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use rtic_actor_traits::Post;
use rtic_actor_traits::{Post, Receive};

use crate::TemperatureReadingCelsius;
use crate::{DoTemperatureRead, TemperatureReadingCelsius};

pub struct FakeTemperatureSensor<P>
where
Expand All @@ -23,8 +23,13 @@ where
temperature: initial_temperature,
}
}
}

pub fn read(&mut self) {
impl<P> Receive<DoTemperatureRead> for FakeTemperatureSensor<P>
where
P: Post<TemperatureReadingCelsius>,
{
fn receive(&mut self, _: DoTemperatureRead) {
self.outbox
.post(TemperatureReadingCelsius(self.temperature))
.expect("OOM");
Expand All @@ -41,7 +46,10 @@ mod tests {
#[test]
fn on_read_it_posts_reading() {
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), 0, 0);
sensor.read();

// manually send a message
let message = DoTemperatureRead;
sensor.receive(message);

let spy = sensor.outbox;
let posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();
Expand All @@ -52,7 +60,10 @@ mod tests {
fn reading_starts_at_initial_temperature() {
let initial_temperature = 1;
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), initial_temperature, 0);
sensor.read();

// manually send a message
let message = DoTemperatureRead;
sensor.receive(message);

let spy = sensor.outbox;
let mut posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();
Expand All @@ -67,8 +78,11 @@ mod tests {
let initial_temperature = 42;
let delta = 1;
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), initial_temperature, delta);
sensor.read();
sensor.read();

// manually send a message
let message = DoTemperatureRead;
sensor.receive(message);
sensor.receive(message);

let spy = sensor.outbox;
let mut posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();
Expand Down
3 changes: 3 additions & 0 deletions actor-example/actors/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ pub use fake_temperature_sensor::FakeTemperatureSensor;
pub use temperature_monitor::TemperatureMonitor;

// Messages
#[derive(Clone, Copy, Debug)]
pub struct DoTemperatureRead;

pub struct TemperatureAlert;

#[derive(Clone, Debug, PartialEq)]
Expand Down
17 changes: 12 additions & 5 deletions actor-example/firmware/src/bin/temperature-monitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ use firmware as _;
#[rtic::app(device = nrf52840_hal::pac, dispatchers = [RADIO])]
mod app {
use actors::{
FakeTemperatureSensor, TemperatureAlert, TemperatureMonitor, TemperatureReadingCelsius,
DoTemperatureRead, FakeTemperatureSensor, TemperatureAlert, TemperatureMonitor,
TemperatureReadingCelsius,
};
use rtic_actor_traits::Receive;
use systick_monotonic::*;
Expand Down Expand Up @@ -36,6 +37,9 @@ mod app {

#[actors]
struct Actors {
#[subscribe(DoTemperatureRead)]
temperature_sensor: FakeTemperatureSensor<Poster>,

#[init(AlertHandler)]
#[subscribe(TemperatureAlert)]
alert_handler: AlertHandler,
Expand All @@ -50,7 +54,7 @@ mod app {

#[local]
struct Local {
temperature_sensor: FakeTemperatureSensor<Poster>,
poster: Poster,
}

#[monotonic(binds = SysTick, default = true)]
Expand All @@ -71,17 +75,20 @@ mod app {

(
Shared {},
Local { temperature_sensor },
Local { poster },
init::Monotonics(mono),
Actors {
temperature_monitor,
temperature_sensor,
},
)
}

#[task(local = [temperature_sensor])]
#[task(local = [poster])]
fn periodic(cx: periodic::Context) {
cx.local.temperature_sensor.read();
// input to the actor network
cx.local.poster.post(DoTemperatureRead).expect("OOM");

periodic::spawn_after(1.secs()).expect("OOM");
}

Expand Down

0 comments on commit dfb263e

Please sign in to comment.