Skip to content

Commit

Permalink
Merge pull request #25 from Roco-scientist/tokio
Browse files Browse the repository at this point in the history
Tokio
  • Loading branch information
Roco-scientist authored Aug 16, 2021
2 parents 601e32a + 0401744 commit ffdb07a
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 70 deletions.
3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "mbta_countdown"
version = "0.3.2"
version = "0.4.0"
authors = ["Rory Coffey <coffeyrt@gmail.com>"]
edition = "2018"

Expand All @@ -20,3 +20,4 @@ clap = "2.33.0"
scraper = "0.12.0"
rayon = "1.5.1"
termion = "1.5.6"
tokio = { version = "1", features = ["full"] }
Binary file added Datasheet_TM1637.pdf
Binary file not shown.
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ This program creates two displays. One display counts down until the next arriva
<li>Raspberry Pi (zero W). <a href=https://www.adafruit.com/product/3400>Can be purchased here</a></li>
<li>ssd1306 display with I2C connection (SPI would not connect with Rust crates). <a href=https://www.amazon.com/IZOKEE-Display-SSD1306-Raspberry-White-IIC/dp/B076PDVFQD/>Can be purchased here</a></li>
<li>7 segment clock display. Adafruit 0.56" 4-Digit 7-Segment Display w/I2C Backpack. <a href=https://www.adafruit.com/product/3400>Can be purchased here</a></li>
<li>or tm1637 7 segment clock display. <a href=https://www.aliexpress.com/item/32965437463.html>Can be purchased here</a></li>
<li> Misc. electronics for prototyping: bread board, wiring, multimeter etc.</li>
<li>OpenSSL installed on Raspberry Pi</li>
</ul>
Expand All @@ -30,6 +31,14 @@ https://learn.adafruit.com/adafruit-led-backpack/0-dot-56-seven-segment-backpack
<tr><td>SDA</td><td>I2C SDA</td><td>3</td><td>GPIO2 (SDA)</td></tr>
<tr><td>SCL</td><td>I2C SCL</td><td>5</td><td>GPIO3 (SCL)</td></tr>
</table>
<br>Or TM1637 display
<table>
<tr><th>Label</th><th>Desc</th><th>RasPin</th><th>RasDesc</th></tr>
<tr><td>GND</td><td>Ground</td><td>6</td><td>Ground</td></tr>
<tr><td>VCC</td><td>3.3 V</td><td>1</td><td>3.3 Volts</td></tr>
<tr><td>DIO</td><td>Data IO line</td><td>13</td><td>GPIO27</td></tr>
<tr><td>CLK</td><td>Clock line</td><td>15</td><td>GPIO22</td></tr>
</table>

## How to run
`sudo apt-get install libssl-dev`<br>
Expand Down
165 changes: 96 additions & 69 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ use std;
use std::{
collections::HashMap,
io::{stdout, Read, Write},
thread, time,
sync::{Arc, Mutex},
time::Duration,
};
use termion;
use termion::{async_stdin, raw::IntoRawMode};

