Skip to content

Commit d1145a1

Browse files
committed
use FakeTemperatureSensor as an actor
1 parent 5a3f275 commit d1145a1

File tree

3 files changed

+36
-12
lines changed

3 files changed

+36
-12
lines changed

actor-example/actors/src/fake_temperature_sensor.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use rtic_actor_traits::Post;
1+
use rtic_actor_traits::{Post, Receive};
22

3-
use crate::TemperatureReadingCelsius;
3+
use crate::{DoTemperatureRead, TemperatureReadingCelsius};
44

55
pub struct FakeTemperatureSensor<P>
66
where
@@ -23,8 +23,13 @@ where
2323
temperature: initial_temperature,
2424
}
2525
}
26+
}
2627

27-
pub fn read(&mut self) {
28+
impl<P> Receive<DoTemperatureRead> for FakeTemperatureSensor<P>
29+
where
30+
P: Post<TemperatureReadingCelsius>,
31+
{
32+
fn receive(&mut self, _: DoTemperatureRead) {
2833
self.outbox
2934
.post(TemperatureReadingCelsius(self.temperature))
3035
.expect("OOM");
@@ -41,7 +46,10 @@ mod tests {
4146
#[test]
4247
fn on_read_it_posts_reading() {
4348
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), 0, 0);
44-
sensor.read();
49+
50+
// manually send a message
51+
let message = DoTemperatureRead;
52+
sensor.receive(message);
4553

4654
let spy = sensor.outbox;
4755
let posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();
@@ -52,7 +60,10 @@ mod tests {
5260
fn reading_starts_at_initial_temperature() {
5361
let initial_temperature = 1;
5462
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), initial_temperature, 0);
55-
sensor.read();
63+
64+
// manually send a message
65+
let message = DoTemperatureRead;
66+
sensor.receive(message);
5667

5768
let spy = sensor.outbox;
5869
let mut posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();
@@ -67,8 +78,11 @@ mod tests {
6778
let initial_temperature = 42;
6879
let delta = 1;
6980
let mut sensor = FakeTemperatureSensor::new(PostSpy::default(), initial_temperature, delta);
70-
sensor.read();
71-
sensor.read();
81+
82+
// manually send a message
83+
let message = DoTemperatureRead;
84+
sensor.receive(message);
85+
sensor.receive(message);
7286

7387
let spy = sensor.outbox;
7488
let mut posted_messages = spy.posted_messages::<TemperatureReadingCelsius>();

actor-example/actors/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ pub use fake_temperature_sensor::FakeTemperatureSensor;
88
pub use temperature_monitor::TemperatureMonitor;
99

1010
// Messages
11+
#[derive(Clone, Copy, Debug)]
12+
pub struct DoTemperatureRead;
13+
1114
pub struct TemperatureAlert;
1215

1316
#[derive(Clone, Debug, PartialEq)]

actor-example/firmware/src/bin/temperature-monitor.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ use firmware as _;
66
#[rtic::app(device = nrf52840_hal::pac, dispatchers = [RADIO])]
77
mod app {
88
use actors::{
9-
FakeTemperatureSensor, TemperatureAlert, TemperatureMonitor, TemperatureReadingCelsius,
9+
DoTemperatureRead, FakeTemperatureSensor, TemperatureAlert, TemperatureMonitor,
10+
TemperatureReadingCelsius,
1011
};
1112
use rtic_actor_traits::Receive;
1213
use systick_monotonic::*;
@@ -36,6 +37,9 @@ mod app {
3637

3738
#[actors]
3839
struct Actors {
40+
#[subscribe(DoTemperatureRead)]
41+
temperature_sensor: FakeTemperatureSensor<Poster>,
42+
3943
#[init(AlertHandler)]
4044
#[subscribe(TemperatureAlert)]
4145
alert_handler: AlertHandler,
@@ -50,7 +54,7 @@ mod app {
5054

5155
#[local]
5256
struct Local {
53-
temperature_sensor: FakeTemperatureSensor<Poster>,
57+
poster: Poster,
5458
}
5559

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

7276
(
7377
Shared {},
74-
Local { temperature_sensor },
78+
Local { poster },
7579
init::Monotonics(mono),
7680
Actors {
7781
temperature_monitor,
82+
temperature_sensor,
7883
},
7984
)
8085
}
8186

82-
#[task(local = [temperature_sensor])]
87+
#[task(local = [poster])]
8388
fn periodic(cx: periodic::Context) {
84-
cx.local.temperature_sensor.read();
89+
// input to the actor network
90+
cx.local.poster.post(DoTemperatureRead).expect("OOM");
91+
8592
periodic::spawn_after(1.secs()).expect("OOM");
8693
}
8794

0 commit comments

Comments
 (0)