Skip to content

Commit 66d8b16

Browse files
authored
Wb fixes (#3)
1 parent 909657f commit 66d8b16

32 files changed

+3120
-464
lines changed

.github/workflows/whiteboard.yml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
on: [push]
2+
name: Build Whiteboard
3+
jobs:
4+
whiteboard_hypercard:
5+
name: for reMarkable
6+
runs-on: ubuntu-latest
7+
steps:
8+
- uses: actions/checkout@v2
9+
- run: docker volume inspect cargo-registry >/dev/null 2>&1 || docker volume create cargo-registry
10+
- working-directory: marauder
11+
run: |
12+
docker run \
13+
-t --rm \
14+
--user builder \
15+
-v "$PWD":/home/builder/libremarkable:rw \
16+
-v cargo-registry:/home/builder/.cargo/registry \
17+
-w /home/builder/libremarkable \
18+
fenollp/rust-build-remarkable \
19+
cargo build --release --bin whiteboard --target=armv7-unknown-linux-gnueabihf --locked #--frozen #--offline
20+
- working-directory: marauder
21+
run: ls -lha ./target/*/release/*
22+
- working-directory: marauder
23+
run: ls -lha ./target/armv7-unknown-linux-gnueabihf/release/whiteboard

.github/workflows/workflow.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ jobs:
1111
toolchain: nightly # TODO: stable once const-fn is in
1212
target: armv7-unknown-linux-musleabihf
1313
override: true
14+
- run: rustup component add rustfmt --toolchain nightly-x86_64-unknown-linux-gnu
1415
- run: make ujipenchars2.txt
1516
working-directory: marauder
1617
- run: make test
@@ -21,3 +22,4 @@ jobs:
2122
command: build
2223
working-directory: marauder
2324
args: --release --frozen --locked --offline --target armv7-unknown-linux-musleabihf
25+
continue-on-error: true

docker-compose.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ services:
1212
- *NATS_USER
1313
- --pass
1414
- *NATS_PASS
15+
- -m
16+
- '8222'
1517
- -DVV
1618
ports:
1719
- '127.0.0.1:4222:4222'
@@ -23,9 +25,9 @@ services:
2325
- nats
2426
build: ./whiteboard-server
2527
image: wb
26-
# hostname: wb
27-
# container_name: wb
28-
# restart: unless-stopped
28+
hostname: wb
29+
container_name: wb
30+
restart: unless-stopped
2931
environment:
3032
PORT: '10000'
3133
NATS_USER: *NATS_USER

marauder/Cargo.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

marauder/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "marauder"
3-
version = "0.2.0"
3+
version = "0.3.0"
44
authors = ["Pierre Fenoll <pierrefenoll@gmail.com>"]
55
edition = "2018"
66

marauder/Makefile

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@ whiteboard: DEVICE ?= root@10.11.99.1
5555
whiteboard: HOST ?= http://fknwkdacd.com:10000
5656
whiteboard: EXE = whiteboard
5757
whiteboard: BIN = ./target/armv7-unknown-linux-gnueabihf/release/$(EXE)
58+
whiteboard: VOLUME ?= cargoregistry
5859
whiteboard: fmt docker-env
59-
# cross build --release --bin $(EXE) --target=$(TARGET) --frozen --locked --offline
60-
docker volume inspect cargo-registry >/dev/null 2>&1 || docker volume create cargo-registry
60+
docker volume inspect $(VOLUME) >/dev/null 2>&1 || docker volume create $(VOLUME)
61+
# TODO: https://github.com/toltec-dev/toolchain/issues/2
6162
docker run \
62-
-t --rm \
63+
-it --rm \
6364
--user builder \
64-
-v $(shell pwd):/home/builder/libremarkable:rw \
65-
-v cargo-registry:/home/builder/.cargo/registry \
65+
-v "$$PWD":/home/builder/libremarkable:rw \
66+
-v $(VOLUME):/home/builder/.cargo/registry \
6667
-w /home/builder/libremarkable \
6768
$(IMG) \
6869
cargo build --release --bin $(EXE) --target=armv7-unknown-linux-gnueabihf #--locked #--frozen #--offline
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,14 @@
1+
# https://github.com/toltec-dev/toolchain/blob/cb0b263d908c1fc80ec8d0fc03c2b8f020d58c95/rust/config
2+
3+
[build]
4+
target = "armv7-unknown-linux-gnueabihf"
5+
16
[target.armv7-unknown-linux-gnueabihf]
27
linker = "arm-linux-gnueabihf-gcc"
8+
rustflags = [
9+
"-C", "link-arg=-march=armv7-a",
10+
"-C", "link-arg=-marm",
11+
"-C", "link-arg=-mfpu=neon",
12+
"-C", "link-arg=-mfloat-abi=hard",
13+
"-C", "link-arg=-mcpu=cortex-a9",
14+
]

marauder/proto/hypercard/whiteboard.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ message Event {
3535
Drawing drawing = 4;
3636
bool user_left_the_room = 5;
3737
bool user_joined_the_room = 6;
38+
uint32 users_in_the_room = 7;
3839
}
3940
}
4041

marauder/src/bin/whiteboard.rs

Lines changed: 127 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,25 @@ use libremarkable::ui_extensions::element::UIConstraintRefresh;
1515
use libremarkable::ui_extensions::element::UIElement;
1616
use libremarkable::ui_extensions::element::UIElementWrapper;
1717
use log::{debug, error, info};
18+
use marauder::drawings;
1819
use marauder::modes::draw::DrawMode;
20+
use marauder::proto::whiteboard::whiteboard_client::WhiteboardClient;
21+
use marauder::proto::whiteboard::{drawing, event};
22+
use marauder::proto::whiteboard::{Drawing, Event};
23+
use marauder::proto::whiteboard::{RecvEventsReq, SendEventReq};
1924
use serde::Deserialize;
2025
use std::collections::VecDeque;
26+
use std::convert::TryInto;
2127
use std::process::Command;
22-
use std::sync::atomic::AtomicBool;
2328
use std::sync::atomic::Ordering;
29+
use std::sync::atomic::{AtomicBool, AtomicU32};
2430
use std::sync::Mutex;
2531
use std::time::Duration;
2632
use tokio::time::delay_for;
2733
use tonic::transport::Channel;
2834
use tonic::transport::Endpoint;
2935
use tonic::Request;
3036
use uuid::Uuid;
31-
use whiteboard::whiteboard_client::WhiteboardClient;
32-
use whiteboard::{drawing, event};
33-
use whiteboard::{Drawing, Event};
34-
use whiteboard::{RecvEventsReq, SendEventReq};
35-
36-
pub mod whiteboard {
37-
tonic::include_proto!("hypercard.whiteboard");
38-
}
3937

4038
const USAGE: &str = "
4139
reMarkable whiteboard HyperCard.
@@ -65,13 +63,14 @@ struct Ctx {
6563
}
6664

6765
const CANVAS_REGION: mxcfb_rect = mxcfb_rect {
68-
top: 720,
66+
top: 2 + 70,
6967
left: 0,
70-
height: 1080 + 50, //1850? 1900? !1872
68+
height: 1900,
7169
width: 1404,
7270
};
7371

7472
lazy_static! {
73+
static ref PEOPLE_COUNT: AtomicU32 = AtomicU32::new(0);
7574
static ref UNPRESS_OBSERVED: AtomicBool = AtomicBool::new(false);
7675
static ref WACOM_IN_RANGE: AtomicBool = AtomicBool::new(false);
7776
static ref WACOM_HISTORY: Mutex<VecDeque<(cgmath::Point2<f32>, i32)>> =
@@ -80,6 +79,9 @@ lazy_static! {
8079
static ref TX: Mutex<Option<std::sync::mpsc::Sender<Drawing>>> = Mutex::new(None);
8180
}
8281

82+
const DRAWING_PACE: Duration = Duration::from_millis(2);
83+
const INTER_DRAWING_PACE: Duration = Duration::from_millis(8);
84+
8385
#[tokio::main]
8486
async fn main() -> Result<(), Box<dyn std::error::Error>> {
8587
env_logger::init();
@@ -112,14 +114,19 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
112114
inner: UIElement::Region {
113115
size: CANVAS_REGION.size().cast().unwrap() + cgmath::vec2(1, 3),
114116
border_px: 2,
115-
border_color: color::BLACK,
117+
border_color: color::WHITE,
116118
},
117119
..Default::default()
118120
},
119121
);
120122

121123
app.draw_elements();
122124

125+
let appref0 = app.upgrade_ref();
126+
tokio::spawn(async move {
127+
paint_mouldings(appref0).await;
128+
});
129+
123130
let host = args.clone().flag_host;
124131
info!("[main] connecting to {:?}...", host);
125132
let ch = Endpoint::from_shared(host).unwrap().connect().await?;
@@ -356,6 +363,15 @@ fn on_btn(app: &mut ApplicationContext, input: gpio::GPIOEvent) {
356363
gpio::PhysicalButton::MIDDLE | gpio::PhysicalButton::LEFT => {
357364
app.clear(btn == gpio::PhysicalButton::MIDDLE);
358365
app.draw_elements();
366+
367+
let appref = app.upgrade_ref();
368+
// TODO: make libremarkable async
369+
tokio::task::spawn_blocking(move || {
370+
let rt_handle = tokio::runtime::Handle::current();
371+
rt_handle.block_on(async move {
372+
paint_mouldings(appref).await;
373+
});
374+
});
359375
}
360376
gpio::PhysicalButton::POWER => {
361377
Command::new("systemctl")
@@ -403,17 +419,20 @@ async fn loop_recv(app: &mut ApplicationContext<'_>, ch: Channel, ctx: Ctx) {
403419
paint(app, drawing).await;
404420
info!("[loop_recv] painted");
405421
}
422+
Some(event::Event::UsersInTheRoom(c)) => {
423+
let old = PEOPLE_COUNT.swap(c, Ordering::Relaxed);
424+
repaint_people_counter(app, old, c).await;
425+
info!("[loop_recv] room {:?} has {:?} users", event.in_room_id, c);
426+
}
406427
Some(event::Event::UserJoinedTheRoom(_)) => {
407-
info!(
408-
"[loop_recv] user {:?} joined room {:?}",
409-
event.by_user_id, event.in_room_id
410-
);
428+
info!("[loop_recv] user {:?} joined room", event.by_user_id);
429+
let c = PEOPLE_COUNT.fetch_add(1, Ordering::Relaxed);
430+
repaint_people_counter(app, c, c + 1).await;
411431
}
412432
Some(event::Event::UserLeftTheRoom(_)) => {
413-
info!(
414-
"[loop_recv] user {:?} left room {:?}",
415-
event.by_user_id, event.in_room_id
416-
);
433+
info!("[loop_recv] user {:?} left room", event.by_user_id);
434+
let c = PEOPLE_COUNT.fetch_sub(1, Ordering::Relaxed);
435+
repaint_people_counter(app, c, c - 1).await;
417436
}
418437
},
419438
};
@@ -428,7 +447,7 @@ async fn paint(app: &mut ApplicationContext<'_>, drawing: Drawing) {
428447
let (xs, ys, ps, ws) = (drawing.xs, drawing.ys, drawing.pressures, drawing.widths);
429448
for i in 0..(xs.len() - 2) {
430449
if i != 0 {
431-
delay_for(Duration::from_millis(2)).await;
450+
delay_for(DRAWING_PACE).await;
432451
}
433452
let points: Vec<(cgmath::Point2<f32>, i32, u32)> = vec![
434453
// start
@@ -511,3 +530,90 @@ async fn send_drawing(client: &mut WhiteboardClient<Channel>, drawing: Drawing,
511530
.map_err(|e| error!("!Send: {:?}", e));
512531
info!("REP = {:?}", rep);
513532
}
533+
534+
fn drawing_for_people_counter(c: u32, color: drawing::Color) -> Vec<Drawing> {
535+
match c {
536+
0 => drawings::top_right_0::f(color),
537+
1 => drawings::top_right_1::f(color),
538+
2 => drawings::top_right_2::f(color),
539+
3 => drawings::top_right_3::f(color),
540+
4 => drawings::top_right_4::f(color),
541+
5 => drawings::top_right_5::f(color),
542+
6 => drawings::top_right_6::f(color),
543+
7 => drawings::top_right_7::f(color),
544+
8 => drawings::top_right_8::f(color),
545+
9 => drawings::top_right_9::f(color),
546+
_ => {
547+
info!("drawing PEOPLE_COUNT of 9 even though it's at {:?}", c);
548+
drawings::top_right_9::f(color)
549+
}
550+
}
551+
}
552+
553+
async fn paint_vec(app: &mut ApplicationContext<'_>, xs: Vec<Drawing>) {
554+
let mut i = 0;
555+
let len = xs.len();
556+
for x in xs {
557+
if i != 0 && i != len {
558+
delay_for(INTER_DRAWING_PACE).await;
559+
}
560+
paint(app, x).await;
561+
i += 1;
562+
}
563+
}
564+
565+
async fn repaint_people_counter(app: &mut ApplicationContext<'_>, o: u32, n: u32) {
566+
paint_vec(app, drawing_for_people_counter(o, drawing::Color::White)).await;
567+
paint_vec(app, drawing_for_people_counter(n, drawing::Color::Black)).await;
568+
}
569+
570+
async fn paint_mouldings(app: &mut ApplicationContext<'_>) {
571+
let c = drawing::Color::Black;
572+
let appref0 = app.upgrade_ref();
573+
debug!("[paint_mouldings] drawing UI...");
574+
tokio::spawn(async move {
575+
let appref1 = appref0.upgrade_ref();
576+
tokio::spawn(async move {
577+
paint(appref1, top_bar(c)).await;
578+
579+
delay_for(INTER_DRAWING_PACE).await;
580+
// TODO: tools
581+
// let appref2 = appref1.upgrade_ref();
582+
// tokio::spawn(async move {
583+
// paint_vec(appref2, drawings::top_left_help::f(c)).await;
584+
// });
585+
// let appref3 = appref1.upgrade_ref();
586+
// tokio::spawn(async move {
587+
// paint_vec(appref3, drawings::top_left_white_empty_square::f(c)).await;
588+
// });
589+
// let appref4 = appref1.upgrade_ref();
590+
// tokio::spawn(async move {
591+
// paint_vec(appref4, drawings::top_left_x3::f(c)).await;
592+
// });
593+
let count = PEOPLE_COUNT.load(Ordering::Relaxed);
594+
let appref5 = appref1.upgrade_ref();
595+
tokio::spawn(async move {
596+
paint_vec(appref5, drawing_for_people_counter(count, c)).await;
597+
});
598+
});
599+
delay_for(INTER_DRAWING_PACE).await;
600+
paint_vec(appref0, drawings::title_whiteboard::f(c)).await;
601+
});
602+
debug!("[paint_mouldings] drawing UI... Done.");
603+
}
604+
605+
fn top_bar(c: drawing::Color) -> Drawing {
606+
let (start, end): (usize, usize) = (1, CANVAS_REGION.width.try_into().unwrap());
607+
let count = (end - start + 1) / 2;
608+
Drawing {
609+
xs: (start..end)
610+
.into_iter()
611+
.step_by(2)
612+
.map(|x| x as f32)
613+
.collect(),
614+
ys: vec![70.444; count],
615+
pressures: vec![3992; count],
616+
widths: vec![2; count],
617+
color: c as i32,
618+
}
619+
}

0 commit comments

Comments
 (0)