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
I think the time and all that is working now
baileytownsend.dev
5 months ago
1cc510de
e067a8bb
+83
-32
5 changed files
expand all
collapse all
unified
split
Cargo.toml
src
main.rs
pcf85063a
datetime.rs
mod.rs
save.rs
+1
-1
Cargo.toml
···
106
106
debug = 2
107
107
108
108
[profile.dev]
109
109
-
debug = 1
109
109
+
debug = 2
110
110
lto = true
111
111
opt-level = "z"
112
112
+58
-13
src/main.rs
···
9
9
use core::cell::RefCell;
10
10
use core::fmt::Write;
11
11
use core::str::from_utf8;
12
12
+
use cortex_m::asm::delay;
12
13
use cyw43::JoinOptions;
13
14
use cyw43_pio::{DEFAULT_CLOCK_DIVIDER, PioSpi};
14
15
use defmt::info;
15
16
use defmt::*;
17
17
+
use embassy_embedded_hal::shared_bus::I2cDeviceError;
16
18
use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice;
17
19
use embassy_executor::Spawner;
18
20
use embassy_net::StackResources;
···
21
23
use embassy_rp::clocks::RoscRng;
22
24
use embassy_rp::flash::Async;
23
25
use embassy_rp::gpio::Input;
24
24
-
use embassy_rp::i2c::I2c;
26
26
+
use embassy_rp::i2c::{Error, I2c};
25
27
use embassy_rp::peripherals::{DMA_CH0, I2C0, PIO0, SPI0};
26
28
use embassy_rp::pio::{InterruptHandler, Pio};
27
29
use embassy_rp::rtc::{DateTime, DayOfWeek};
···
181
183
wifi_connection_attempts += 1;
182
184
}
183
185
186
186
+
//Setup i2c bus
187
187
+
let config = embassy_rp::i2c::Config::default();
188
188
+
let i2c = i2c::I2c::new_blocking(p.I2C0, p.PIN_5, p.PIN_4, config);
189
189
+
static I2C_BUS: StaticCell<I2c0Bus> = StaticCell::new();
190
190
+
let i2c_bus = NoopMutex::new(RefCell::new(i2c));
191
191
+
let i2c_bus = I2C_BUS.init(i2c_bus);
192
192
+
193
193
+
let i2c_dev = I2cDevice::new(i2c_bus);
194
194
+
let mut rtc_device = PCF85063::new(i2c_dev);
195
195
+
184
196
let mut time_was_set = false;
185
197
if connected_to_wifi {
186
198
info!("waiting for DHCP...");
···
212
224
&mut tls_write_buffer,
213
225
TlsVerify::None,
214
226
);
227
227
+
228
228
+
Timer::after(Duration::from_millis(500)).await;
215
229
// let mut http_client = HttpClient::new(&tcp_client, &dns_client);
216
230
let mut http_client = HttpClient::new_with_tls(&tcp_client, &dns_client, tls_config);
217
231
···
276
290
minute,
277
291
second: second as u8,
278
292
};
279
279
-
rtc.set_datetime(rtc_time).unwrap();
293
293
+
294
294
+
// // prepare date and time to be set
295
295
+
// let now = DateTime {
296
296
+
// year: 21, // 2021
297
297
+
// month: 4, // April
298
298
+
// weekday: 0, // Sunday
299
299
+
// day: 4,
300
300
+
// day_of_week: DayOfWeek::Sunday,
301
301
+
// hour,
302
302
+
// minute,
303
303
+
// hours: 16,
304
304
+
// minutes: 52,
305
305
+
// seconds: 00,
306
306
+
// second: 0,
307
307
+
// };
308
308
+
309
309
+
rtc_device
310
310
+
.set_datetime(&rtc_time)
311
311
+
.expect("TODO: panic message");
312
312
+
// rtc.set_datetime(rtc_time).unwrap();
280
313
time_was_set = true;
281
314
let _ = control.leave().await;
282
315
}
···
295
328
296
329
//Set up saving
297
330
let mut flash = embassy_rp::flash::Flash::<_, Async, FLASH_SIZE>::new(p.FLASH, p.DMA_CH3);
298
298
-
let mut save: Save = read_postcard_from_flash(ADDR_OFFSET, &mut flash, SAVE_OFFSET).unwrap();
331
331
+
//TODO baaaaaad
332
332
+
let mut save =
333
333
+
read_postcard_from_flash(ADDR_OFFSET, &mut flash, SAVE_OFFSET).unwrap_or_else(|err| {
334
334
+
error!("Error getting the save from the flash: {:?}", err);
335
335
+
Save::new()
336
336
+
});
299
337
WIFI_COUNT.store(save.wifi_counted, core::sync::atomic::Ordering::Relaxed);
300
300
-
301
301
-
//Setup i2c bus
302
302
-
let config = embassy_rp::i2c::Config::default();
303
303
-
let i2c = i2c::I2c::new_blocking(p.I2C0, p.PIN_5, p.PIN_4, config);
304
304
-
static I2C_BUS: StaticCell<I2c0Bus> = StaticCell::new();
305
305
-
let i2c_bus = NoopMutex::new(RefCell::new(i2c));
306
306
-
let i2c_bus = I2C_BUS.init(i2c_bus);
307
307
-
308
308
-
let i2c_dev = I2cDevice::new(i2c_bus);
309
309
-
let mut rtc_device = PCF85063::new(i2c_dev);
310
338
311
339
//Task spawning
312
340
spawner.must_spawn(run_the_temp_sensor(i2c_bus));
···
322
350
user_led.set_low();
323
351
324
352
loop {
353
353
+
//TODO take out
354
354
+
Timer::after(Duration::from_millis(5_000)).await;
355
355
+
356
356
+
let time = rtc_device.get_datetime().unwrap();
357
357
+
info!("Hour: {:?}", time.hour());
358
358
+
info!("Minute: {:?}", time.minute());
359
359
+
info!("Second: {:?}", time.second());
360
360
+
361
361
+
// match rtc_device.get_datetime() {
362
362
+
// Ok(time) => {
363
363
+
// info!("RTC time: {:?}", time.as_utc().time().minute());
364
364
+
// }
365
365
+
// Err(err) => {
366
366
+
// error!("Error reading rtc");
367
367
+
// }
368
368
+
// }
369
369
+
325
370
//Change Image Button
326
371
if btn_c.is_high() {
327
372
info!("Button C pressed");
+12
-14
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 embassy_rp::rtc::DateTime;
10
11
use embedded_hal_1::i2c::I2c;
11
12
use time::{Date, PrimitiveDateTime, Time};
12
13
···
36
37
}
37
38
38
39
/// Set date and time all at once.
39
39
-
pub fn set_datetime(&mut self, datetime: &PrimitiveDateTime) -> Result<(), Error<E>> {
40
40
+
pub fn set_datetime(&mut self, datetime: &DateTime) -> Result<(), Error<E>> {
40
41
let payload = [
41
42
Register::SECONDS, //first register
42
42
-
encode_bcd(datetime.second()),
43
43
-
encode_bcd(datetime.minute()),
44
44
-
encode_bcd(datetime.hour()),
45
45
-
encode_bcd(datetime.day()),
46
46
-
encode_bcd(datetime.weekday().number_days_from_sunday()),
47
47
-
encode_bcd(datetime.month().into()),
48
48
-
encode_bcd((datetime.year() - 2000) as u8),
43
43
+
encode_bcd(datetime.second),
44
44
+
encode_bcd(datetime.minute),
45
45
+
encode_bcd(datetime.hour),
46
46
+
encode_bcd(datetime.day),
47
47
+
//Not sure if this is correct
48
48
+
encode_bcd(datetime.day_of_week as u8),
49
49
+
encode_bcd(datetime.month),
50
50
+
encode_bcd((datetime.year - 2000) as u8),
49
51
];
50
50
-
self.i2c
51
51
-
.write(DEVICE_ADDRESS, &payload)
52
52
-
.map_err(Error::I2C)
52
52
+
self.i2c.write(DEVICE_ADDRESS, &payload).map_err(Error::I2C)
53
53
}
54
54
55
55
/// Set only the time, date remains unchanged.
···
62
62
encode_bcd(time.minute()),
63
63
encode_bcd(time.hour()),
64
64
];
65
65
-
self.i2c
66
66
-
.write(DEVICE_ADDRESS, &payload)
67
67
-
.map_err(Error::I2C)
65
65
+
self.i2c.write(DEVICE_ADDRESS, &payload).map_err(Error::I2C)
68
66
}
69
67
}
+3
-4
src/pcf85063a/mod.rs
···
1
1
-
#![no_std]
2
2
-
3
3
-
mod alarm;
4
4
-
mod datetime;
1
1
+
#![allow(dead_code)]
2
2
+
pub mod alarm;
3
3
+
pub mod datetime;
5
4
6
5
use embedded_hal_1::i2c::I2c;
7
6
+9
src/save.rs
···
60
60
pub wifi_counted: u32,
61
61
pub bssid: Vec<String<17>, BSSID_LEN>,
62
62
}
63
63
+
64
64
+
impl Save {
65
65
+
pub fn new() -> Self {
66
66
+
Self {
67
67
+
wifi_counted: 0,
68
68
+
bssid: Vec::new(),
69
69
+
}
70
70
+
}
71
71
+
}