/ firmware / src / config / app.rs
app.rs
  1  //! Application configuration — changes per deployment.
  2  //!
  3  //! Ports, timeouts, buffer sizes, polling intervals,
  4  //! credentials, service tuning.
  5  
  6  pub const HOSTNAME: &str = {
  7      let h = option_env!("HOSTNAME");
  8      match h {
  9          Some(v) if !v.is_empty() => v,
 10          _ => "microvisor",
 11      }
 12  };
 13  
 14  pub const SSH_USER: &str = {
 15      let shell_user = option_env!("SHELL_USER");
 16      match shell_user {
 17          Some(u) if !u.is_empty() => u,
 18          _ => env!("USER"),
 19      }
 20  };
 21  
 22  pub const SSH_HOST_KEY_FILE: &str = ".SSH/HOST_KEY";
 23  pub const NTP_SERVER: &str = "pool.ntp.org";
 24  pub const ACTIVE_USER_KEY: &str = cloudevents::TENANT;
 25  
 26  pub mod sntp {
 27      pub const MAX_ATTEMPTS: usize = 3;
 28      pub const RETRY_INTERVAL_SECS: u64 = 60;
 29      pub const ATTEMPT_INTERVAL_SECS: u64 = 5;
 30  }
 31  
 32  pub mod time {
 33      pub const ZONE: &str = "America/Toronto";
 34      pub const UTC_OFFSET_HOURS: i64 = -4;
 35  }
 36  
 37  pub mod wifi {
 38      pub const CONNECT_TIMEOUT_SECS: u64 = 15;
 39      pub const RETRY_INTERVAL_SECS: u64 = 5;
 40      pub const FALLBACK_TO_AP: bool = true;
 41  
 42      pub mod ap {
 43          pub const SSID: &str = "ceratina-setup";
 44          pub const PASSWORD: &str = "changeme123";
 45          pub const CHANNEL: u8 = 6;
 46          pub const MAX_CONNECTIONS: u8 = 4;
 47          pub const AUTH_MODE: &str = "WPA2";
 48      }
 49  }
 50  
 51  pub mod ssh {
 52      pub const PORT: u16 = 22;
 53      pub const RX_BUF_SIZE: usize = 4096;
 54      pub const TX_BUF_SIZE: usize = 4096;
 55      pub const TIMEOUT_SECS: u64 = 300;
 56      pub const REQUIRE_AUTH: bool = false;
 57  }
 58  
 59  pub mod http {
 60      pub const PORT: u16 = 80;
 61  }
 62  
 63  pub mod ota {
 64      pub const PORT: u16 = 3232;
 65      pub const RX_BUF_SIZE: usize = 16384;
 66      pub const TX_BUF_SIZE: usize = 16384;
 67      pub const CHUNK_SIZE: usize = 8192;
 68  }
 69  
 70  pub mod tcp_log {
 71      pub const PORT: u16 = 23;
 72      pub const RX_BUF_SIZE: usize = 4096;
 73      pub const TX_BUF_SIZE: usize = 4096;
 74      pub const INTERVAL_SECS: u64 = 1;
 75      pub const TIMEOUT_SECS: u64 = 5;
 76      pub const WELCOME: &[u8] = b"ceratina tcp log mirror connected\n";
 77  }
 78  
 79  pub mod sd_card {
 80      pub const DEVICE: &str = "spi2";
 81      pub const FS_TYPE: &str = "fat32";
 82      pub const DATA_LOG_PATH: &str = "/data.csv";
 83      pub const DATA_CSV_FILE_NAME: &str = "data.csv";
 84      pub const DATA_CSV_HEADER: &str = "timestamp,temperature_celsius_0,humidity_percent_0,temperature_celsius_1,humidity_percent_1,temperature_celsius_2,humidity_percent_2,voltage_channel_0,voltage_channel_1,voltage_channel_2,voltage_channel_3";
 85      pub const FILE_UPLOAD_MAX_BYTES: usize = 4096;
 86  }
 87  
 88  pub mod ble {
 89      pub const CONNECTIONS_MAX: usize = 1;
 90      pub const L2CAP_CHANNELS_MAX: usize = 1;
 91  }
 92  
 93  pub mod data_logger {
 94      pub const SAMPLING_INTERVAL_SECS: u64 = 5;
 95      pub const POLL_RETRIES: usize = 40;
 96      pub const POLL_INTERVAL_MS: u64 = 250;
 97  }
 98  
 99  pub mod carbon_dioxide {
100      pub const SCD4X_POLL_RETRIES: usize = 20;
101      pub const SCD4X_POLL_INTERVAL_MS: u64 = 500;
102      pub const PROBE_RETRY_SECS: u64 = 5;
103      pub const MAX_CONSECUTIVE_FAILURES: usize = 5;
104  }
105  
106  pub mod temperature_humidity {
107      pub const MAX_SENSORS: u8 = 8;
108      pub const READ_DELAY_MS: u16 = 100;
109  }
110  
111  pub mod voltage {
112      pub const CHANNEL_COUNT: u8 = 4;
113  }
114  
115  pub mod led {
116      pub const BRIGHTNESS: u8 = 255;
117  }
118  
119  pub mod shell {
120      pub const BUF_IN: usize = 256;
121      pub const BUF_OUT: usize = 256;
122      pub const MAX_PATH_LEN: usize = 128;
123  }
124  
125  pub mod buttons {
126      pub const DEBOUNCE_MS: u16 = 50;
127      pub const LONG_PRESS_MS: u16 = 1000;
128  }
129  
130  pub mod cloudevents {
131      pub const TENANT: &str = "apidae-systems";
132      pub const SITE: &str = "ottawa";
133      pub const SOURCE: &str = "urn:apidae-systems:tenant:apidae-systems:site:ottawa";
134      pub const EVENT_TYPE: &str = "com.apidae.system.device.status.v1";
135  }
136  
137  pub mod smtp {
138      pub const PORT: u16 = 587;
139  }
140  
141  pub mod ws_shell {
142      pub const RING_SIZE: u16 = 512;
143      pub const WRITE_BUF: u16 = 1024;
144  }
145  
146  pub mod telnet {
147      pub const PORT: u16 = 23;
148  }