diff --git a/.idea/epd_firmware.iml b/.idea/epd_firmware.iml
index 99b4861..0021fd7 100644
--- a/.idea/epd_firmware.iml
+++ b/.idea/epd_firmware.iml
@@ -17,6 +17,7 @@
+
diff --git a/Cargo.toml b/Cargo.toml
index 16f7481..4795997 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,6 +6,7 @@ members = [
"eepy",
"eepy-sys",
"eepy-serial",
+ "eepy-serial-host",
"eepy-gui",
"eepy-example-app",
"elf2epb",
diff --git a/eepy-launcher/src/serial.rs b/eepy-launcher/src/serial.rs
index 5737654..ed15405 100644
--- a/eepy-launcher/src/serial.rs
+++ b/eepy-launcher/src/serial.rs
@@ -7,7 +7,7 @@ use eepy_serial::{Response, SerialCommand};
use eepy_sys::flash::erase_and_program;
use eepy_sys::header::{slot, slot_ptr, Programs};
use eepy_sys::image::refresh;
-use eepy_sys::{header, IMAGE_BYTES};
+use eepy_sys::{header, image, IMAGE_BYTES};
use eepy_sys::input::{next_event, set_touch_enabled};
use eepy_sys::misc::{debug, info, trace};
use eepy_sys::usb::UsbBus;
@@ -20,6 +20,7 @@ enum SerialState {
ReceivingImage {
fast_refresh: bool,
+ maybe_refresh: bool,
index: usize,
},
@@ -96,35 +97,37 @@ pub(crate) extern "C" fn usb_handler() {
}
if HOST_APP.load(Ordering::Relaxed) {
- match SerialCommand::try_from(cmd_buf[0]) {
- Ok(SerialCommand::RefreshNormal) => *state = SerialState::ReceivingImage { fast_refresh: false, index: 0 },
- Ok(SerialCommand::RefreshFast) => *state = SerialState::ReceivingImage { fast_refresh: true, index: 0 },
- Ok(SerialCommand::ExitHostApp) => {
+ match SerialCommand::from_repr(cmd_buf[0]) {
+ Some(SerialCommand::RefreshNormal) => *state = SerialState::ReceivingImage { fast_refresh: false, maybe_refresh: false, index: 0 },
+ Some(SerialCommand::RefreshFast) => *state = SerialState::ReceivingImage { fast_refresh: true, maybe_refresh: false, index: 0 },
+ Some(SerialCommand::MaybeRefreshNormal) => *state = SerialState::ReceivingImage { fast_refresh: false, maybe_refresh: true, index: 0 },
+ Some(SerialCommand::MaybeRefreshFast) => *state = SerialState::ReceivingImage { fast_refresh: true, maybe_refresh: true, index: 0 },
+ Some(SerialCommand::ExitHostApp) => {
set_touch_enabled(true);
HOST_APP.store(false, Ordering::Relaxed);
NEEDS_REFRESH.store(true, Ordering::Relaxed);
write_all(serial, &[Response::Ack as u8]);
},
- Ok(SerialCommand::NextEvent) => {
+ Some(SerialCommand::NextEvent) => {
write_all(serial, &[Response::Ack as u8]);
write_all(serial, &postcard::to_vec::<_, 32>(&next_event()).unwrap());
},
- Ok(SerialCommand::EnableTouch) => {
+ Some(SerialCommand::EnableTouch) => {
set_touch_enabled(true);
write_all(serial, &[Response::Ack as u8]);
},
- Ok(SerialCommand::DisableTouch) => {
+ Some(SerialCommand::DisableTouch) => {
set_touch_enabled(false);
write_all(serial, &[Response::Ack as u8]);
},
- Ok(SerialCommand::EnterHostApp | SerialCommand::GetProgramSlot | SerialCommand::UploadProgram) => {
+ Some(SerialCommand::EnterHostApp | SerialCommand::GetProgramSlot | SerialCommand::UploadProgram) => {
write_all(serial, &[Response::IncorrectMode as u8]);
}
- Err(_) => write_all(serial, &[Response::UnknownCommand as u8]),
+ None => write_all(serial, &[Response::UnknownCommand as u8]),
}
} else {
- match SerialCommand::try_from(cmd_buf[0]) {
- Ok(SerialCommand::GetProgramSlot) => {
+ match SerialCommand::from_repr(cmd_buf[0]) {
+ Some(SerialCommand::GetProgramSlot) => {
if let Some(slot) = best_slot() {
write_all(serial, &[Response::Ack as u8, slot]);
PROG_SLOT.store(slot, Ordering::Relaxed);
@@ -132,7 +135,7 @@ pub(crate) extern "C" fn usb_handler() {
write_all(serial, &[Response::ProgramSlotsFull as u8]);
}
},
- Ok(SerialCommand::UploadProgram) => {
+ Some(SerialCommand::UploadProgram) => {
if PROG_SLOT.load(Ordering::Relaxed) == 0 {
write_all(serial, &[Response::NoProgramSlot as u8]);
} else {
@@ -141,31 +144,37 @@ pub(crate) extern "C" fn usb_handler() {
write_all(serial, &[Response::Ack as u8]);
}
},
- Ok(SerialCommand::EnterHostApp) => {
+ Some(SerialCommand::EnterHostApp) => {
HOST_APP.store(true, Ordering::Relaxed);
refresh(&[0u8; IMAGE_BYTES], false);
set_touch_enabled(false);
write_all(serial, &[Response::Ack as u8]);
},
- Ok(
+ Some(
SerialCommand::RefreshNormal
| SerialCommand::RefreshFast
+ | SerialCommand::MaybeRefreshNormal
+ | SerialCommand::MaybeRefreshFast
| SerialCommand::ExitHostApp
| SerialCommand::NextEvent
| SerialCommand::DisableTouch
| SerialCommand::EnableTouch
) => write_all(serial, &[Response::IncorrectMode as u8]),
- Err(_) => write_all(serial, &[Response::UnknownCommand as u8]),
+ None => write_all(serial, &[Response::UnknownCommand as u8]),
}
}
}
}
- SerialState::ReceivingImage { fast_refresh, index } => {
+ SerialState::ReceivingImage { fast_refresh, maybe_refresh, index } => {
if let Ok(count) = serial.read(&mut buf[*index..]) {
*index += count;
if *index == IMAGE_BYTES {
- refresh(buf, *fast_refresh);
+ if *maybe_refresh {
+ image::maybe_refresh(buf, *fast_refresh);
+ } else {
+ image::refresh(buf, *fast_refresh);
+ }
write_all(serial, &[Response::Ack as u8]);
*state = SerialState::ReadyForCommand;
}
diff --git a/eepy-serial-host/Cargo.toml b/eepy-serial-host/Cargo.toml
new file mode 100644
index 0000000..4dff859
--- /dev/null
+++ b/eepy-serial-host/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "eepy-serial-host"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+eepy-serial = { path = "../eepy-serial" }
+serialport.workspace = true
+postcard.workspace = true
\ No newline at end of file
diff --git a/eepy-serial-host/src/image.rs b/eepy-serial-host/src/image.rs
new file mode 100644
index 0000000..9b83938
--- /dev/null
+++ b/eepy-serial-host/src/image.rs
@@ -0,0 +1,16 @@
+use eepy_serial::SerialCommand;
+use crate::{Error, HostApp, Serial};
+
+pub const IMAGE_BYTES: usize = (240 * 416) / 8;
+
+impl Serial {
+ pub fn refresh(&mut self, fast: bool, image: &[u8; IMAGE_BYTES]) -> Result<(), Error> {
+ let cmd = if fast { SerialCommand::RefreshFast } else { SerialCommand::RefreshNormal };
+ self.write(cmd, image)
+ }
+
+ pub fn maybe_refresh(&mut self, fast: bool, image: &[u8; IMAGE_BYTES]) -> Result<(), Error> {
+ let cmd = if fast { SerialCommand::MaybeRefreshFast } else { SerialCommand::MaybeRefreshNormal };
+ self.write(cmd, image)
+ }
+}
\ No newline at end of file
diff --git a/eepy-serial-host/src/input.rs b/eepy-serial-host/src/input.rs
new file mode 100644
index 0000000..12438ab
--- /dev/null
+++ b/eepy-serial-host/src/input.rs
@@ -0,0 +1,16 @@
+use eepy_serial::{Event, SerialCommand};
+use crate::{Error, HostApp, Serial};
+
+impl Serial {
+ pub fn set_touch_enabled(&mut self, enabled: bool) -> Result<(), Error> {
+ let cmd = if enabled { SerialCommand::EnableTouch } else { SerialCommand::DisableTouch };
+ self.write(cmd, &[])
+ }
+
+ pub fn next_event(&mut self) -> Result