From 7344d6f4e06703b25975cd4610d159093195a892 Mon Sep 17 00:00:00 2001 From: glyph Date: Tue, 23 Nov 2021 10:52:26 +0200 Subject: [PATCH] minor variable name changes and updated error handling --- peach-oled/src/lib.rs | 169 ++++++++++++++++++------------------------ 1 file changed, 71 insertions(+), 98 deletions(-) diff --git a/peach-oled/src/lib.rs b/peach-oled/src/lib.rs index d66dc5f..eb012e6 100644 --- a/peach-oled/src/lib.rs +++ b/peach-oled/src/lib.rs @@ -6,23 +6,23 @@ use std::{ sync::{Arc, Mutex}, }; -use embedded_graphics::coord::Coord; -use embedded_graphics::fonts::{Font12x16, Font6x12, Font6x8, Font8x16}; -use embedded_graphics::image::Image1BPP; -use embedded_graphics::prelude::*; +use embedded_graphics::{ + coord::Coord, + fonts::{Font12x16, Font6x12, Font6x8, Font8x16}, + image::Image1BPP, + prelude::*, +}; use hal::I2cdev; use jsonrpc_core::{types::error::Error, IoHandler, Params, Value}; use jsonrpc_http_server::{AccessControlAllowOrigin, DomainsValidation, ServerBuilder}; use linux_embedded_hal as hal; use log::{debug, error, info}; use serde::Deserialize; -use snafu::{ensure, ResultExt}; -use ssd1306::prelude::*; -use ssd1306::Builder; +use ssd1306::{prelude::*, Builder}; -use crate::error::{BoxError, I2CError, InvalidCoordinate, InvalidString, OledError}; +use crate::error::OledError; -//define the Graphic struct for receiving draw commands +// define the Graphic struct for receiving draw commands #[derive(Debug, Deserialize)] pub struct Graphic { bytes: Vec, @@ -32,7 +32,7 @@ pub struct Graphic { y_coord: i32, } -//define the Msg struct for receiving write commands +// define the Msg struct for receiving write commands #[derive(Debug, Deserialize)] pub struct Msg { x_coord: i32, @@ -41,86 +41,61 @@ pub struct Msg { font_size: String, } -//definte the On struct for receiving power on/off commands +// definte the On struct for receiving power on/off commands #[derive(Debug, Deserialize)] pub struct On { on: bool, } -fn validate(m: &Msg) -> Result<(), OledError> { - ensure!( - m.string.len() <= 21, - InvalidString { - len: m.string.len() - } - ); - - ensure!( - m.x_coord >= 0, - InvalidCoordinate { +fn validate(msg: &Msg) -> Result<(), OledError> { + if msg.string.len() > 21 { + Err(OledError::InvalidString { + len: msg.string.len(), + }) + } else if msg.x_coord < 0 || msg.x_coord > 128 { + Err(OledError::InvalidCoordinate { coord: "x".to_string(), range: "0-128".to_string(), - value: m.x_coord, - } - ); - - ensure!( - m.x_coord < 129, - InvalidCoordinate { - coord: "x".to_string(), - range: "0-128".to_string(), - value: m.x_coord, - } - ); - - ensure!( - m.y_coord >= 0, - InvalidCoordinate { + value: msg.x_coord, + }) + } else if msg.y_coord < 0 || msg.y_coord > 147 { + Err(OledError::InvalidCoordinate { coord: "y".to_string(), range: "0-47".to_string(), - value: m.y_coord, - } - ); - - ensure!( - m.y_coord < 148, - InvalidCoordinate { - coord: "y".to_string(), - range: "0-47".to_string(), - value: m.y_coord, - } - ); - - Ok(()) + value: msg.y_coord, + }) + } else { + Ok(()) + } } -pub fn run() -> Result<(), BoxError> { +pub fn run() -> Result<(), OledError> { info!("Starting up."); debug!("Creating interface for I2C device."); - let i2c = I2cdev::new("/dev/i2c-1").context(I2CError)?; + let i2c = I2cdev::new("/dev/i2c-1").map_err(|source| OledError::I2CError { source })?; - let mut disp: GraphicsMode<_> = Builder::new().connect_i2c(i2c).into(); + let mut display: GraphicsMode<_> = Builder::new().connect_i2c(i2c).into(); info!("Initializing the display."); - disp.init().unwrap_or_else(|_| { + display.init().unwrap_or_else(|_| { error!("Problem initializing the OLED display."); process::exit(1); }); debug!("Flushing the display."); - disp.flush().unwrap_or_else(|_| { + display.flush().unwrap_or_else(|_| { error!("Problem flushing the OLED display."); process::exit(1); }); - let oled = Arc::new(Mutex::new(disp)); + let oled = Arc::new(Mutex::new(display)); let oled_clone = Arc::clone(&oled); info!("Creating JSON-RPC I/O handler."); let mut io = IoHandler::default(); - io.add_method("clear", move |_| { + io.add_sync_method("clear", move |_| { let mut oled = oled_clone.lock().unwrap(); info!("Clearing the display."); oled.clear(); @@ -134,21 +109,20 @@ pub fn run() -> Result<(), BoxError> { let oled_clone = Arc::clone(&oled); - io.add_method("draw", move |params: Params| { - let g: Result = params.parse(); - let g: Graphic = g?; + io.add_sync_method("draw", move |params: Params| { + let graphic: Graphic = params.parse()?; // TODO: add simple byte validation function let mut oled = oled_clone.lock().unwrap(); info!("Drawing image to the display."); - let im = - Image1BPP::new(&g.bytes, g.width, g.height).translate(Coord::new(g.x_coord, g.y_coord)); - oled.draw(im.into_iter()); + let image = Image1BPP::new(&graphic.bytes, graphic.width, graphic.height) + .translate(Coord::new(graphic.x_coord, graphic.y_coord)); + oled.draw(image.into_iter()); Ok(Value::String("success".into())) }); let oled_clone = Arc::clone(&oled); - io.add_method("flush", move |_| { + io.add_sync_method("flush", move |_| { let mut oled = oled_clone.lock().unwrap(); info!("Flushing the display."); oled.flush().unwrap_or_else(|_| { @@ -160,9 +134,9 @@ pub fn run() -> Result<(), BoxError> { let oled_clone = Arc::clone(&oled); - io.add_method("ping", |_| Ok(Value::String("success".to_string()))); + io.add_sync_method("ping", |_| Ok(Value::String("success".to_string()))); - io.add_method("power", move |params: Params| { + io.add_sync_method("power", move |params: Params| { let o: Result = params.parse(); let o: On = o?; let mut oled = oled_clone.lock().unwrap(); @@ -180,37 +154,36 @@ pub fn run() -> Result<(), BoxError> { let oled_clone = Arc::clone(&oled); - io.add_method("write", move |params: Params| { + io.add_sync_method("write", move |params: Params| { info!("Received a 'write' request."); - let m: Result = params.parse(); - let m: Msg = m?; - validate(&m)?; + let msg = params.parse()?; + validate(&msg)?; let mut oled = oled_clone.lock().unwrap(); info!("Writing to the display."); - if m.font_size == "6x8" { + if msg.font_size == "6x8" { oled.draw( - Font6x8::render_str(&m.string) - .translate(Coord::new(m.x_coord, m.y_coord)) + Font6x8::render_str(&msg.string) + .translate(Coord::new(msg.x_coord, msg.y_coord)) .into_iter(), ); - } else if m.font_size == "6x12" { + } else if msg.font_size == "6x12" { oled.draw( - Font6x12::render_str(&m.string) - .translate(Coord::new(m.x_coord, m.y_coord)) + Font6x12::render_str(&msg.string) + .translate(Coord::new(msg.x_coord, msg.y_coord)) .into_iter(), ); - } else if m.font_size == "8x16" { + } else if msg.font_size == "8x16" { oled.draw( - Font8x16::render_str(&m.string) - .translate(Coord::new(m.x_coord, m.y_coord)) + Font8x16::render_str(&msg.string) + .translate(Coord::new(msg.x_coord, msg.y_coord)) .into_iter(), ); - } else if m.font_size == "12x16" { + } else if msg.font_size == "12x16" { oled.draw( - Font12x16::render_str(&m.string) - .translate(Coord::new(m.x_coord, m.y_coord)) + Font12x16::render_str(&msg.string) + .translate(Coord::new(msg.x_coord, msg.y_coord)) .into_iter(), ); } @@ -255,7 +228,7 @@ mod tests { fn rpc_success() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_success_response", |_| { + io.add_sync_method("rpc_success_response", |_| { Ok(Value::String("success".into())) }); test_rpc::Rpc::from(io) @@ -269,7 +242,7 @@ mod tests { fn rpc_internal_error() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_internal_error", |_| Err(Error::internal_error())); + io.add_sync_method("rpc_internal_error", |_| Err(Error::internal_error())); test_rpc::Rpc::from(io) }; @@ -287,7 +260,7 @@ mod tests { fn rpc_i2c_io_error() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_i2c_io_error", |_| { + io.add_sync_method("rpc_i2c_io_error", |_| { let io_err = IoError::new(ErrorKind::PermissionDenied, "oh no!"); let source = LinuxI2CError::Io(io_err); Err(Error::from(OledError::I2CError { source })) @@ -310,7 +283,7 @@ mod tests { fn rpc_i2c_nix_error() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_i2c_nix_error", |_| { + io.add_sync_method("rpc_i2c_nix_error", |_| { let nix_err = NixError::InvalidPath; let source = LinuxI2CError::Nix(nix_err); Err(Error::from(OledError::I2CError { source })) @@ -326,14 +299,14 @@ mod tests { }"# ); } - */ + */ // test to ensure correct InvalidCoordinate error response #[test] fn rpc_invalid_coord() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_invalid_coord", |_| { + io.add_sync_method("rpc_invalid_coord", |_| { Err(Error::from(OledError::InvalidCoordinate { coord: "x".to_string(), range: "0-128".to_string(), @@ -357,7 +330,7 @@ mod tests { fn rpc_invalid_fontsize() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_invalid_fontsize", |_| { + io.add_sync_method("rpc_invalid_fontsize", |_| { Err(Error::from(OledError::InvalidFontSize { font: "24x32".to_string(), })) @@ -379,7 +352,7 @@ mod tests { fn rpc_invalid_string() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_invalid_string", |_| { + io.add_sync_method("rpc_invalid_string", |_| { Err(Error::from(OledError::InvalidString { len: 22 })) }); test_rpc::Rpc::from(io) @@ -399,15 +372,15 @@ mod tests { fn rpc_invalid_params() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_invalid_params", |_| { - let e = Error { + io.add_sync_method("rpc_invalid_params", |_| { + let source = Error { code: ErrorCode::InvalidParams, message: String::from("invalid params"), data: Some(Value::String( "Invalid params: invalid type: null, expected struct Msg.".into(), )), }; - Err(Error::from(OledError::MissingParameter { e })) + Err(Error::from(OledError::MissingParameter { source })) }); test_rpc::Rpc::from(io) }; @@ -427,13 +400,13 @@ mod tests { fn rpc_parse_error() { let rpc = { let mut io = IoHandler::new(); - io.add_method("rpc_parse_error", |_| { - let e = Error { + io.add_sync_method("rpc_parse_error", |_| { + let source = Error { code: ErrorCode::ParseError, message: String::from("Parse error"), data: None, }; - Err(Error::from(OledError::ParseError { e })) + Err(Error::from(OledError::ParseError { source })) }); test_rpc::Rpc::from(io) };