1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//! a complete working example of the display system.
//!
//! This requires `cortex-m-rtfm` v0.5.
//!
//! It uses `TIMER1` to drive the display, and `RTC0` to update a simple
//! animated image.
//!
//! This code is also available as `examples/heartbeat.rs`.
//!
//! ```
//! #![no_main]
//! #![no_std]
//!
//! extern crate panic_semihosting;
//!
//! use rtfm::app;
//! use rmicrobit::nrf51;
//! use rmicrobit::nrf51_hal::lo_res_timer::{LoResTimer, FREQ_16HZ};
//! use rmicrobit::prelude::*;
//! use rmicrobit::display::{DisplayPort, MicrobitDisplay, MicrobitFrame};
//! use rmicrobit::gpio::PinsByKind;
//! use rmicrobit::graphics::image::GreyscaleImage;
//!
//! fn heart_image(inner_brightness: u8) -> GreyscaleImage {
//! let b = inner_brightness;
//! GreyscaleImage::new(&[
//! [0, 7, 0, 7, 0],
//! [7, b, 7, b, 7],
//! [7, b, b, b, 7],
//! [0, 7, b, 7, 0],
//! [0, 0, 7, 0, 0],
//! ])
//! }
//!
//! #[app(device = rmicrobit::nrf51, peripherals = true)]
//! const APP: () = {
//!
//! struct Resources {
//! display: MicrobitDisplay<nrf51::TIMER1>,
//! anim_timer: LoResTimer<nrf51::RTC0>,
//! }
//!
//! #[init]
//! fn init(cx: init::Context) -> init::LateResources {
//! let p: nrf51::Peripherals = cx.device;
//!
//! // Starting the low-frequency clock (needed for RTC to work)
//! p.CLOCK.tasks_lfclkstart.write(|w| unsafe { w.bits(1) });
//! while p.CLOCK.events_lfclkstarted.read().bits() == 0 {}
//! p.CLOCK.events_lfclkstarted.reset();
//!
//! let mut rtc0 = LoResTimer::new(p.RTC0);
//! // 16Hz; 62.5ms period
//! rtc0.set_frequency(FREQ_16HZ);
//! rtc0.enable_tick_event();
//! rtc0.enable_tick_interrupt();
//! rtc0.start();
//!
//! let PinsByKind {display_pins, ..} = p.GPIO.split_by_kind();
//! let display_port = DisplayPort::new(display_pins);
//! let display = MicrobitDisplay::new(display_port, p.TIMER1);
//!
//! init::LateResources {
//! display : display,
//! anim_timer : rtc0,
//! }
//! }
//!
//! #[task(binds = TIMER1, priority = 2,
//! resources = [display])]
//! fn timer1(cx: timer1::Context) {
//! cx.resources.display.handle_event();
//! }
//!
//! #[task(binds = RTC0, priority = 1,
//! resources = [anim_timer, display])]
//! fn rtc0(mut cx: rtc0::Context) {
//! static mut FRAME: MicrobitFrame = MicrobitFrame::const_default();
//! static mut STEP: u8 = 0;
//!
//! &cx.resources.anim_timer.clear_tick_event();
//!
//! let inner_brightness = match *STEP {
//! 0..=8 => 9-*STEP,
//! 9..=12 => 0,
//! _ => unreachable!()
//! };
//!
//! FRAME.set(&mut heart_image(inner_brightness));
//! cx.resources.display.lock(|display| {
//! display.set_frame(FRAME);
//! });
//!
//! *STEP += 1;
//! if *STEP == 13 {*STEP = 0};
//! }
//!
//! };
//!
//! ```