diff --git a/Cargo.lock b/Cargo.lock index f206184e3..13dad3927 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2254,6 +2254,7 @@ dependencies = [ "log", "num-derive", "num-traits", + "pddb", "percent-encoding", "serde", "trng", diff --git a/apps/mtxcli/Cargo.toml b/apps/mtxcli/Cargo.toml index 4fad08b42..2e8342b1c 100644 --- a/apps/mtxcli/Cargo.toml +++ b/apps/mtxcli/Cargo.toml @@ -29,6 +29,8 @@ codec = {path = "../../services/codec"} percent-encoding = "2.2" serde = { version = "1.0", features = [ "derive" ] } ureq = { version = "2.5", features = ["json"] } +# Xous APIs +pddb = {path = "../../services/pddb" } [features] default = [] diff --git a/apps/mtxcli/README.md b/apps/mtxcli/README.md index 9cefcfa89..4b564ef8f 100644 --- a/apps/mtxcli/README.md +++ b/apps/mtxcli/README.md @@ -64,6 +64,10 @@ Xous please see the [locales README](https://github.com/betrusted-io/xous-core/b ## Troubleshooting +Prequisites: it is essential that the PDDB is mounted and WiFi is +connected before running mtxcli. You can verify these in Shellchat +with `net ping 1.1.1.1`. + If you see the message `WARNING: clock not set` that is likely because the Precursor real time clock needs to be set (e.g. if the battery has been completely discharged). Please go to the menu diff --git a/apps/mtxcli/locales/i18n.json b/apps/mtxcli/locales/i18n.json index a6dc0fdf4..5f9b384cc 100644 --- a/apps/mtxcli/locales/i18n.json +++ b/apps/mtxcli/locales/i18n.json @@ -104,6 +104,13 @@ "ja": "not connected *EN*", "zh": "not connected *EN*" }, + "mtxcli.pddb.warning": { + "en": "WARNING: pddb not mounted", + "en-tts": "WARNING: pddb not mounted", + "fr": "AVERTISSEMENT: pddb pas monté", + "ja": "WARNING: pddb not mounted *EN*", + "zh": "WARNING: pddb not mounted *EN*" + }, "mtxcli.please.set.password": { "en": "please /set password my-password", "en-tts": "please /set password my-password", @@ -180,5 +187,12 @@ "fr": "/unset clé", "ja": "/unset key *EN*", "zh": "/unset key *EN*" + }, + "mtxcli.wifi.warning": { + "en": "WARNING: WiFi not connected", + "en-tts": "WARNING: WiFi not connected", + "fr": "AVERTISSEMENT: WiFi pas connecté", + "ja": "WARNING: WiFi not connected *EN*", + "zh": "WARNING: WiFi not connected *EN*" } } diff --git a/apps/mtxcli/src/cmds.rs b/apps/mtxcli/src/cmds.rs index caca54299..f50f28ced 100644 --- a/apps/mtxcli/src/cmds.rs +++ b/apps/mtxcli/src/cmds.rs @@ -39,6 +39,8 @@ const EMPTY: &str = ""; const MTX_TIMEOUT: i32 = 300; // ms pub const CLOCK_NOT_SET_ID: usize = 1; +pub const PDDB_NOT_MOUNTED_ID: usize = 2; +pub const WIFI_NOT_CONNECTED_ID: usize = 3; /// Returns a version string which is more likely to string compare /// correctly vs. another version. FFI please see @@ -196,7 +198,7 @@ impl CommonEnv { let mut keypath = PathBuf::new(); keypath.push(MTXCLI_DICT); if std::fs::metadata(&keypath).is_ok() { // keypath exists - // log::info!("dict '{}' exists", MTXCLI_DICT); + log::info!("dict '{}' exists", MTXCLI_DICT); } else { log::info!("dict '{}' does NOT exist.. creating it", MTXCLI_DICT); std::fs::create_dir_all(&keypath)?; @@ -280,15 +282,19 @@ impl CommonEnv { let mut keypath = PathBuf::new(); keypath.push(MTXCLI_DICT); if std::fs::metadata(&keypath).is_ok() { // keypath exists - // log::info!("dict '{}' exists", MTXCLI_DICT); + log::info!("dict '{}' exists", MTXCLI_DICT); } else { log::info!("dict '{}' does NOT exist.. creating it", MTXCLI_DICT); std::fs::create_dir_all(&keypath)?; } keypath.push(key); + // NOTE: the std:fs::metadata call may return Ok() even when + // the file does not exist. + // As a workaround WE COULD set the variable to the empty string + // log::info!("dict:key = '{}:{}' set to empty string (not deleting it)", MTXCLI_DICT, key); + // File::create(keypath)?.write_all(EMPTY.as_bytes())?; if std::fs::metadata(&keypath).is_ok() { // keypath exists log::info!("dict:key = '{}:{}' exists.. deleting it", MTXCLI_DICT, key); - std::fs::remove_file(keypath)?; } match key { // special case side effects -- update cached values @@ -324,7 +330,7 @@ impl CommonEnv { let mut keypath = PathBuf::new(); keypath.push(MTXCLI_DICT); if std::fs::metadata(&keypath).is_ok() { // keypath exists - // log::info!("dict '{}' exists", MTXCLI_DICT); + log::info!("dict '{}' exists", MTXCLI_DICT); } else { log::info!("dict '{}' does NOT exist.. creating it", MTXCLI_DICT); std::fs::create_dir_all(&keypath)?; @@ -333,7 +339,7 @@ impl CommonEnv { if let Ok(mut file)= File::open(keypath) { let mut value = String::new(); file.read_to_string(&mut value)?; - // log::info!("get '{}' = '{}'", key, value); + log::info!("get '{}' = '{}'", key, value); Ok(Some(value)) } else { Ok(None) @@ -601,21 +607,30 @@ impl CmdEnv { // Initialization (must wait until PDDB is mounted and llio can // report accurate time). Here we wait to check for initialization // once the user has typed something - if ! self.initialized { + if ! self.common_env.initialized { log::info!("initializing"); if clock_not_set() { self.common_env.scalar_async_msg(CLOCK_NOT_SET_ID); - } - self.common_env.user = self.common_env.get_default(USER_KEY, EMPTY); - self.common_env.username = self.common_env.get_default(USERNAME_KEY, USERNAME_KEY); - self.common_env.server = self.common_env.get_default(SERVER_KEY, SERVER_MATRIX); - self.common_env.room_id = self.common_env.get_default(ROOM_ID_KEY, EMPTY); - self.common_env.filter = self.common_env.get_default(FILTER_KEY, EMPTY); - self.common_env.since = self.common_env.get_default(SINCE_KEY, EMPTY); - self.common_env.version = get_version(&self.common_env.ticktimer); + } else { + let pddb = pddb::PddbMountPoller::new(); + if ! pddb.is_mounted_nonblocking() { + self.common_env.scalar_async_msg(PDDB_NOT_MOUNTED_ID); + } else { + // FUTURE: Check if Wifi is connected + // if not then + // self.common_env.scalar_async_msg(WIFI_NOT_CONNECTED_ ID); + self.common_env.user = self.common_env.get_default(USER_KEY, EMPTY); + self.common_env.username = self.common_env.get_default(USERNAME_KEY, USERNAME_KEY); + self.common_env.server = self.common_env.get_default(SERVER_KEY, SERVER_MATRIX); + self.common_env.room_id = self.common_env.get_default(ROOM_ID_KEY, EMPTY); + self.common_env.filter = self.common_env.get_default(FILTER_KEY, EMPTY); + self.common_env.since = self.common_env.get_default(SINCE_KEY, EMPTY); + self.common_env.version = get_version(&self.common_env.ticktimer); - run_migrations(&mut self.common_env); - self.initialized = true; + run_migrations(&mut self.common_env); + self.common_env.initialized = true; + } + } } let maybe_verb = tokenize(cmdline); diff --git a/apps/mtxcli/src/cmds/help.rs b/apps/mtxcli/src/cmds/help.rs index 3d8f4850f..248ac5b29 100644 --- a/apps/mtxcli/src/cmds/help.rs +++ b/apps/mtxcli/src/cmds/help.rs @@ -1,5 +1,5 @@ use crate::{ShellCmdApi,CommonEnv, - cmds::CLOCK_NOT_SET_ID}; + cmds::{CLOCK_NOT_SET_ID,PDDB_NOT_MOUNTED_ID,WIFI_NOT_CONNECTED_ID}}; use xous::{MessageEnvelope, Message,StringBuffer}; use xous_ipc::String as XousString; use core::fmt::Write; @@ -78,13 +78,24 @@ impl<'a> ShellCmdApi<'a> for Help { match &msg.body { Message::Scalar(xous::ScalarMessage{id: _, arg1: _, arg2: _, arg3: _, arg4: async_msg_id}) => { - if *async_msg_id == CLOCK_NOT_SET_ID { - let mut ret = XousString::<1024>::new(); - let warning = t!("mtxcli.clock.warning", xous::LANG); - write!(ret, "{}", warning).unwrap(); - log::warn!("{}", warning); - return Ok(Some(ret)); - } + let mut ret = XousString::<1024>::new(); + let warning = match *async_msg_id { + CLOCK_NOT_SET_ID => { + t!("mtxcli.clock.warning", xous::LANG) + }, + PDDB_NOT_MOUNTED_ID => { + t!("mtxcli.pddb.warning", xous::LANG) + }, + WIFI_NOT_CONNECTED_ID => { + t!("mtxcli.wifi.warning", xous::LANG) + }, + _ => { + "unknown async_msg_id" + }, + }; + write!(ret, "{}", warning).unwrap(); + log::warn!("{}", warning); + return Ok(Some(ret)); }, Message::Move(mm) => { let str_buf = unsafe { StringBuffer::from_memory_message(mm) }; diff --git a/apps/mtxcli/src/cmds/set.rs b/apps/mtxcli/src/cmds/set.rs index 1513ea380..5b9e67bde 100644 --- a/apps/mtxcli/src/cmds/set.rs +++ b/apps/mtxcli/src/cmds/set.rs @@ -30,21 +30,30 @@ impl<'a> ShellCmdApi<'a> for Set { match value { "" => { write!(ret, "{}", t!("mtxcli.set.help", xous::LANG)).unwrap(); - } + } _ => { match env.set(key, value) { Ok(()) => { write!(ret, "set {}", key).unwrap(); }, Err(e) => { - // write!(ret, "error setting key {}: {:?}", key, e).unwrap(); log::error!("error setting key {}: {:?}", key, e); } } } } } else { - write!(ret, "{}", t!("mtxcli.set.help", xous::LANG)).unwrap(); + // Instead of an error -- set to the empty string + // write!(ret, "{}", t!("mtxcli.set.help", xous::LANG)).unwrap(); + // write!(ret, "{}", t!("mtxcli.set.help", xous::LANG)).unwrap(); + match env.set(key, "") { + Ok(()) => { + write!(ret, "set {} EMPTY", key).unwrap(); + }, + Err(e) => { + log::error!("error setting key {}: {:?}", key, e); + } + } } } }