fn main() {
#[tokio::main]
async fn main() {
let (dir_code, station, clock_brightness, vehicle_code, clock_type) =
arguments().unwrap_or_else(|err| panic!("ERROR - train_times - {}", err));
let minimum_display_min = 5i64;
Expand Down Expand Up @@ -39,10 +41,8 @@ fn main() {
stdout_main.flush().unwrap();

// set quit to false to have a clean quit
let mut quit = false;
let quit = Arc::new(Mutex::new(false));

let mut screen = mbta_countdown::ssd1306_screen::ScreenDisplay::new(0x3c)
.unwrap_or_else(|err| panic!("ERROR - ScreenDisplay - {}", err));

let address;
if clock_type == "TM1637".to_string() {
Expand All @@ -53,75 +53,105 @@ fn main() {
let mut clock;
clock = mbta_countdown::clocks::Clocks::new(clock_type, clock_brightness, address)
.unwrap_or_else(|err| panic!("ERROR - clock - {}", err));
loop {
if quit {
break;
};
let train_times =
mbta_countdown::train_time::train_times(&dir_code, &station, &vehicle_code)
.unwrap_or_else(|err| panic!("ERROR - train_times - {}", err));
if let Some(ref train_times_list) = train_times {
screen
.display_trains(&train_times_list)
.unwrap_or_else(|err| panic!("ERROR - display_trains - {}", err));
} else {
screen
.clear_display(true)
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
};
// if there are some train times, display on clock and screen
if let Some(ref train_times_list) = train_times {
for _ in 0..240 {
thread::sleep(time::Duration::from_millis(250));
clock
.display_time_until(&train_times_list, &minimum_display_min)
.unwrap_or_else(|err| panic!("ERROR - display_time_until - {}", err));
let key_input = stdin.next();
match key_input {
Some(Ok(b'q')) => {
quit = true;
break;
}
Some(a) => {
write!(
stdout_main,
"{}{}",
termion::cursor::Goto(2, 1),
a.unwrap() as char
)
.unwrap();
stdout_main.flush().unwrap();
}
_ => (),
let train_times = Arc::new(Mutex::new(
mbta_countdown::train_time::train_times(&dir_code, &station, &vehicle_code)
.unwrap_or_else(|err| panic!("ERROR - train_times - {}", err)),
));
let train_times_clone = Arc::clone(&train_times);
let quit_clone = Arc::clone(&quit);
let screen_train_thread = tokio::spawn(async move {
let mut train_time_errors = 0u8;
let mut screen = mbta_countdown::ssd1306_screen::ScreenDisplay::new(0x3c)
.unwrap_or_else(|err| panic!("ERROR - ScreenDisplay - {}", err));
loop {
if *quit_clone.lock().unwrap() {
screen
.clear_display(true)
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
break;
};
if let Some(ref train_times_list) = *train_times_clone.lock().unwrap() {
screen
.display_trains(&train_times_list)
.unwrap_or_else(|err| panic!("ERROR - display_trains - {}", err));
} else {
screen
.clear_display(true)
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
};
for _ in 0..120u8 {
tokio::time::sleep(Duration::from_secs(1)).await;
if *quit_clone.lock().unwrap() {
screen
.clear_display(true)
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
break;
};
}
if let Ok(new_train_times) =
mbta_countdown::train_time::train_times(&dir_code, &station, &vehicle_code)
{
let mut train_times_unlocked = train_times_clone.lock().unwrap();
*train_times_unlocked = new_train_times;
train_time_errors = 0;
} else {
train_time_errors += 1;
if train_time_errors == 5 {
panic!("Unable to retrieve train times for 10 minutes");
}
}
}
});
loop {
tokio::time::sleep(Duration::from_millis(250)).await;
// if there are some train times, display on clock and screen
if let Some(ref train_times_list) = *train_times.lock().unwrap() {
clock
.display_time_until(&train_times_list, &minimum_display_min)
.unwrap_or_else(|err| panic!("ERROR - display_time_until - {}", err));
let key_input = stdin.next();
match key_input {
Some(Ok(b'q')) => {
*quit.lock().unwrap() = true;
break;
}
Some(a) => {
write!(
stdout_main,
"{}{}",
termion::cursor::Goto(2, 1),
a.unwrap() as char
)
.unwrap();
stdout_main.flush().unwrap();
}
_ => (),
};
} else {
clock
.clear_display()
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
for _ in 0..240 {
thread::sleep(time::Duration::from_millis(250));
let key_input = stdin.next();
match key_input {
Some(Ok(b'q')) => {
quit = true;
break;
}
Some(a) => {
write!(
stdout_main,
"{}{}",
termion::cursor::Goto(2, 1),
a.unwrap() as char
)
.unwrap();
stdout_main.flush().unwrap();
}
_ => (),
};
}
let key_input = stdin.next();
match key_input {
Some(Ok(b'q')) => {
*quit.lock().unwrap() = true;
break;
}
Some(a) => {
write!(
stdout_main,
"{}{}",
termion::cursor::Goto(2, 1),
a.unwrap() as char
)
.unwrap();
stdout_main.flush().unwrap();
}
_ => (),
};
};
}
screen_train_thread.await.unwrap_or_else(|err| panic!("ERROR - train thread - {}", err));
write!(
stdout_main,
"{}{}Finished",
Expand All @@ -135,9 +165,6 @@ fn main() {
clock
.clear_display()
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
screen
.clear_display(true)
.unwrap_or_else(|err| panic!("ERROR - clear_display - {}", err));
}

/// Gets the command line arguments
Expand Down

0 comments on commit ffdb07a

Please sign in to comment.