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 }