tangled
alpha
login
or
join now
baileytownsend.dev
/
rusty-badger
0
fork
atom
A personal rust firmware for the Badger 2040 W
0
fork
atom
overview
issues
pulls
pipelines
drop the a. just sync
baileytownsend.dev
5 months ago
e067a8bb
58ef915b
+68
-125
2 changed files
expand all
collapse all
unified
split
src
pcf85063a
alarm.rs
datetime.rs
+64
-118
src/pcf85063a/alarm.rs
···
1
1
use super::{BitFlags, Control, DEVICE_ADDRESS, Error, PCF85063, Register, decode_bcd, encode_bcd};
2
2
-
use embedded_hal_async::i2c::I2c;
2
2
+
use embedded_hal_1::i2c::I2c;
3
3
use time::Time;
4
4
5
5
impl<I2C, E> PCF85063<I2C>
···
7
7
I2C: I2c<Error = E>,
8
8
{
9
9
/// Set the alarm seconds, minutes and hours, keeping the AE bit unchanged.
10
10
-
pub async fn set_alarm_time(&mut self, time: Time) -> Result<(), Error<E>> {
11
11
-
self.set_alarm_seconds(time.second()).await?;
12
12
-
self.set_alarm_minutes(time.minute()).await?;
13
13
-
self.set_alarm_hours(time.hour()).await?;
10
10
+
pub fn set_alarm_time(&mut self, time: Time) -> Result<(), Error<E>> {
11
11
+
self.set_alarm_seconds(time.second())?;
12
12
+
self.set_alarm_minutes(time.minute())?;
13
13
+
self.set_alarm_hours(time.hour())?;
14
14
Ok(())
15
15
}
16
16
···
23
23
let data: u8 = data & BitFlags::AE; // keep the AE bit as is
24
24
let setting: u8 = encode_bcd(seconds);
25
25
let data: u8 = data | setting;
26
26
-
self.write_register(Register::SECOND_ALARM, data).await
26
26
+
self.write_register(Register::SECOND_ALARM, data)
27
27
}
28
28
29
29
/// Set the alarm minutes [0-59], keeping the AE bit unchanged.
30
30
-
pub async fn set_alarm_minutes(&mut self, minutes: u8) -> Result<(), Error<E>> {
30
30
+
pub fn set_alarm_minutes(&mut self, minutes: u8) -> Result<(), Error<E>> {
31
31
if minutes > 59 {
32
32
return Err(Error::InvalidInputData);
33
33
}
34
34
-
let data: u8 = self.read_register(Register::MINUTE_ALARM).await?; // read current value
34
34
+
let data: u8 = self.read_register(Register::MINUTE_ALARM)?; // read current value
35
35
let data: u8 = data & BitFlags::AE; // keep the AE bit as is
36
36
let setting: u8 = encode_bcd(minutes);
37
37
let data: u8 = data | setting;
38
38
-
self.write_register(Register::MINUTE_ALARM, data).await
38
38
+
self.write_register(Register::MINUTE_ALARM, data)
39
39
}
40
40
41
41
/// Set the alarm hours [0-23], keeping the AE bit unchanged.
42
42
-
pub async fn set_alarm_hours(&mut self, hours: u8) -> Result<(), Error<E>> {
42
42
+
pub fn set_alarm_hours(&mut self, hours: u8) -> Result<(), Error<E>> {
43
43
if hours > 23 {
44
44
return Err(Error::InvalidInputData);
45
45
}
46
46
-
let data: u8 = self.read_register(Register::HOUR_ALARM).await?; // read current value
46
46
+
let data: u8 = self.read_register(Register::HOUR_ALARM)?; // read current value
47
47
let data: u8 = data & BitFlags::AE; // keep the AE bit as is
48
48
let setting: u8 = encode_bcd(hours);
49
49
let data: u8 = data | setting;
50
50
-
self.write_register(Register::HOUR_ALARM, data).await
50
50
+
self.write_register(Register::HOUR_ALARM, data)
51
51
}
52
52
53
53
/// Set the alarm day [1-31], keeping the AE bit unchanged.
54
54
-
pub async fn set_alarm_day(&mut self, day: u8) -> Result<(), Error<E>> {
54
54
+
pub fn set_alarm_day(&mut self, day: u8) -> Result<(), Error<E>> {
55
55
if !(1..=31).contains(&day) {
56
56
return Err(Error::InvalidInputData);
57
57
}
58
58
-
let data: u8 = self.read_register(Register::DAY_ALARM).await?; // read current value
58
58
+
let data: u8 = self.read_register(Register::DAY_ALARM)?; // read current value
59
59
let data: u8 = data & BitFlags::AE; // keep the AE bit as is
60
60
let setting: u8 = encode_bcd(day);
61
61
let data: u8 = data | setting;
62
62
-
self.write_register(Register::DAY_ALARM, data).await
62
62
+
self.write_register(Register::DAY_ALARM, data)
63
63
}
64
64
65
65
/// Set the alarm weekday [0-6], keeping the AE bit unchanged.
66
66
-
pub async fn set_alarm_weekday(&mut self, weekday: u8) -> Result<(), Error<E>> {
66
66
+
pub fn set_alarm_weekday(&mut self, weekday: u8) -> Result<(), Error<E>> {
67
67
if weekday > 6 {
68
68
return Err(Error::InvalidInputData);
69
69
}
70
70
-
let data: u8 = self.read_register(Register::WEEKDAY_ALARM).await?; // read current value
70
70
+
let data: u8 = self.read_register(Register::WEEKDAY_ALARM)?; // read current value
71
71
let data: u8 = data & BitFlags::AE; // keep the AE bit as is
72
72
let setting: u8 = encode_bcd(weekday);
73
73
let data: u8 = data | setting;
74
74
-
self.write_register(Register::WEEKDAY_ALARM, data).await
74
74
+
self.write_register(Register::WEEKDAY_ALARM, data)
75
75
}
76
76
77
77
/// Control alarm seconds (On: alarm enabled, Off: alarm disabled).
78
78
-
pub async fn control_alarm_seconds(&mut self, status: Control) -> Result<(), Error<E>> {
78
78
+
pub fn control_alarm_seconds(&mut self, status: Control) -> Result<(), Error<E>> {
79
79
match status {
80
80
-
Control::Off => {
81
81
-
self.set_register_bit_flag(Register::SECOND_ALARM, BitFlags::AE)
82
82
-
.await
83
83
-
}
84
84
-
Control::On => {
85
85
-
self.clear_register_bit_flag(Register::SECOND_ALARM, BitFlags::AE)
86
86
-
.await
87
87
-
}
80
80
+
Control::Off => self.set_register_bit_flag(Register::SECOND_ALARM, BitFlags::AE),
81
81
+
Control::On => self.clear_register_bit_flag(Register::SECOND_ALARM, BitFlags::AE),
88
82
}
89
83
}
90
84
91
85
/// Is alarm seconds enabled?
92
92
-
pub async fn is_alarm_seconds_enabled(&mut self) -> Result<bool, Error<E>> {
93
93
-
Ok(!self
94
94
-
.is_register_bit_flag_high(Register::SECOND_ALARM, BitFlags::AE)
95
95
-
.await?)
86
86
+
pub fn is_alarm_seconds_enabled(&mut self) -> Result<bool, Error<E>> {
87
87
+
Ok(!self.is_register_bit_flag_high(Register::SECOND_ALARM, BitFlags::AE)?)
96
88
}
97
89
98
90
/// Control alarm minutes (On: alarm enabled, Off: alarm disabled).
99
99
-
pub async fn control_alarm_minutes(&mut self, status: Control) -> Result<(), Error<E>> {
91
91
+
pub fn control_alarm_minutes(&mut self, status: Control) -> Result<(), Error<E>> {
100
92
match status {
101
101
-
Control::Off => {
102
102
-
self.set_register_bit_flag(Register::MINUTE_ALARM, BitFlags::AE)
103
103
-
.await
104
104
-
}
105
105
-
Control::On => {
106
106
-
self.clear_register_bit_flag(Register::MINUTE_ALARM, BitFlags::AE)
107
107
-
.await
108
108
-
}
93
93
+
Control::Off => self.set_register_bit_flag(Register::MINUTE_ALARM, BitFlags::AE),
94
94
+
Control::On => self.clear_register_bit_flag(Register::MINUTE_ALARM, BitFlags::AE),
109
95
}
110
96
}
111
97
112
98
/// Is alarm minutes enabled?
113
113
-
pub async fn is_alarm_minutes_enabled(&mut self) -> Result<bool, Error<E>> {
114
114
-
Ok(!self
115
115
-
.is_register_bit_flag_high(Register::MINUTE_ALARM, BitFlags::AE)
116
116
-
.await?)
99
99
+
pub fn is_alarm_minutes_enabled(&mut self) -> Result<bool, Error<E>> {
100
100
+
Ok(!self.is_register_bit_flag_high(Register::MINUTE_ALARM, BitFlags::AE)?)
117
101
}
118
102
119
103
/// Control alarm hours (On: alarm enabled, Off: alarm disabled).
120
120
-
pub async fn control_alarm_hours(&mut self, status: Control) -> Result<(), Error<E>> {
104
104
+
pub fn control_alarm_hours(&mut self, status: Control) -> Result<(), Error<E>> {
121
105
match status {
122
122
-
Control::Off => {
123
123
-
self.set_register_bit_flag(Register::HOUR_ALARM, BitFlags::AE)
124
124
-
.await
125
125
-
}
126
126
-
Control::On => {
127
127
-
self.clear_register_bit_flag(Register::HOUR_ALARM, BitFlags::AE)
128
128
-
.await
129
129
-
}
106
106
+
Control::Off => self.set_register_bit_flag(Register::HOUR_ALARM, BitFlags::AE),
107
107
+
Control::On => self.clear_register_bit_flag(Register::HOUR_ALARM, BitFlags::AE),
130
108
}
131
109
}
132
110
133
111
/// Is alarm hours enabled?
134
134
-
pub async fn is_alarm_hours_enabled(&mut self) -> Result<bool, Error<E>> {
135
135
-
Ok(!self
136
136
-
.is_register_bit_flag_high(Register::HOUR_ALARM, BitFlags::AE)
137
137
-
.await?)
112
112
+
pub fn is_alarm_hours_enabled(&mut self) -> Result<bool, Error<E>> {
113
113
+
Ok(!self.is_register_bit_flag_high(Register::HOUR_ALARM, BitFlags::AE)?)
138
114
}
139
115
140
116
/// Control alarm day (On: alarm enabled, Off: alarm disabled).
141
141
-
pub async fn control_alarm_day(&mut self, status: Control) -> Result<(), Error<E>> {
117
117
+
pub fn control_alarm_day(&mut self, status: Control) -> Result<(), Error<E>> {
142
118
match status {
143
143
-
Control::Off => {
144
144
-
self.set_register_bit_flag(Register::DAY_ALARM, BitFlags::AE)
145
145
-
.await
146
146
-
}
147
147
-
Control::On => {
148
148
-
self.clear_register_bit_flag(Register::DAY_ALARM, BitFlags::AE)
149
149
-
.await
150
150
-
}
119
119
+
Control::Off => self.set_register_bit_flag(Register::DAY_ALARM, BitFlags::AE),
120
120
+
Control::On => self.clear_register_bit_flag(Register::DAY_ALARM, BitFlags::AE),
151
121
}
152
122
}
153
123
154
124
/// Is alarm day enabled?
155
155
-
pub async fn is_alarm_day_enabled(&mut self) -> Result<bool, Error<E>> {
156
156
-
Ok(!self
157
157
-
.is_register_bit_flag_high(Register::DAY_ALARM, BitFlags::AE)
158
158
-
.await?)
125
125
+
pub fn is_alarm_day_enabled(&mut self) -> Result<bool, Error<E>> {
126
126
+
Ok(!self.is_register_bit_flag_high(Register::DAY_ALARM, BitFlags::AE)?)
159
127
}
160
128
161
129
/// Control alarm weekday (On: alarm enabled, Off: alarm disabled).
162
162
-
pub async fn control_alarm_weekday(&mut self, status: Control) -> Result<(), Error<E>> {
130
130
+
pub fn control_alarm_weekday(&mut self, status: Control) -> Result<(), Error<E>> {
163
131
match status {
164
164
-
Control::Off => {
165
165
-
self.set_register_bit_flag(Register::WEEKDAY_ALARM, BitFlags::AE)
166
166
-
.await
167
167
-
}
168
168
-
Control::On => {
169
169
-
self.clear_register_bit_flag(Register::WEEKDAY_ALARM, BitFlags::AE)
170
170
-
.await
171
171
-
}
132
132
+
Control::Off => self.set_register_bit_flag(Register::WEEKDAY_ALARM, BitFlags::AE),
133
133
+
Control::On => self.clear_register_bit_flag(Register::WEEKDAY_ALARM, BitFlags::AE),
172
134
}
173
135
}
174
136
175
137
/// Is alarm weekday enabled?
176
176
-
pub async fn is_alarm_weekday_enabled(&mut self) -> Result<bool, Error<E>> {
177
177
-
Ok(!self
178
178
-
.is_register_bit_flag_high(Register::WEEKDAY_ALARM, BitFlags::AE)
179
179
-
.await?)
138
138
+
pub fn is_alarm_weekday_enabled(&mut self) -> Result<bool, Error<E>> {
139
139
+
Ok(!self.is_register_bit_flag_high(Register::WEEKDAY_ALARM, BitFlags::AE)?)
180
140
}
181
141
182
142
/// Enable or disable alarm interrupt.
183
183
-
pub async fn control_alarm_interrupt(&mut self, status: Control) -> Result<(), Error<E>> {
143
143
+
pub fn control_alarm_interrupt(&mut self, status: Control) -> Result<(), Error<E>> {
184
144
match status {
185
185
-
Control::On => {
186
186
-
self.set_register_bit_flag(Register::CONTROL_2, BitFlags::AIE)
187
187
-
.await
188
188
-
}
189
189
-
Control::Off => {
190
190
-
self.clear_register_bit_flag(Register::CONTROL_2, BitFlags::AIE)
191
191
-
.await
192
192
-
}
145
145
+
Control::On => self.set_register_bit_flag(Register::CONTROL_2, BitFlags::AIE),
146
146
+
Control::Off => self.clear_register_bit_flag(Register::CONTROL_2, BitFlags::AIE),
193
147
}
194
148
}
195
149
196
196
-
pub async fn get_alarm_time(&mut self) -> Result<Time, Error<E>> {
150
150
+
pub fn get_alarm_time(&mut self) -> Result<Time, Error<E>> {
197
151
Ok(Time::from_hms(
198
198
-
self.get_alarm_hours().await?,
199
199
-
self.get_alarm_minutes().await?,
200
200
-
self.get_alarm_seconds().await?,
152
152
+
self.get_alarm_hours()?,
153
153
+
self.get_alarm_minutes()?,
154
154
+
self.get_alarm_seconds()?,
201
155
)?)
202
156
}
203
157
204
158
/// Read the alarm seconds setting.
205
205
-
pub async fn get_alarm_seconds(&mut self) -> Result<u8, Error<E>> {
159
159
+
pub fn get_alarm_seconds(&mut self) -> Result<u8, Error<E>> {
206
160
let mut data = [0];
207
161
self.i2c
208
162
.write_read(DEVICE_ADDRESS, &[Register::SECOND_ALARM], &mut data)
209
209
-
.await
210
163
.map_err(Error::I2C)?;
211
164
Ok(decode_bcd(data[0]))
212
165
}
213
166
214
167
/// Read the alarm minutes setting.
215
215
-
pub async fn get_alarm_minutes(&mut self) -> Result<u8, Error<E>> {
168
168
+
pub fn get_alarm_minutes(&mut self) -> Result<u8, Error<E>> {
216
169
let mut data = [0];
217
170
self.i2c
218
171
.write_read(DEVICE_ADDRESS, &[Register::MINUTE_ALARM], &mut data)
219
219
-
.await
220
172
.map_err(Error::I2C)?;
221
173
Ok(decode_bcd(data[0]))
222
174
}
223
175
224
176
/// Read the alarm hours setting.
225
225
-
pub async fn get_alarm_hours(&mut self) -> Result<u8, Error<E>> {
177
177
+
pub fn get_alarm_hours(&mut self) -> Result<u8, Error<E>> {
226
178
let mut data = [0];
227
179
self.i2c
228
180
.write_read(DEVICE_ADDRESS, &[Register::HOUR_ALARM], &mut data)
229
229
-
.await
230
181
.map_err(Error::I2C)?;
231
182
Ok(decode_bcd(data[0]))
232
183
}
233
184
234
185
/// Read the alarm day setting.
235
235
-
pub async fn get_alarm_day(&mut self) -> Result<u8, Error<E>> {
186
186
+
pub fn get_alarm_day(&mut self) -> Result<u8, Error<E>> {
236
187
let mut data = [0];
237
188
self.i2c
238
189
.write_read(DEVICE_ADDRESS, &[Register::DAY_ALARM], &mut data)
239
239
-
.await
240
190
.map_err(Error::I2C)?;
241
191
Ok(decode_bcd(data[0]))
242
192
}
243
193
244
194
/// Read the alarm weekday setting.
245
245
-
pub async fn get_alarm_weekday(&mut self) -> Result<u8, Error<E>> {
195
195
+
pub fn get_alarm_weekday(&mut self) -> Result<u8, Error<E>> {
246
196
let mut data = [0];
247
197
self.i2c
248
198
.write_read(DEVICE_ADDRESS, &[Register::WEEKDAY_ALARM], &mut data)
249
249
-
.await
250
199
.map_err(Error::I2C)?;
251
200
Ok(decode_bcd(data[0]))
252
201
}
253
202
254
203
/// Get the alarm flag (if true, alarm event happened).
255
255
-
pub async fn get_alarm_flag(&mut self) -> Result<bool, Error<E>> {
204
204
+
pub fn get_alarm_flag(&mut self) -> Result<bool, Error<E>> {
256
205
self.is_register_bit_flag_high(Register::CONTROL_2, BitFlags::AF)
257
257
-
.await
258
206
}
259
207
260
208
/// Clear the alarm flag.
261
261
-
pub async fn clear_alarm_flag(&mut self) -> Result<(), Error<E>> {
209
209
+
pub fn clear_alarm_flag(&mut self) -> Result<(), Error<E>> {
262
210
self.clear_register_bit_flag(Register::CONTROL_2, BitFlags::AF)
263
263
-
.await
264
211
}
265
212
266
213
/// Check if alarm interrupt is enabled.
267
267
-
pub async fn is_alarm_interrupt_enabled(&mut self) -> Result<bool, Error<E>> {
214
214
+
pub fn is_alarm_interrupt_enabled(&mut self) -> Result<bool, Error<E>> {
268
215
self.is_register_bit_flag_high(Register::CONTROL_2, BitFlags::AIE)
269
269
-
.await
270
216
}
271
217
272
218
/// Shut off the alarms at once.
273
273
-
pub async fn disable_all_alarms(&mut self) -> Result<(), Error<E>> {
274
274
-
self.control_alarm_seconds(Control::Off).await?;
275
275
-
self.control_alarm_minutes(Control::Off).await?;
276
276
-
self.control_alarm_hours(Control::Off).await?;
277
277
-
self.control_alarm_day(Control::Off).await?;
278
278
-
self.control_alarm_weekday(Control::Off).await?;
219
219
+
pub fn disable_all_alarms(&mut self) -> Result<(), Error<E>> {
220
220
+
self.control_alarm_seconds(Control::Off)?;
221
221
+
self.control_alarm_minutes(Control::Off)?;
222
222
+
self.control_alarm_hours(Control::Off)?;
223
223
+
self.control_alarm_day(Control::Off)?;
224
224
+
self.control_alarm_weekday(Control::Off)?;
279
225
Ok(())
280
226
}
281
227
}
+4
-7
src/pcf85063a/datetime.rs
···
7
7
//! a convenient set_time() function could be added (sets only seconds, minutes and hours)
8
8
9
9
use super::{DEVICE_ADDRESS, Error, PCF85063, Register, decode_bcd, encode_bcd};
10
10
-
use embedded_hal_async::i2c::I2c;
10
10
+
use embedded_hal_1::i2c::I2c;
11
11
use time::{Date, PrimitiveDateTime, Time};
12
12
13
13
impl<I2C, E> PCF85063<I2C>
···
15
15
I2C: I2c<Error = E>,
16
16
{
17
17
/// Read date and time all at once.
18
18
-
pub async fn get_datetime(&mut self) -> Result<PrimitiveDateTime, Error<E>> {
18
18
+
pub fn get_datetime(&mut self) -> Result<PrimitiveDateTime, Error<E>> {
19
19
let mut data = [0; 7];
20
20
self.i2c
21
21
.write_read(DEVICE_ADDRESS, &[Register::SECONDS], &mut data)
22
22
-
.await
23
22
.map_err(Error::I2C)?;
24
23
25
24
Ok(PrimitiveDateTime::new(
···
37
36
}
38
37
39
38
/// Set date and time all at once.
40
40
-
pub async fn set_datetime(&mut self, datetime: &PrimitiveDateTime) -> Result<(), Error<E>> {
39
39
+
pub fn set_datetime(&mut self, datetime: &PrimitiveDateTime) -> Result<(), Error<E>> {
41
40
let payload = [
42
41
Register::SECONDS, //first register
43
42
encode_bcd(datetime.second()),
···
50
49
];
51
50
self.i2c
52
51
.write(DEVICE_ADDRESS, &payload)
53
53
-
.await
54
52
.map_err(Error::I2C)
55
53
}
56
54
57
55
/// Set only the time, date remains unchanged.
58
56
///
59
57
/// Will return an 'Error::InvalidInputData' if any of the parameters is out of range.
60
60
-
pub async fn set_time(&mut self, time: &Time) -> Result<(), Error<E>> {
58
58
+
pub fn set_time(&mut self, time: &Time) -> Result<(), Error<E>> {
61
59
let payload = [
62
60
Register::SECONDS, //first register
63
61
encode_bcd(time.second()),
···
66
64
];
67
65
self.i2c
68
66
.write(DEVICE_ADDRESS, &payload)
69
69
-
.await
70
67
.map_err(Error::I2C)
71
68
}
72
69
}