Skip to content

Commit 11409f4

Browse files
authored
Merge pull request #20 from ckaznable/tick_rate
feat: add --tps flags
2 parents 4c4c4d6 + 8a89770 commit 11409f4

File tree

5 files changed

+40
-14
lines changed

5 files changed

+40
-14
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ Usage: tenki [OPTIONS]
4444
4545
Options:
4646
--mode <MODE> [default: rain] [rain, snow, meteor]
47-
--fps <FPS> [default: 60] [1-60]
47+
--fps <FPS> Frame Per Second [default: 60] [1-240]
48+
--tps <TPS> Tick Per Second [default: 60] [1-240]
4849
--show-fps Show fps at right-top in screen
4950
--timer-color <COLOR> Timer color [default: white] [red, green, blue, yellow, cyan, magenta, white, black]
5051
--wind <WIND> Decide on the direction of the rain/snow [defualt: random] [random, disable, only-right, only-left, right, left]

src/app.rs

+13-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ where
4444
terminal,
4545
state,
4646
args,
47-
tui: Tui::new(args.fps as f64)?,
47+
tui: Tui::new(args.fps as f64, args.tps as f64)?,
4848
should_quit: false,
4949
frame_in_second: 0,
5050
runtime_info: AppRuntimeInfo { fps: 0 },
@@ -60,8 +60,9 @@ where
6060
match event {
6161
Init => (),
6262
Quit | Error => self.should_quit = true,
63-
Render => self.on_render(),
63+
Render => self.on_render()?,
6464
Key(key) => self.handle_keyboard(key),
65+
Tick => self.on_tick(),
6566
Timer => self.on_timer(),
6667
Resize(columns, rows) => self.state.on_resize(columns, rows),
6768
};
@@ -70,8 +71,6 @@ where
7071
if self.should_quit {
7172
break;
7273
}
73-
74-
self.terminal.draw(|f| ui(f, &mut self.state, self.args, self.runtime_info))?;
7574
}
7675

7776
Ok(())
@@ -84,11 +83,20 @@ where
8483
}
8584
}
8685

87-
fn on_render(&mut self) {
86+
fn on_tick(&mut self) {
8887
self.state.tick();
8988
self.frame_in_second = self.frame_in_second.saturating_add(1);
9089
}
9190

91+
fn on_render(&mut self) -> anyhow::Result<()> {
92+
if self.args.fps == self.args.tps {
93+
self.on_tick()
94+
}
95+
96+
self.terminal.draw(|f| ui(f, &mut self.state, self.args, self.runtime_info))?;
97+
Ok(())
98+
}
99+
92100
fn on_timer(&mut self) {
93101
self.state.tick_timer();
94102
self.runtime_info.fps = self.frame_in_second;

src/cli.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,17 @@ pub struct Args {
1212
#[arg(long, default_value_t = Mode::Rain)]
1313
pub mode: Mode,
1414

15-
#[arg(long, value_parser = fps_range, default_value_t = 60)]
15+
/// frame per second
16+
#[arg(long, value_parser = process_rate_range, default_value_t = 60)]
1617
pub fps: u8,
1718

19+
/// tick per second
20+
#[arg(long, value_parser = process_rate_range, default_value_t = 60)]
21+
pub tps: u8,
22+
1823
/// effect level, The lower, the stronger [4-1000]
19-
#[arg(short, long, value_parser = level_range, default_value_t = 0)]
20-
pub level: u16,
24+
#[arg(short, long, value_parser = level_range)]
25+
pub level: Option<u16>,
2126

2227
/// color of the effect. [red, green, blue, yellow, cyan, magenta, white, black]
2328
#[arg(long, value_parser = Color::from_str, default_value = "white")]
@@ -32,8 +37,8 @@ pub struct Args {
3237
pub show_fps: bool,
3338
}
3439

35-
fn fps_range(s: &str) -> Result<u8, String> {
36-
number_range(s, 1, 60)
40+
fn process_rate_range(s: &str) -> Result<u8, String> {
41+
number_range(s, 1, 240)
3742
}
3843

3944
fn level_range(s: &str) -> Result<u16, String> {

src/tui.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,51 @@ pub enum Event {
1515
Quit,
1616
Error,
1717
Render,
18+
Tick,
1819
Timer,
1920
Key(KeyEvent),
2021
Resize(u16, u16),
2122
}
2223

2324
pub struct Tui {
2425
frame_rate: f64,
26+
tick_rate: f64,
2527
event_rx: UnboundedReceiver<Event>,
2628
event_tx: UnboundedSender<Event>,
2729
task: Option<JoinHandle<()>>,
2830
}
2931

3032
impl Tui {
31-
pub fn new(frame_rate: f64) -> Result<Self> {
33+
pub fn new(frame_rate: f64, tick_rate: f64) -> Result<Self> {
3234
let (event_tx, event_rx) = mpsc::unbounded_channel();
3335
let task = None;
3436
Ok(Self {
3537
task,
3638
event_rx,
3739
event_tx,
3840
frame_rate,
41+
tick_rate,
3942
})
4043
}
4144

4245
pub fn run(&mut self) {
4346
let render_delay = std::time::Duration::from_secs_f64(1.0 / self.frame_rate);
47+
let tick_delay = std::time::Duration::from_secs_f64(1.0 / self.tick_rate);
4448
let timer_delay = std::time::Duration::from_secs_f64(1.0);
4549
let _event_tx = self.event_tx.clone();
50+
let do_tick = self.frame_rate != self.tick_rate;
4651

4752
let task = tokio::spawn(async move {
4853
_event_tx.send(Event::Init).unwrap();
4954
waiting_time_to_sync();
5055

5156
let mut reader = crossterm::event::EventStream::new();
5257
let mut render_interval = tokio::time::interval(render_delay);
58+
let mut tick_interval = tokio::time::interval(tick_delay);
5359
let mut timer_interval = tokio::time::interval(timer_delay);
5460

5561
loop {
62+
let tick_delay = tick_interval.tick();
5663
let render_delay = render_interval.tick();
5764
let timer_delay = timer_interval.tick();
5865
let crossterm_event = reader.next().fuse();
@@ -78,6 +85,11 @@ impl Tui {
7885
None => (),
7986
}
8087
},
88+
_ = tick_delay => {
89+
if do_tick {
90+
_event_tx.send(Event::Tick).unwrap();
91+
}
92+
},
8193
_ = render_delay => {
8294
_event_tx.send(Event::Render).unwrap();
8395
},

src/weather/dropping.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ impl GeneralDropping {
1919
Self {
2020
wind: WindState::new(args.wind),
2121
dropping: DroppingState {
22-
threshold: if args.level == 0 { DEF_LEVEL } else { args.level },
22+
threshold: args.level.unwrap_or(DEF_LEVEL),
2323
mode: args.mode,
2424
},
2525
}
@@ -60,7 +60,7 @@ impl TailDropping {
6060
wind: WindState::new(args.wind.without_random()),
6161
tail: TailState::new(args.wind.into()),
6262
dropping: DroppingState {
63-
threshold: if args.level == 0 { DEF_TAIL_LEVEL } else { args.level },
63+
threshold: args.level.unwrap_or(DEF_TAIL_LEVEL),
6464
mode: args.mode,
6565
},
6666
}

0 commit comments

Comments
 (0)