lotsa (it worked, it didn't, it works now pretty much most of the time)

This commit is contained in:
pszsh 2026-03-12 02:42:44 -07:00
parent 10096738cf
commit a3749af7b5
25 changed files with 12949 additions and 532 deletions

156
cue/Cargo.lock generated
View File

@ -334,6 +334,9 @@ name = "bitflags"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
dependencies = [
"serde_core",
]
[[package]]
name = "block"
@ -513,7 +516,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f"
dependencies = [
"objc2 0.5.2",
"objc2-app-kit",
"objc2-app-kit 0.2.2",
"objc2-foundation 0.2.2",
]
@ -698,6 +701,15 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "crossbeam-channel"
version = "0.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.6"
@ -752,7 +764,9 @@ dependencies = [
"futures",
"iced",
"midir",
"muda",
"tokio",
"winres",
]
[[package]]
@ -1714,6 +1728,17 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "keyboard-types"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a"
dependencies = [
"bitflags 2.11.0",
"serde",
"unicode-segmentation",
]
[[package]]
name = "khronos-egl"
version = "6.0.0"
@ -1968,6 +1993,25 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "muda"
version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a"
dependencies = [
"crossbeam-channel",
"dpi",
"keyboard-types",
"objc2 0.6.4",
"objc2-app-kit 0.3.2",
"objc2-core-foundation",
"objc2-foundation 0.3.2",
"once_cell",
"png",
"thiserror 2.0.18",
"windows-sys 0.60.2",
]
[[package]]
name = "naga"
version = "0.19.2"
@ -2123,6 +2167,18 @@ dependencies = [
"objc2-quartz-core 0.2.2",
]
[[package]]
name = "objc2-app-kit"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
dependencies = [
"bitflags 2.11.0",
"objc2 0.6.4",
"objc2-core-foundation",
"objc2-foundation 0.3.2",
]
[[package]]
name = "objc2-cloud-kit"
version = "0.2.2"
@ -2256,7 +2312,7 @@ checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398"
dependencies = [
"block2",
"objc2 0.5.2",
"objc2-app-kit",
"objc2-app-kit 0.2.2",
"objc2-foundation 0.2.2",
]
@ -3404,6 +3460,15 @@ dependencies = [
"syn 2.0.117",
]
[[package]]
name = "toml"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
dependencies = [
"serde",
]
[[package]]
name = "toml_datetime"
version = "1.0.0+spec-1.1.0"
@ -4127,6 +4192,15 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [
"windows-targets 0.53.5",
]
[[package]]
name = "windows-sys"
version = "0.61.2"
@ -4160,13 +4234,30 @@ dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm",
"windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.53.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
dependencies = [
"windows-link",
"windows_aarch64_gnullvm 0.53.1",
"windows_aarch64_msvc 0.53.1",
"windows_i686_gnu 0.53.1",
"windows_i686_gnullvm 0.53.1",
"windows_i686_msvc 0.53.1",
"windows_x86_64_gnu 0.53.1",
"windows_x86_64_gnullvm 0.53.1",
"windows_x86_64_msvc 0.53.1",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.2"
@ -4179,6 +4270,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.2"
@ -4191,6 +4288,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_aarch64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
[[package]]
name = "windows_i686_gnu"
version = "0.42.2"
@ -4203,12 +4306,24 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
[[package]]
name = "windows_i686_msvc"
version = "0.42.2"
@ -4221,6 +4336,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_i686_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.2"
@ -4233,6 +4354,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.2"
@ -4245,6 +4372,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.2"
@ -4257,6 +4390,12 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "windows_x86_64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]]
name = "winit"
version = "0.30.13"
@ -4281,7 +4420,7 @@ dependencies = [
"memmap2",
"ndk",
"objc2 0.5.2",
"objc2-app-kit",
"objc2-app-kit 0.2.2",
"objc2-foundation 0.2.2",
"objc2-ui-kit",
"orbclient",
@ -4327,6 +4466,15 @@ dependencies = [
"winapi",
]
[[package]]
name = "winres"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c"
dependencies = [
"toml",
]
[[package]]
name = "wit-bindgen"
version = "0.51.0"

View File

@ -8,3 +8,7 @@ iced = { version = "0.13", features = ["canvas", "tokio"] }
midir = "0.10"
tokio = { version = "1", features = ["full"] }
futures = "0.3"
muda = { version = "0.17", default-features = false }
[target.'cfg(windows)'.build-dependencies]
winres = "0.1"

BIN
cue/assets/cue.icns Normal file

Binary file not shown.

1212
cue/assets/cue.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 255 KiB

3972
cue/assets/cue2.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 433 KiB

3972
cue/assets/cue4.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 428 KiB

10
cue/build.rs Normal file
View File

@ -0,0 +1,10 @@
fn main() {
#[cfg(target_os = "windows")]
{
let mut res = winres::WindowsResource::new();
res.set_icon("assets/cue.ico");
if let Err(e) = res.compile() {
eprintln!("winres: {e}");
}
}
}

157
cue/build.sh Executable file
View File

@ -0,0 +1,157 @@
#!/bin/bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
SVG="assets/cue.svg"
NAME="Cue"
BIN="cue"
VERSION="0.1.0"
IDENTIFIER="org.else-if.cue"
if [ ! -f "$SVG" ]; then
echo "Error: $SVG not found"
exit 1
fi
render_svg() {
local svg="$1" size="$2" out="$3"
if command -v rsvg-convert >/dev/null 2>&1; then
rsvg-convert -w "$size" -h "$size" "$svg" -o "$out"
elif command -v magick >/dev/null 2>&1; then
magick "$svg" -background none -resize "${size}x${size}" "$out"
else
echo "Error: need rsvg-convert (librsvg) or magick (ImageMagick 7)"
exit 1
fi
}
case "$(uname -s)" in
Darwin)
echo "==> Generating .icns"
ICONSET=$(mktemp -d)/cue.iconset
mkdir -p "$ICONSET"
for size in 16 32 64 128 256 512; do
render_svg "$SVG" "$size" "$ICONSET/icon_${size}x${size}.png"
double=$((size * 2))
render_svg "$SVG" "$double" "$ICONSET/icon_${size}x${size}@2x.png"
done
iconutil -c icns "$ICONSET" -o assets/cue.icns
rm -rf "$(dirname "$ICONSET")"
echo "==> cargo build --release"
cargo build --release
echo "==> Creating .app bundle"
APP="target/release/$NAME.app"
rm -rf "$APP"
mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources"
cp "target/release/$BIN" "$APP/Contents/MacOS/$NAME"
cp assets/cue.icns "$APP/Contents/Resources/"
cat > "$APP/Contents/Info.plist" << PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>$NAME</string>
<key>CFBundleDisplayName</key>
<string>$NAME</string>
<key>CFBundleIdentifier</key>
<string>$IDENTIFIER</string>
<key>CFBundleVersion</key>
<string>$VERSION</string>
<key>CFBundleShortVersionString</key>
<string>$VERSION</string>
<key>CFBundleExecutable</key>
<string>$NAME</string>
<key>CFBundleIconFile</key>
<string>cue</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Cue uses Bluetooth to communicate with EIS4.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Cue uses Bluetooth to communicate with EIS4.</string>
</dict>
</plist>
PLIST
codesign --force --deep --sign - "$APP"
echo "==> $APP"
;;
Linux)
echo "==> Generating PNGs"
for size in 16 32 48 64 128 256 512; do
mkdir -p "assets/icons/${size}x${size}"
render_svg "$SVG" "$size" "assets/icons/${size}x${size}/cue.png"
done
echo "==> cargo build --release"
cargo build --release
echo "==> Creating package"
PKG="target/release/cue-linux"
rm -rf "$PKG"
mkdir -p "$PKG"
cp target/release/$BIN "$PKG/"
for size in 16 32 48 64 128 256 512; do
mkdir -p "$PKG/icons/hicolor/${size}x${size}/apps"
cp "assets/icons/${size}x${size}/cue.png" "$PKG/icons/hicolor/${size}x${size}/apps/"
done
cat > "$PKG/cue.desktop" << DESKTOP
[Desktop Entry]
Name=Cue
Comment=EIS4 Electrochemical Instrument
Exec=cue
Icon=cue
Terminal=false
Type=Application
Categories=Science;Education;
DESKTOP
cat > "$PKG/install.sh" << 'INSTALL'
#!/bin/bash
set -e
PREFIX="${1:-/usr/local}"
install -Dm755 cue "$PREFIX/bin/cue"
install -Dm644 cue.desktop "$PREFIX/share/applications/cue.desktop"
for d in icons/hicolor/*/apps; do
size="$(basename "$(dirname "$d")")"
install -Dm644 "$d/cue.png" "$PREFIX/share/icons/hicolor/$size/apps/cue.png"
done
echo "Installed to $PREFIX"
INSTALL
chmod +x "$PKG/install.sh"
echo "==> $PKG/"
;;
MINGW*|MSYS*|CYGWIN*)
echo "==> Generating .ico"
TMPICO=$(mktemp -d)
for size in 16 32 48 64 128 256; do
render_svg "$SVG" "$size" "$TMPICO/${size}.png"
done
magick "$TMPICO/16.png" "$TMPICO/32.png" "$TMPICO/48.png" \
"$TMPICO/64.png" "$TMPICO/128.png" "$TMPICO/256.png" assets/cue.ico
rm -rf "$TMPICO"
echo "==> cargo build --release"
cargo build --release
echo "==> target/release/cue.exe (icon embedded via build.rs)"
;;
*)
echo "Unknown platform: $(uname -s)"
cargo build --release
;;
esac

File diff suppressed because it is too large Load Diff

View File

@ -22,7 +22,7 @@ pub async fn connect_and_run(
if let Some(found) = find_midi_ports() {
break found;
}
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
tokio::time::sleep(std::time::Duration::from_millis(500)).await;
};
let _ = tx.send(BleEvent::Status("Connecting MIDI...".into()));
@ -52,19 +52,20 @@ pub async fn connect_and_run(
}
}
loop {
match cmd_rx.try_recv() {
Ok(pkt) => {
out_conn.send(&pkt).ok();
if let Err(e) = out_conn.send(&pkt) {
eprintln!("MIDI send error: {e}");
}
}
Err(mpsc::error::TryRecvError::Disconnected) => return Ok(()),
Err(mpsc::error::TryRecvError::Empty) => break,
}
Err(mpsc::error::TryRecvError::Disconnected) => break,
Err(mpsc::error::TryRecvError::Empty) => {}
}
tokio::time::sleep(std::time::Duration::from_millis(5)).await;
}
let _ = tx.send(BleEvent::Status("Disconnected".into()));
Ok(())
}
fn find_midi_ports() -> Option<(

View File

@ -1,5 +1,6 @@
mod app;
mod ble;
mod native_menu;
mod plot;
mod protocol;

58
cue/src/native_menu.rs Normal file
View File

@ -0,0 +1,58 @@
use muda::{Menu, MenuEvent, MenuId, MenuItem, PredefinedMenuItem, Submenu};
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub enum MenuAction {
SystemInfo,
}
pub struct NativeMenu {
menu: Menu,
action_map: HashMap<MenuId, MenuAction>,
attached: bool,
}
impl NativeMenu {
pub fn init() -> Self {
let menu = Menu::new();
let mut action_map = HashMap::new();
let app_menu = Submenu::new("Cue", true);
let _ = app_menu.append(&PredefinedMenuItem::about(None, None));
let _ = app_menu.append(&PredefinedMenuItem::separator());
let sys_info = MenuItem::new("System Info", true, None::<muda::accelerator::Accelerator>);
action_map.insert(sys_info.id().clone(), MenuAction::SystemInfo);
let _ = app_menu.append(&sys_info);
let _ = app_menu.append(&PredefinedMenuItem::separator());
let _ = app_menu.append(&PredefinedMenuItem::quit(None));
let _ = menu.append(&app_menu);
Self {
menu,
action_map,
attached: false,
}
}
pub fn ensure_attached(&mut self) {
if !self.attached {
#[cfg(target_os = "macos")]
self.menu.init_for_nsapp();
self.attached = true;
}
}
pub fn poll_events(&mut self) -> Vec<MenuAction> {
self.ensure_attached();
let mut actions = Vec::new();
while let Ok(event) = MenuEvent::receiver().try_recv() {
if let Some(action) = self.action_map.get(event.id()) {
actions.push(action.clone());
}
}
actions
}
}

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,18 @@ pub const RSP_SWEEP_START: u8 = 0x01;
pub const RSP_DATA_POINT: u8 = 0x02;
pub const RSP_SWEEP_END: u8 = 0x03;
pub const RSP_CONFIG: u8 = 0x04;
pub const RSP_LSV_START: u8 = 0x05;
pub const RSP_LSV_POINT: u8 = 0x06;
pub const RSP_LSV_END: u8 = 0x07;
pub const RSP_AMP_START: u8 = 0x08;
pub const RSP_AMP_POINT: u8 = 0x09;
pub const RSP_AMP_END: u8 = 0x0A;
pub const RSP_CL_START: u8 = 0x0B;
pub const RSP_CL_POINT: u8 = 0x0C;
pub const RSP_CL_RESULT: u8 = 0x0D;
pub const RSP_CL_END: u8 = 0x0E;
pub const RSP_PH_RESULT: u8 = 0x0F;
pub const RSP_TEMP: u8 = 0x10;
/* Cue → ESP32 */
pub const CMD_SET_SWEEP: u8 = 0x10;
@ -14,6 +26,14 @@ pub const CMD_SET_RTIA: u8 = 0x11;
pub const CMD_SET_RCAL: u8 = 0x12;
pub const CMD_START_SWEEP: u8 = 0x13;
pub const CMD_GET_CONFIG: u8 = 0x14;
pub const CMD_SET_ELECTRODE: u8 = 0x15;
pub const CMD_START_LSV: u8 = 0x20;
pub const CMD_START_AMP: u8 = 0x21;
pub const CMD_STOP_AMP: u8 = 0x22;
pub const CMD_SET_TEMP: u8 = 0x16;
pub const CMD_GET_TEMP: u8 = 0x17;
pub const CMD_START_CL: u8 = 0x23;
pub const CMD_START_PH: u8 = 0x24;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Rtia {
@ -71,6 +91,65 @@ impl std::fmt::Display for Rcal {
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Electrode {
FourWire, ThreeWire,
}
impl Electrode {
pub fn from_byte(b: u8) -> Option<Self> {
Some(match b { 0 => Self::FourWire, 1 => Self::ThreeWire, _ => return None })
}
pub fn as_byte(self) -> u8 { self as u8 }
pub fn label(self) -> &'static str {
match self {
Self::FourWire => "4-wire (AIN)",
Self::ThreeWire => "3-wire (CE0/RE0/SE0)",
}
}
pub const ALL: &[Self] = &[Self::FourWire, Self::ThreeWire];
}
impl std::fmt::Display for Electrode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.label())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LpRtia {
R200, R1K, R2K, R4K, R10K, R20K, R40K, R100K, R512K,
}
impl LpRtia {
pub fn from_byte(b: u8) -> Option<Self> {
Some(match b {
0 => Self::R200, 1 => Self::R1K, 2 => Self::R2K, 3 => Self::R4K,
4 => Self::R10K, 5 => Self::R20K, 6 => Self::R40K, 7 => Self::R100K,
8 => Self::R512K,
_ => return None,
})
}
pub fn as_byte(self) -> u8 { self as u8 }
pub fn label(self) -> &'static str {
match self {
Self::R200 => "200Ω", Self::R1K => "1kΩ", Self::R2K => "2kΩ",
Self::R4K => "4kΩ", Self::R10K => "10kΩ", Self::R20K => "20kΩ",
Self::R40K => "40kΩ", Self::R100K => "100kΩ", Self::R512K => "512kΩ",
}
}
pub const ALL: &[Self] = &[
Self::R200, Self::R1K, Self::R2K, Self::R4K,
Self::R10K, Self::R20K, Self::R40K, Self::R100K, Self::R512K,
];
}
impl std::fmt::Display for LpRtia {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.label())
}
}
#[derive(Debug, Clone)]
pub struct EisPoint {
pub freq_hz: f32,
@ -78,6 +157,43 @@ pub struct EisPoint {
pub phase_deg: f32,
pub z_real: f32,
pub z_imag: f32,
pub rtia_mag_before: f32,
pub rtia_mag_after: f32,
pub rev_mag: f32,
pub rev_phase: f32,
pub pct_err: f32,
}
#[derive(Debug, Clone)]
pub struct LsvPoint {
pub v_mv: f32,
pub i_ua: f32,
}
#[derive(Debug, Clone)]
pub struct AmpPoint {
pub t_ms: f32,
pub i_ua: f32,
}
#[derive(Debug, Clone)]
pub struct ClPoint {
pub t_ms: f32,
pub i_ua: f32,
pub phase: u8,
}
#[derive(Debug, Clone)]
pub struct ClResult {
pub i_free_ua: f32,
pub i_total_ua: f32,
}
#[derive(Debug, Clone)]
pub struct PhResult {
pub v_ocp_mv: f32,
pub ph: f32,
pub temp_c: f32,
}
#[derive(Debug, Clone)]
@ -87,6 +203,7 @@ pub struct EisConfig {
pub ppd: u16,
pub rtia: Rtia,
pub rcal: Rcal,
pub electrode: Electrode,
}
#[derive(Debug, Clone)]
@ -95,6 +212,18 @@ pub enum EisMessage {
DataPoint { index: u16, point: EisPoint },
SweepEnd,
Config(EisConfig),
LsvStart { num_points: u16, v_start: f32, v_stop: f32 },
LsvPoint { index: u16, point: LsvPoint },
LsvEnd,
AmpStart { v_hold: f32 },
AmpPoint { index: u16, point: AmpPoint },
AmpEnd,
ClStart { num_points: u16 },
ClPoint { index: u16, point: ClPoint },
ClResult(ClResult),
ClEnd,
PhResult(PhResult),
Temperature(f32),
}
fn decode_u16(data: &[u8]) -> u16 {
@ -138,6 +267,7 @@ pub fn parse_sysex(data: &[u8]) -> Option<EisMessage> {
}
RSP_DATA_POINT if data.len() >= 30 => {
let p = &data[2..];
let ext = p.len() >= 53;
Some(EisMessage::DataPoint {
index: decode_u16(&p[0..3]),
point: EisPoint {
@ -146,11 +276,16 @@ pub fn parse_sysex(data: &[u8]) -> Option<EisMessage> {
phase_deg: decode_float(&p[13..18]),
z_real: decode_float(&p[18..23]),
z_imag: decode_float(&p[23..28]),
rtia_mag_before: if ext { decode_float(&p[28..33]) } else { 0.0 },
rtia_mag_after: if ext { decode_float(&p[33..38]) } else { 0.0 },
rev_mag: if ext { decode_float(&p[38..43]) } else { 0.0 },
rev_phase: if ext { decode_float(&p[43..48]) } else { 0.0 },
pct_err: if ext { decode_float(&p[48..53]) } else { 0.0 },
},
})
}
RSP_SWEEP_END => Some(EisMessage::SweepEnd),
RSP_CONFIG if data.len() >= 17 => {
RSP_CONFIG if data.len() >= 18 => {
let p = &data[2..];
Some(EisMessage::Config(EisConfig {
freq_start: decode_float(&p[0..5]),
@ -158,6 +293,76 @@ pub fn parse_sysex(data: &[u8]) -> Option<EisMessage> {
ppd: decode_u16(&p[10..13]),
rtia: Rtia::from_byte(p[13]).unwrap_or(Rtia::R5K),
rcal: Rcal::from_byte(p[14]).unwrap_or(Rcal::R3K),
electrode: Electrode::from_byte(p[15]).unwrap_or(Electrode::FourWire),
}))
}
RSP_LSV_START if data.len() >= 15 => {
let p = &data[2..];
Some(EisMessage::LsvStart {
num_points: decode_u16(&p[0..3]),
v_start: decode_float(&p[3..8]),
v_stop: decode_float(&p[8..13]),
})
}
RSP_LSV_POINT if data.len() >= 15 => {
let p = &data[2..];
Some(EisMessage::LsvPoint {
index: decode_u16(&p[0..3]),
point: LsvPoint {
v_mv: decode_float(&p[3..8]),
i_ua: decode_float(&p[8..13]),
},
})
}
RSP_LSV_END => Some(EisMessage::LsvEnd),
RSP_AMP_START if data.len() >= 7 => {
let p = &data[2..];
Some(EisMessage::AmpStart { v_hold: decode_float(&p[0..5]) })
}
RSP_AMP_POINT if data.len() >= 15 => {
let p = &data[2..];
Some(EisMessage::AmpPoint {
index: decode_u16(&p[0..3]),
point: AmpPoint {
t_ms: decode_float(&p[3..8]),
i_ua: decode_float(&p[8..13]),
},
})
}
RSP_AMP_END => Some(EisMessage::AmpEnd),
RSP_CL_START if data.len() >= 5 => {
let p = &data[2..];
Some(EisMessage::ClStart { num_points: decode_u16(&p[0..3]) })
}
RSP_CL_POINT if data.len() >= 16 => {
let p = &data[2..];
Some(EisMessage::ClPoint {
index: decode_u16(&p[0..3]),
point: ClPoint {
t_ms: decode_float(&p[3..8]),
i_ua: decode_float(&p[8..13]),
phase: p[13],
},
})
}
RSP_CL_RESULT if data.len() >= 12 => {
let p = &data[2..];
Some(EisMessage::ClResult(ClResult {
i_free_ua: decode_float(&p[0..5]),
i_total_ua: decode_float(&p[5..10]),
}))
}
RSP_CL_END => Some(EisMessage::ClEnd),
RSP_TEMP if data.len() >= 7 => {
let p = &data[2..];
Some(EisMessage::Temperature(decode_float(&p[0..5])))
}
RSP_PH_RESULT if data.len() >= 17 => {
let p = &data[2..];
Some(EisMessage::PhResult(PhResult {
v_ocp_mv: decode_float(&p[0..5]),
ph: decode_float(&p[5..10]),
temp_c: decode_float(&p[10..15]),
}))
}
_ => None,
@ -181,6 +386,10 @@ pub fn build_sysex_set_rcal(rcal: Rcal) -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_SET_RCAL, rcal.as_byte(), 0xF7]
}
pub fn build_sysex_set_electrode(e: Electrode) -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_SET_ELECTRODE, e.as_byte(), 0xF7]
}
pub fn build_sysex_start_sweep() -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_START_SWEEP, 0xF7]
}
@ -188,3 +397,54 @@ pub fn build_sysex_start_sweep() -> Vec<u8> {
pub fn build_sysex_get_config() -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_GET_CONFIG, 0xF7]
}
pub fn build_sysex_start_lsv(v_start: f32, v_stop: f32, scan_rate: f32, lp_rtia: LpRtia) -> Vec<u8> {
let mut sx = vec![0xF0, SYSEX_MFR, CMD_START_LSV];
sx.extend_from_slice(&encode_float(v_start));
sx.extend_from_slice(&encode_float(v_stop));
sx.extend_from_slice(&encode_float(scan_rate));
sx.push(lp_rtia.as_byte());
sx.push(0xF7);
sx
}
pub fn build_sysex_start_amp(v_hold: f32, interval_ms: f32, duration_s: f32, lp_rtia: LpRtia) -> Vec<u8> {
let mut sx = vec![0xF0, SYSEX_MFR, CMD_START_AMP];
sx.extend_from_slice(&encode_float(v_hold));
sx.extend_from_slice(&encode_float(interval_ms));
sx.extend_from_slice(&encode_float(duration_s));
sx.push(lp_rtia.as_byte());
sx.push(0xF7);
sx
}
pub fn build_sysex_stop_amp() -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_STOP_AMP, 0xF7]
}
pub fn build_sysex_start_cl(
v_cond: f32, t_cond_ms: f32, v_free: f32, v_total: f32,
t_dep_ms: f32, t_meas_ms: f32, lp_rtia: LpRtia,
) -> Vec<u8> {
let mut sx = vec![0xF0, SYSEX_MFR, CMD_START_CL];
sx.extend_from_slice(&encode_float(v_cond));
sx.extend_from_slice(&encode_float(t_cond_ms));
sx.extend_from_slice(&encode_float(v_free));
sx.extend_from_slice(&encode_float(v_total));
sx.extend_from_slice(&encode_float(t_dep_ms));
sx.extend_from_slice(&encode_float(t_meas_ms));
sx.push(lp_rtia.as_byte());
sx.push(0xF7);
sx
}
pub fn build_sysex_get_temp() -> Vec<u8> {
vec![0xF0, SYSEX_MFR, CMD_GET_TEMP, 0xF7]
}
pub fn build_sysex_start_ph(stabilize_s: f32) -> Vec<u8> {
let mut sx = vec![0xF0, SYSEX_MFR, CMD_START_PH];
sx.extend_from_slice(&encode_float(stabilize_s));
sx.push(0xF7);
sx
}

View File

@ -1,3 +1,3 @@
idf_component_register(SRCS "eis4.c" "eis.c" "ble.c"
idf_component_register(SRCS "eis4.c" "eis.c" "echem.c" "ble.c" "temp.c"
INCLUDE_DIRS "."
REQUIRES ad5941 ad5941_port bt nvs_flash)

View File

@ -18,7 +18,7 @@ void ble_store_config_init(void);
#define DEVICE_NAME "EIS4"
#define CONNECTED_BIT BIT0
#define CMD_QUEUE_LEN 4
#define CMD_QUEUE_LEN 8
/* BLE MIDI Service 03B80E5A-EDE8-4B33-A751-6CE34EC4C700 */
static const ble_uuid128_t midi_svc_uuid = BLE_UUID128_INIT(
@ -117,12 +117,9 @@ static uint16_t decode_u16(const uint8_t *d)
/* ---- command parsing from incoming SysEx ---- */
static void parse_command(const uint8_t *data, uint16_t len)
static void parse_one_sysex(const uint8_t *midi, uint16_t mlen)
{
if (len < 5) return;
const uint8_t *midi = data + 2;
uint16_t mlen = len - 2;
if (midi[0] != 0xF0 || midi[1] != 0x7D) return;
if (mlen < 3 || midi[0] != 0xF0 || midi[1] != 0x7D) return;
BleCommand cmd;
memset(&cmd, 0, sizeof(cmd));
@ -136,15 +133,53 @@ static void parse_command(const uint8_t *data, uint16_t len)
cmd.sweep.ppd = decode_u16(&midi[13]);
break;
case CMD_SET_RTIA:
if (mlen < 5) return;
if (mlen < 4) return;
cmd.rtia = midi[3];
break;
case CMD_SET_RCAL:
if (mlen < 5) return;
if (mlen < 4) return;
cmd.rcal = midi[3];
break;
case CMD_SET_ELECTRODE:
if (mlen < 4) return;
cmd.electrode = midi[3];
break;
case CMD_START_LSV:
if (mlen < 19) return;
cmd.lsv.v_start = decode_float(&midi[3]);
cmd.lsv.v_stop = decode_float(&midi[8]);
cmd.lsv.scan_rate = decode_float(&midi[13]);
cmd.lsv.lp_rtia = midi[18];
break;
case CMD_START_AMP:
if (mlen < 19) return;
cmd.amp.v_hold = decode_float(&midi[3]);
cmd.amp.interval_ms = decode_float(&midi[8]);
cmd.amp.duration_s = decode_float(&midi[13]);
cmd.amp.lp_rtia = midi[18];
break;
case CMD_START_CL:
if (mlen < 34) return;
cmd.cl.v_cond = decode_float(&midi[3]);
cmd.cl.t_cond_ms = decode_float(&midi[8]);
cmd.cl.v_free = decode_float(&midi[13]);
cmd.cl.v_total = decode_float(&midi[18]);
cmd.cl.t_dep_ms = decode_float(&midi[23]);
cmd.cl.t_meas_ms = decode_float(&midi[28]);
cmd.cl.lp_rtia = midi[33];
break;
case CMD_SET_TEMP:
if (mlen < 8) return;
cmd.temp_c = decode_float(&midi[3]);
break;
case CMD_START_PH:
if (mlen < 8) return;
cmd.ph.stabilize_s = decode_float(&midi[3]);
break;
case CMD_START_SWEEP:
case CMD_GET_CONFIG:
case CMD_STOP_AMP:
case CMD_GET_TEMP:
break;
default:
return;
@ -153,6 +188,36 @@ static void parse_command(const uint8_t *data, uint16_t len)
xQueueSend(cmd_queue, &cmd, 0);
}
static void parse_command(const uint8_t *data, uint16_t len)
{
if (len < 5) return;
uint16_t i = 1; /* skip BLE MIDI header byte */
while (i < len) {
/* skip timestamp bytes (bit 7 set, not F0/F7) */
if ((data[i] & 0x80) && data[i] != 0xF0 && data[i] != 0xF7) {
i++;
continue;
}
if (data[i] == 0xF0) {
uint8_t clean[64];
uint16_t clen = 0;
clean[clen++] = 0xF0;
i++;
while (i < len && data[i] != 0xF7) {
if (data[i] & 0x80) { i++; continue; } /* strip timestamps */
if (clen < sizeof(clean))
clean[clen++] = data[i];
i++;
}
if (i < len) i++; /* skip F7 */
parse_one_sysex(clean, clen);
} else {
i++;
}
}
}
/* ---- GATT access callbacks ---- */
static int midi_access_cb(uint16_t ch, uint16_t ah,
@ -561,7 +626,7 @@ int ble_send_sweep_start(uint32_t num_points, float freq_start, float freq_stop)
int ble_send_eis_point(uint16_t index, const EISPoint *pt)
{
uint8_t sx[36];
uint8_t sx[64];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_DATA_POINT;
encode_u16(index, &sx[p]); p += 3;
@ -570,6 +635,11 @@ int ble_send_eis_point(uint16_t index, const EISPoint *pt)
encode_float(pt->phase_deg, &sx[p]); p += 5;
encode_float(pt->z_real, &sx[p]); p += 5;
encode_float(pt->z_imag, &sx[p]); p += 5;
encode_float(pt->rtia_mag_before, &sx[p]); p += 5;
encode_float(pt->rtia_mag_after, &sx[p]); p += 5;
encode_float(pt->rev_mag, &sx[p]); p += 5;
encode_float(pt->rev_phase, &sx[p]); p += 5;
encode_float(pt->pct_err, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
@ -590,6 +660,127 @@ int ble_send_config(const EISConfig *cfg)
encode_u16(cfg->points_per_decade, &sx[p]); p += 3;
sx[p++] = (uint8_t)cfg->rtia;
sx[p++] = (uint8_t)cfg->rcal;
sx[p++] = (uint8_t)cfg->electrode;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_lsv_start(uint32_t num_points, float v_start, float v_stop)
{
uint8_t sx[20];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_LSV_START;
encode_u16((uint16_t)num_points, &sx[p]); p += 3;
encode_float(v_start, &sx[p]); p += 5;
encode_float(v_stop, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_lsv_point(uint16_t index, float v_mv, float i_ua)
{
uint8_t sx[20];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_LSV_POINT;
encode_u16(index, &sx[p]); p += 3;
encode_float(v_mv, &sx[p]); p += 5;
encode_float(i_ua, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_lsv_end(void)
{
uint8_t sx[] = { 0xF0, 0x7D, RSP_LSV_END, 0xF7 };
return send_sysex(sx, sizeof(sx));
}
int ble_send_amp_start(float v_hold)
{
uint8_t sx[12];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_AMP_START;
encode_float(v_hold, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_amp_point(uint16_t index, float t_ms, float i_ua)
{
uint8_t sx[20];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_AMP_POINT;
encode_u16(index, &sx[p]); p += 3;
encode_float(t_ms, &sx[p]); p += 5;
encode_float(i_ua, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_amp_end(void)
{
uint8_t sx[] = { 0xF0, 0x7D, RSP_AMP_END, 0xF7 };
return send_sysex(sx, sizeof(sx));
}
int ble_send_cl_start(uint32_t num_points)
{
uint8_t sx[10];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_CL_START;
encode_u16((uint16_t)num_points, &sx[p]); p += 3;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_cl_point(uint16_t index, float t_ms, float i_ua, uint8_t phase)
{
uint8_t sx[20];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_CL_POINT;
encode_u16(index, &sx[p]); p += 3;
encode_float(t_ms, &sx[p]); p += 5;
encode_float(i_ua, &sx[p]); p += 5;
sx[p++] = phase & 0x7F;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_cl_result(float i_free_ua, float i_total_ua)
{
uint8_t sx[16];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_CL_RESULT;
encode_float(i_free_ua, &sx[p]); p += 5;
encode_float(i_total_ua, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_cl_end(void)
{
uint8_t sx[] = { 0xF0, 0x7D, RSP_CL_END, 0xF7 };
return send_sysex(sx, sizeof(sx));
}
int ble_send_ph_result(float v_ocp_mv, float ph, float temp_c)
{
uint8_t sx[20];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_PH_RESULT;
encode_float(v_ocp_mv, &sx[p]); p += 5;
encode_float(ph, &sx[p]); p += 5;
encode_float(temp_c, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}
int ble_send_temp(float temp_c)
{
uint8_t sx[12];
uint16_t p = 0;
sx[p++] = 0xF0; sx[p++] = 0x7D; sx[p++] = RSP_TEMP;
encode_float(temp_c, &sx[p]); p += 5;
sx[p++] = 0xF7;
return send_sysex(sx, p);
}

View File

@ -3,18 +3,38 @@
#include "eis.h"
/* Commands: Cue → ESP32 (0x1x) */
/* Commands: Cue → ESP32 (0x1x, 0x2x) */
#define CMD_SET_SWEEP 0x10
#define CMD_SET_RTIA 0x11
#define CMD_SET_RCAL 0x12
#define CMD_START_SWEEP 0x13
#define CMD_GET_CONFIG 0x14
#define CMD_SET_ELECTRODE 0x15
#define CMD_START_LSV 0x20
#define CMD_START_AMP 0x21
#define CMD_STOP_AMP 0x22
#define CMD_SET_TEMP 0x16
#define CMD_GET_TEMP 0x17
#define CMD_START_CL 0x23
#define CMD_START_PH 0x24
/* Responses: ESP32 → Cue (0x0x) */
#define RSP_SWEEP_START 0x01
#define RSP_DATA_POINT 0x02
#define RSP_SWEEP_END 0x03
#define RSP_CONFIG 0x04
#define RSP_LSV_START 0x05
#define RSP_LSV_POINT 0x06
#define RSP_LSV_END 0x07
#define RSP_AMP_START 0x08
#define RSP_AMP_POINT 0x09
#define RSP_AMP_END 0x0A
#define RSP_CL_START 0x0B
#define RSP_CL_POINT 0x0C
#define RSP_CL_RESULT 0x0D
#define RSP_CL_END 0x0E
#define RSP_PH_RESULT 0x0F
#define RSP_TEMP 0x10
typedef struct {
uint8_t type;
@ -22,6 +42,12 @@ typedef struct {
struct { float freq_start, freq_stop; uint16_t ppd; } sweep;
uint8_t rtia;
uint8_t rcal;
uint8_t electrode;
struct { float v_start, v_stop, scan_rate; uint8_t lp_rtia; } lsv;
struct { float v_hold, interval_ms, duration_s; uint8_t lp_rtia; } amp;
struct { float v_cond, t_cond_ms, v_free, v_total, t_dep_ms, t_meas_ms; uint8_t lp_rtia; } cl;
float temp_c;
struct { float stabilize_s; } ph;
};
} BleCommand;
@ -32,10 +58,32 @@ void ble_wait_for_connection(void);
/* blocking receive from command queue */
int ble_recv_command(BleCommand *cmd, uint32_t timeout_ms);
/* outbound data */
/* outbound: EIS */
int ble_send_sweep_start(uint32_t num_points, float freq_start, float freq_stop);
int ble_send_eis_point(uint16_t index, const EISPoint *pt);
int ble_send_sweep_end(void);
int ble_send_config(const EISConfig *cfg);
/* outbound: LSV */
int ble_send_lsv_start(uint32_t num_points, float v_start, float v_stop);
int ble_send_lsv_point(uint16_t index, float v_mv, float i_ua);
int ble_send_lsv_end(void);
/* outbound: Amperometry */
int ble_send_amp_start(float v_hold);
int ble_send_amp_point(uint16_t index, float t_ms, float i_ua);
int ble_send_amp_end(void);
/* outbound: Chlorine */
int ble_send_cl_start(uint32_t num_points);
int ble_send_cl_point(uint16_t index, float t_ms, float i_ua, uint8_t phase);
int ble_send_cl_result(float i_free_ua, float i_total_ua);
int ble_send_cl_end(void);
/* outbound: pH */
int ble_send_ph_result(float v_ocp_mv, float ph, float temp_c);
/* outbound: temperature */
int ble_send_temp(float temp_c);
#endif

495
main/echem.c Normal file
View File

@ -0,0 +1,495 @@
#include "echem.h"
#include "ad5940.h"
#include "ble.h"
#include <math.h>
#include <string.h>
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
/* LP RTIA register mapping */
static const uint32_t lp_rtia_map[] = {
[LP_RTIA_200] = LPTIARTIA_200R,
[LP_RTIA_1K] = LPTIARTIA_1K,
[LP_RTIA_2K] = LPTIARTIA_2K,
[LP_RTIA_4K] = LPTIARTIA_4K,
[LP_RTIA_10K] = LPTIARTIA_10K,
[LP_RTIA_20K] = LPTIARTIA_20K,
[LP_RTIA_40K] = LPTIARTIA_40K,
[LP_RTIA_100K] = LPTIARTIA_100K,
[LP_RTIA_512K] = LPTIARTIA_512K,
};
/* LP RTIA ohms for current conversion */
static const float lp_rtia_ohms[] = {
[LP_RTIA_200] = 200.0f,
[LP_RTIA_1K] = 1000.0f,
[LP_RTIA_2K] = 2000.0f,
[LP_RTIA_4K] = 4000.0f,
[LP_RTIA_10K] = 10000.0f,
[LP_RTIA_20K] = 20000.0f,
[LP_RTIA_40K] = 40000.0f,
[LP_RTIA_100K] = 100000.0f,
[LP_RTIA_512K] = 512000.0f,
};
/*
* LPDAC math (2.5V reference):
* 6-bit DAC VZERO: 200mV + code * 34.375mV (code 0-63)
* 12-bit DAC VBIAS: 200mV + code * 0.537mV (code 0-4095)
* Cell potential: V_cell = VZERO - VBIAS
*
* VZERO fixed at ~1100mV (code 26).
* VBIAS swept to set cell potential.
*/
#define VZERO_CODE 26
#define VZERO_MV (200.0f + VZERO_CODE * 34.375f) /* ~1093.75 mV */
#define VBIAS_OFFSET 200.0f
#define VBIAS_LSB 0.537f
static uint16_t mv_to_vbias_code(float v_cell_mv)
{
/* V_cell = VZERO - VBIAS → VBIAS = VZERO - V_cell */
float vbias_mv = VZERO_MV - v_cell_mv;
float code = (vbias_mv - VBIAS_OFFSET) / VBIAS_LSB;
if (code < 0) code = 0;
if (code > 4095) code = 4095;
return (uint16_t)(code + 0.5f);
}
static void echem_init_lp(uint32_t rtia_reg)
{
CLKCfg_Type clk;
memset(&clk, 0, sizeof(clk));
clk.HFOSCEn = bTRUE;
clk.HfOSC32MHzMode = bFALSE;
clk.SysClkSrc = SYSCLKSRC_HFOSC;
clk.ADCCLkSrc = ADCCLKSRC_HFOSC;
clk.SysClkDiv = SYSCLKDIV_1;
clk.ADCClkDiv = ADCCLKDIV_1;
clk.LFOSCEn = bTRUE;
clk.HFXTALEn = bFALSE;
AD5940_CLKCfg(&clk);
AFERefCfg_Type ref;
AD5940_StructInit(&ref, sizeof(ref));
ref.HpBandgapEn = bTRUE;
ref.Hp1V1BuffEn = bTRUE;
ref.Hp1V8BuffEn = bTRUE;
ref.LpBandgapEn = bTRUE;
ref.LpRefBufEn = bTRUE;
ref.LpRefBoostEn = bTRUE;
AD5940_REFCfgS(&ref);
AD5940_AFEPwrBW(AFEPWR_LP, AFEBW_250KHZ);
LPLoopCfg_Type lp;
AD5940_StructInit(&lp, sizeof(lp));
lp.LpDacCfg.LpdacSel = LPDAC0;
lp.LpDacCfg.LpDacSrc = LPDACSRC_MMR;
lp.LpDacCfg.LpDacVzeroMux = LPDACVZERO_6BIT;
lp.LpDacCfg.LpDacVbiasMux = LPDACVBIAS_12BIT;
lp.LpDacCfg.LpDacSW = LPDACSW_VZERO2LPTIA | LPDACSW_VBIAS2LPPA;
lp.LpDacCfg.LpDacRef = LPDACREF_2P5;
lp.LpDacCfg.DataRst = bFALSE;
lp.LpDacCfg.PowerEn = bTRUE;
lp.LpDacCfg.DacData6Bit = VZERO_CODE;
lp.LpDacCfg.DacData12Bit = mv_to_vbias_code(0);
lp.LpAmpCfg.LpAmpSel = LPAMP0;
lp.LpAmpCfg.LpAmpPwrMod = LPAMPPWR_BOOST3;
lp.LpAmpCfg.LpPaPwrEn = bTRUE;
lp.LpAmpCfg.LpTiaPwrEn = bTRUE;
lp.LpAmpCfg.LpTiaRf = LPTIARF_SHORT;
lp.LpAmpCfg.LpTiaRload = LPTIARLOAD_SHORT;
lp.LpAmpCfg.LpTiaRtia = rtia_reg;
/* CE0=drive, RE0=ref, SE0=working: SW2,4,5,7,12 */
lp.LpAmpCfg.LpTiaSW = LPTIASW(2) | LPTIASW(4) | LPTIASW(5) |
LPTIASW(7) | LPTIASW(12);
AD5940_LPLoopCfgS(&lp);
/* ADC: SINC2+Notch on LPTIA output */
ADCBaseCfg_Type adc;
adc.ADCMuxP = ADCMUXP_LPTIA0_P;
adc.ADCMuxN = ADCMUXN_LPTIA0_N;
adc.ADCPga = ADCPGA_1P5;
AD5940_ADCBaseCfgS(&adc);
ADCFilterCfg_Type filt;
AD5940_StructInit(&filt, sizeof(filt));
filt.ADCSinc3Osr = ADCSINC3OSR_4;
filt.ADCSinc2Osr = ADCSINC2OSR_667;
filt.ADCAvgNum = ADCAVGNUM_16;
filt.ADCRate = ADCRATE_800KHZ;
filt.BpNotch = bFALSE;
filt.BpSinc3 = bFALSE;
filt.Sinc2NotchEnable = bTRUE;
filt.Sinc3ClkEnable = bTRUE;
filt.Sinc2NotchClkEnable = bTRUE;
filt.DFTClkEnable = bFALSE;
filt.WGClkEnable = bFALSE;
AD5940_ADCFilterCfgS(&filt);
AD5940_INTCCfg(AFEINTC_0, AFEINTSRC_SINC2RDY, bTRUE);
AD5940_INTCCfg(AFEINTC_1, AFEINTSRC_SINC2RDY, bTRUE);
AD5940_INTCClrFlag(AFEINTSRC_ALLINT);
AGPIOCfg_Type gpio;
AD5940_StructInit(&gpio, sizeof(gpio));
gpio.FuncSet = GP0_INT;
gpio.OutputEnSet = AGPIO_Pin0;
AD5940_AGPIOCfg(&gpio);
AD5940_WriteReg(REG_AFE_FIFOCON, 0);
}
static float read_current_ua(float rtia_ohms)
{
AD5940_INTCClrFlag(AFEINTSRC_SINC2RDY);
AD5940_AFECtrlS(AFECTRL_ADCPWR, bTRUE);
AD5940_Delay10us(25);
AD5940_AFECtrlS(AFECTRL_ADCCNV, bTRUE);
AD5940_ClrMCUIntFlag();
while (!AD5940_GetMCUIntFlag())
vTaskDelay(1);
AD5940_AFECtrlS(AFECTRL_ADCCNV | AFECTRL_ADCPWR, bFALSE);
AD5940_INTCClrFlag(AFEINTSRC_SINC2RDY);
uint32_t raw = AD5940_ReadAfeResult(AFERESULT_SINC2);
int32_t code = (raw & (1UL << 15)) ? (int32_t)(raw | 0xFFFF0000UL) : (int32_t)raw;
/* I = V_tia / RTIA, V_tia = code * Vref / (PGA * 32768) */
float v_tia = (float)code * 1.82f / (1.5f * 32768.0f);
float i_a = v_tia / rtia_ohms;
return i_a * 1e6f; /* convert to uA */
}
static void echem_init_adc(void)
{
CLKCfg_Type clk;
memset(&clk, 0, sizeof(clk));
clk.HFOSCEn = bTRUE;
clk.HfOSC32MHzMode = bFALSE;
clk.SysClkSrc = SYSCLKSRC_HFOSC;
clk.ADCCLkSrc = ADCCLKSRC_HFOSC;
clk.SysClkDiv = SYSCLKDIV_1;
clk.ADCClkDiv = ADCCLKDIV_1;
clk.LFOSCEn = bTRUE;
clk.HFXTALEn = bFALSE;
AD5940_CLKCfg(&clk);
AFERefCfg_Type ref;
AD5940_StructInit(&ref, sizeof(ref));
ref.HpBandgapEn = bTRUE;
ref.Hp1V1BuffEn = bTRUE;
ref.Hp1V8BuffEn = bTRUE;
ref.LpBandgapEn = bTRUE;
ref.LpRefBufEn = bTRUE;
ref.LpRefBoostEn = bTRUE;
AD5940_REFCfgS(&ref);
AD5940_AFEPwrBW(AFEPWR_LP, AFEBW_250KHZ);
ADCFilterCfg_Type filt;
AD5940_StructInit(&filt, sizeof(filt));
filt.ADCSinc3Osr = ADCSINC3OSR_4;
filt.ADCSinc2Osr = ADCSINC2OSR_667;
filt.ADCAvgNum = ADCAVGNUM_16;
filt.ADCRate = ADCRATE_800KHZ;
filt.BpNotch = bFALSE;
filt.BpSinc3 = bFALSE;
filt.Sinc2NotchEnable = bTRUE;
filt.Sinc3ClkEnable = bTRUE;
filt.Sinc2NotchClkEnable = bTRUE;
filt.DFTClkEnable = bFALSE;
filt.WGClkEnable = bFALSE;
AD5940_ADCFilterCfgS(&filt);
AD5940_INTCCfg(AFEINTC_0, AFEINTSRC_SINC2RDY, bTRUE);
AD5940_INTCCfg(AFEINTC_1, AFEINTSRC_SINC2RDY, bTRUE);
AD5940_INTCClrFlag(AFEINTSRC_ALLINT);
AGPIOCfg_Type gpio;
AD5940_StructInit(&gpio, sizeof(gpio));
gpio.FuncSet = GP0_INT;
gpio.OutputEnSet = AGPIO_Pin0;
AD5940_AGPIOCfg(&gpio);
AD5940_WriteReg(REG_AFE_FIFOCON, 0);
}
static float read_voltage_mv(uint32_t muxp)
{
AD5940_ADCMuxCfgS(muxp, ADCMUXN_VSET1P1);
AD5940_Delay10us(50);
AD5940_INTCClrFlag(AFEINTSRC_SINC2RDY);
AD5940_AFECtrlS(AFECTRL_ADCPWR, bTRUE);
AD5940_Delay10us(25);
AD5940_AFECtrlS(AFECTRL_ADCCNV, bTRUE);
AD5940_ClrMCUIntFlag();
while (!AD5940_GetMCUIntFlag())
vTaskDelay(1);
AD5940_AFECtrlS(AFECTRL_ADCCNV | AFECTRL_ADCPWR, bFALSE);
AD5940_INTCClrFlag(AFEINTSRC_SINC2RDY);
uint32_t raw = AD5940_ReadAfeResult(AFERESULT_SINC2);
int32_t code = (raw & (1UL << 15)) ? (int32_t)(raw | 0xFFFF0000UL) : (int32_t)raw;
/* V_diff = code * Vref / (PGA * 32768), PGA=1.5, Vref=1.82V */
return (float)code * 1820.0f / (1.5f * 32768.0f);
}
/* ---- public ---- */
void echem_default_lsv(LSVConfig *cfg)
{
memset(cfg, 0, sizeof(*cfg));
cfg->v_start = 0.0f;
cfg->v_stop = 500.0f;
cfg->scan_rate = 50.0f;
cfg->lp_rtia = LP_RTIA_10K;
}
void echem_default_amp(AmpConfig *cfg)
{
memset(cfg, 0, sizeof(*cfg));
cfg->v_hold = 200.0f;
cfg->interval_ms = 100.0f;
cfg->duration_s = 60.0f;
cfg->lp_rtia = LP_RTIA_10K;
}
int echem_lsv(const LSVConfig *cfg, LSVPoint *out, uint32_t max_points)
{
if (cfg->lp_rtia >= LP_RTIA_COUNT) return 0;
float rtia = lp_rtia_ohms[cfg->lp_rtia];
echem_init_lp(lp_rtia_map[cfg->lp_rtia]);
/* set starting voltage and flush SINC2 filter */
AD5940_LPDAC0WriteS(mv_to_vbias_code(cfg->v_start), VZERO_CODE);
vTaskDelay(pdMS_TO_TICKS(50));
for (int i = 0; i < 4; i++)
read_current_ua(rtia);
float v_range = cfg->v_stop - cfg->v_start;
if (fabsf(v_range) < 0.001f) return 0;
/* compute steps to always cover full range within max_points */
uint32_t n_lsb = (uint32_t)(fabsf(v_range / VBIAS_LSB) + 0.5f);
uint32_t n_steps = n_lsb;
uint32_t step_mult = 1;
if (n_steps > max_points) {
step_mult = (n_lsb + max_points - 1) / max_points;
n_steps = (n_lsb + step_mult - 1) / step_mult;
}
if (n_steps < 2) n_steps = 2;
float step = (v_range > 0) ? VBIAS_LSB * step_mult : -VBIAS_LSB * step_mult;
float delay_ms = fabsf(step / cfg->scan_rate) * 1000.0f;
if (delay_ms < 1.0f) delay_ms = 1.0f;
TickType_t ticks = pdMS_TO_TICKS((uint32_t)delay_ms);
if (ticks < 1) ticks = 1;
printf("\n%10s %10s\n", "V(mV)", "I(uA)");
printf("------------------------\n");
for (uint32_t i = 0; i < n_steps; i++) {
float v_mv = cfg->v_start + i * step;
uint16_t code = mv_to_vbias_code(v_mv);
AD5940_LPDAC0WriteS(code, VZERO_CODE);
vTaskDelay(ticks);
float i_ua = read_current_ua(rtia);
out[i].v_mv = v_mv;
out[i].i_ua = i_ua;
printf("%10.1f %10.3f\n", v_mv, i_ua);
}
AD5940_AFECtrlS(AFECTRL_ALL, bFALSE);
return (int)n_steps;
}
int echem_amp(const AmpConfig *cfg, AmpPoint *out, uint32_t max_points)
{
if (cfg->lp_rtia >= LP_RTIA_COUNT) return 0;
float rtia = lp_rtia_ohms[cfg->lp_rtia];
echem_init_lp(lp_rtia_map[cfg->lp_rtia]);
uint16_t code = mv_to_vbias_code(cfg->v_hold);
AD5940_LPDAC0WriteS(code, VZERO_CODE);
vTaskDelay(pdMS_TO_TICKS(50));
for (int i = 0; i < 4; i++)
read_current_ua(rtia);
TickType_t interval = pdMS_TO_TICKS((uint32_t)cfg->interval_ms);
if (interval < 1) interval = 1;
uint32_t max_samples = max_points;
if (cfg->duration_s > 0) {
uint32_t duration_n = (uint32_t)(cfg->duration_s * 1000.0f / cfg->interval_ms + 0.5f);
if (duration_n < max_samples) max_samples = duration_n;
}
printf("\n%10s %10s\n", "t(ms)", "I(uA)");
printf("------------------------\n");
TickType_t t0 = xTaskGetTickCount();
uint32_t count = 0;
for (uint32_t i = 0; i < max_samples; i++) {
/* check for stop command (non-blocking) */
BleCommand cmd;
if (ble_recv_command(&cmd, 0) == 0 && cmd.type == CMD_STOP_AMP)
break;
float i_ua = read_current_ua(rtia);
float t_ms = (float)(xTaskGetTickCount() - t0) * portTICK_PERIOD_MS;
out[i].t_ms = t_ms;
out[i].i_ua = i_ua;
count++;
printf("%10.1f %10.3f\n", t_ms, i_ua);
vTaskDelay(interval);
}
AD5940_AFECtrlS(AFECTRL_ALL, bFALSE);
return (int)count;
}
void echem_default_cl(ClConfig *cfg)
{
memset(cfg, 0, sizeof(*cfg));
cfg->v_cond = 800.0f; /* +800 mV conditioning pulse */
cfg->t_cond_ms = 2000.0f;
cfg->v_free = 100.0f; /* +100 mV for HOCl reduction */
cfg->v_total = -200.0f; /* -200 mV for total chlorine */
cfg->t_dep_ms = 5000.0f; /* 5s settling */
cfg->t_meas_ms = 5000.0f; /* 5s sampling */
cfg->lp_rtia = LP_RTIA_10K;
}
static uint32_t sample_phase(float v_mv, float t_dep_ms, float t_meas_ms,
uint8_t phase, float rtia_ohms,
ClPoint *out, uint32_t idx, uint32_t max_points,
TickType_t t0, float *avg_out)
{
AD5940_LPDAC0WriteS(mv_to_vbias_code(v_mv), VZERO_CODE);
/* settling — no samples recorded */
vTaskDelay(pdMS_TO_TICKS((uint32_t)t_dep_ms));
/* measurement — sample at ~50ms intervals */
uint32_t n_samples = (uint32_t)(t_meas_ms / 50.0f + 0.5f);
if (n_samples < 2) n_samples = 2;
TickType_t interval = pdMS_TO_TICKS(50);
float sum = 0;
uint32_t count = 0;
for (uint32_t i = 0; i < n_samples && idx < max_points; i++) {
float i_ua = read_current_ua(rtia_ohms);
float t_ms = (float)(xTaskGetTickCount() - t0) * portTICK_PERIOD_MS;
out[idx].t_ms = t_ms;
out[idx].i_ua = i_ua;
out[idx].phase = phase;
idx++;
sum += i_ua;
count++;
vTaskDelay(interval);
}
*avg_out = (count > 0) ? sum / (float)count : 0.0f;
return idx;
}
int echem_chlorine(const ClConfig *cfg, ClPoint *out, uint32_t max_points, ClResult *result)
{
if (cfg->lp_rtia >= LP_RTIA_COUNT) return 0;
float rtia = lp_rtia_ohms[cfg->lp_rtia];
echem_init_lp(lp_rtia_map[cfg->lp_rtia]);
TickType_t t0 = xTaskGetTickCount();
uint32_t idx = 0;
printf("Cl: conditioning at %.0f mV for %.0f ms\n", cfg->v_cond, cfg->t_cond_ms);
AD5940_LPDAC0WriteS(mv_to_vbias_code(cfg->v_cond), VZERO_CODE);
vTaskDelay(pdMS_TO_TICKS((uint32_t)cfg->t_cond_ms));
printf("Cl: free chlorine at %.0f mV\n", cfg->v_free);
idx = sample_phase(cfg->v_free, cfg->t_dep_ms, cfg->t_meas_ms,
CL_PHASE_FREE, rtia, out, idx, max_points, t0,
&result->i_free_ua);
printf("Cl: total chlorine at %.0f mV\n", cfg->v_total);
idx = sample_phase(cfg->v_total, cfg->t_dep_ms, cfg->t_meas_ms,
CL_PHASE_TOTAL, rtia, out, idx, max_points, t0,
&result->i_total_ua);
printf("Cl: free=%.3f uA, total=%.3f uA\n", result->i_free_ua, result->i_total_ua);
AD5940_AFECtrlS(AFECTRL_ALL, bFALSE);
return (int)idx;
}
void echem_default_ph(PhConfig *cfg)
{
memset(cfg, 0, sizeof(*cfg));
cfg->stabilize_s = 30.0f;
cfg->temp_c = 25.0f;
}
int echem_ph_ocp(const PhConfig *cfg, PhResult *result)
{
echem_init_adc();
/* ADC mux: read SE0 and RE0 pin voltages directly */
ADCBaseCfg_Type adc;
adc.ADCMuxP = ADCMUXP_VSE0;
adc.ADCMuxN = ADCMUXN_VSET1P1;
adc.ADCPga = ADCPGA_1P5;
AD5940_ADCBaseCfgS(&adc);
printf("pH: stabilizing %0.f s\n", cfg->stabilize_s);
vTaskDelay(pdMS_TO_TICKS((uint32_t)(cfg->stabilize_s * 1000.0f)));
/* average N readings of V(SE0) and V(RE0) */
#define PH_AVG_N 10
float sum_se0 = 0, sum_re0 = 0;
for (int i = 0; i < PH_AVG_N; i++) {
sum_se0 += read_voltage_mv(ADCMUXP_VSE0);
sum_re0 += read_voltage_mv(ADCMUXP_VRE0);
vTaskDelay(pdMS_TO_TICKS(100));
}
float v_se0 = sum_se0 / PH_AVG_N;
float v_re0 = sum_re0 / PH_AVG_N;
float ocp = v_se0 - v_re0;
float t_k = cfg->temp_c + 273.15f;
float slope = 0.1984f * t_k; /* mV/pH at temperature */
result->v_ocp_mv = ocp;
result->ph = 7.0f - ocp / slope;
result->temp_c = cfg->temp_c;
printf("pH: SE0=%.1f mV, RE0=%.1f mV, OCP=%.1f mV, pH=%.2f\n",
v_se0, v_re0, ocp, result->ph);
AD5940_AFECtrlS(AFECTRL_ALL, bFALSE);
return 0;
}

93
main/echem.h Normal file
View File

@ -0,0 +1,93 @@
#ifndef ECHEM_H
#define ECHEM_H
#include <stdint.h>
#define ECHEM_MAX_POINTS 500
typedef enum {
LP_RTIA_200 = 0,
LP_RTIA_1K,
LP_RTIA_2K,
LP_RTIA_4K,
LP_RTIA_10K,
LP_RTIA_20K,
LP_RTIA_40K,
LP_RTIA_100K,
LP_RTIA_512K,
LP_RTIA_COUNT
} EchemLpRtia;
typedef struct {
float v_start; /* mV, cell potential start */
float v_stop; /* mV, cell potential stop */
float scan_rate; /* mV/s */
EchemLpRtia lp_rtia;
} LSVConfig;
typedef struct {
float v_mv; /* mV, applied cell potential */
float i_ua; /* uA, measured current */
} LSVPoint;
typedef struct {
float v_hold; /* mV, applied cell potential */
float interval_ms; /* sampling interval */
float duration_s; /* total duration, 0 = until stopped */
EchemLpRtia lp_rtia;
} AmpConfig;
typedef struct {
float t_ms; /* timestamp */
float i_ua; /* uA, measured current */
} AmpPoint;
/* Chlorine: multi-step chronoamperometry on Au/Ag */
typedef struct {
float v_cond; /* mV, conditioning potential (surface cleaning) */
float t_cond_ms; /* ms, conditioning duration */
float v_free; /* mV, free chlorine measurement potential */
float v_total; /* mV, total chlorine measurement potential */
float t_dep_ms; /* ms, deposition/settling time per step */
float t_meas_ms; /* ms, measurement sampling time per step */
EchemLpRtia lp_rtia;
} ClConfig;
#define CL_PHASE_COND 0
#define CL_PHASE_FREE 1
#define CL_PHASE_TOTAL 2
typedef struct {
float t_ms;
float i_ua;
uint8_t phase;
} ClPoint;
typedef struct {
float i_free_ua;
float i_total_ua;
} ClResult;
/* pH: open circuit potentiometry on Au/Ag */
typedef struct {
float stabilize_s; /* seconds to wait for OCP stabilization */
float temp_c; /* temperature for Nernst calculation */
} PhConfig;
typedef struct {
float v_ocp_mv; /* measured OCP: V(SE0) - V(RE0) */
float ph; /* Nernst-derived pH */
float temp_c; /* temperature used */
} PhResult;
void echem_default_lsv(LSVConfig *cfg);
void echem_default_amp(AmpConfig *cfg);
void echem_default_cl(ClConfig *cfg);
void echem_default_ph(PhConfig *cfg);
int echem_lsv(const LSVConfig *cfg, LSVPoint *out, uint32_t max_points);
int echem_amp(const AmpConfig *cfg, AmpPoint *out, uint32_t max_points);
int echem_chlorine(const ClConfig *cfg, ClPoint *out, uint32_t max_points, ClResult *result);
int echem_ph_ocp(const PhConfig *cfg, PhResult *result);
#endif

View File

@ -15,6 +15,8 @@ static struct {
float sys_clk;
float rcal_ohms;
uint32_t rcal_sw_d, rcal_sw_p, rcal_sw_n, rcal_sw_t;
uint32_t dut_sw_d, dut_sw_p, dut_sw_n, dut_sw_t;
uint32_t dut_mux_vp, dut_mux_vn;
uint32_t rtia_reg;
uint32_t dertia_reg;
} ctx;
@ -54,6 +56,26 @@ static void resolve_config(void)
ctx.rcal_sw_t = SWT_AIN0 | SWT_TRTIA;
break;
}
/* DUT electrode routing */
switch (ctx.cfg.electrode) {
case ELEC_3WIRE:
ctx.dut_sw_d = SWD_CE0;
ctx.dut_sw_p = SWP_RE0;
ctx.dut_sw_n = SWN_SE0;
ctx.dut_sw_t = SWT_SE0LOAD | SWT_TRTIA;
ctx.dut_mux_vp = ADCMUXP_P_NODE;
ctx.dut_mux_vn = ADCMUXN_N_NODE;
break;
default: /* ELEC_4WIRE */
ctx.dut_sw_d = SWD_AIN3;
ctx.dut_sw_p = SWP_AIN3;
ctx.dut_sw_n = SWN_AIN0;
ctx.dut_sw_t = SWT_AIN0 | SWT_TRTIA;
ctx.dut_mux_vp = ADCMUXP_AIN2;
ctx.dut_mux_vn = ADCMUXN_AIN1;
break;
}
}
static void apply_hsloop(void)
@ -98,6 +120,7 @@ void eis_default_config(EISConfig *cfg)
cfg->points_per_decade = 10;
cfg->rtia = RTIA_5K;
cfg->rcal = RCAL_3K;
cfg->electrode = ELEC_4WIRE;
cfg->pga = ADCPGA_1P5;
cfg->excit_amp = 500;
}
@ -252,16 +275,30 @@ static void dft_measure(uint32_t mux_p, uint32_t mux_n, iImpCar_Type *out)
out->Image = -out->Image;
}
/* RTIA calibration: 2 DFTs through current RCAL switch config */
static fImpCar_Type measure_rtia(void)
{
iImpCar_Type v_rcal, v_raw;
dft_measure(ADCMUXP_P_NODE, ADCMUXN_N_NODE, &v_rcal);
dft_measure(ADCMUXP_HSTIA_P, ADCMUXN_HSTIA_N, &v_raw);
v_raw.Real = -v_raw.Real;
v_raw.Image = -v_raw.Image;
fImpCar_Type rtia = AD5940_ComplexDivInt(&v_raw, &v_rcal);
rtia.Real *= ctx.rcal_ohms;
rtia.Image *= ctx.rcal_ohms;
return rtia;
}
/* ---------- measurement ---------- */
int eis_measure_point(float freq_hz, EISPoint *out)
{
configure_freq(freq_hz);
iImpCar_Type v_rcal, v_rtia, v_tia, v_sense;
/* Phase 1: RTIA calibration through RCAL */
SWMatrixCfg_Type sw;
iImpCar_Type v_tia, v_sense;
/* switch to RCAL before power-up */
sw.Dswitch = ctx.rcal_sw_d;
sw.Pswitch = ctx.rcal_sw_p;
sw.Nswitch = ctx.rcal_sw_n;
@ -272,30 +309,62 @@ int eis_measure_point(float freq_hz, EISPoint *out)
AFECTRL_EXTBUFPWR | AFECTRL_DACREFPWR | AFECTRL_HSDACPWR |
AFECTRL_SINC2NOTCH, bTRUE);
dft_measure(ADCMUXP_P_NODE, ADCMUXN_N_NODE, &v_rcal);
dft_measure(ADCMUXP_HSTIA_P, ADCMUXN_HSTIA_N, &v_rtia);
/* RCAL before */
fImpCar_Type rtia_before = measure_rtia();
v_rtia.Real = -v_rtia.Real;
v_rtia.Image = -v_rtia.Image;
fImpCar_Type rtia = AD5940_ComplexDivInt(&v_rtia, &v_rcal);
rtia.Real *= ctx.rcal_ohms;
rtia.Image *= ctx.rcal_ohms;
/* Phase 2: DUT — software 4-wire */
sw.Dswitch = SWD_AIN3;
sw.Pswitch = SWP_AIN3;
sw.Nswitch = SWN_AIN0;
sw.Tswitch = SWT_AIN0 | SWT_TRTIA;
/* DUT forward */
sw.Dswitch = ctx.dut_sw_d;
sw.Pswitch = ctx.dut_sw_p;
sw.Nswitch = ctx.dut_sw_n;
sw.Tswitch = ctx.dut_sw_t;
AD5940_SWMatrixCfgS(&sw);
AD5940_Delay10us(50);
dft_measure(ADCMUXP_HSTIA_P, ADCMUXN_HSTIA_N, &v_tia);
v_tia.Real = -v_tia.Real;
v_tia.Image = -v_tia.Image;
dft_measure(ctx.dut_mux_vp, ctx.dut_mux_vn, &v_sense);
dft_measure(ADCMUXP_AIN2, ADCMUXN_AIN1, &v_sense);
iImpCar_Type v_tia_fwd = v_tia;
iImpCar_Type v_sense_fwd = v_sense;
/* RCAL after */
sw.Dswitch = ctx.rcal_sw_d;
sw.Pswitch = ctx.rcal_sw_p;
sw.Nswitch = ctx.rcal_sw_n;
sw.Tswitch = ctx.rcal_sw_t;
AD5940_SWMatrixCfgS(&sw);
AD5940_Delay10us(50);
fImpCar_Type rtia_after = measure_rtia();
/* DUT reverse (DUT first, then RCAL) */
sw.Dswitch = ctx.dut_sw_d;
sw.Pswitch = ctx.dut_sw_p;
sw.Nswitch = ctx.dut_sw_n;
sw.Tswitch = ctx.dut_sw_t;
AD5940_SWMatrixCfgS(&sw);
AD5940_Delay10us(50);
dft_measure(ADCMUXP_HSTIA_P, ADCMUXN_HSTIA_N, &v_tia);
v_tia.Real = -v_tia.Real;
v_tia.Image = -v_tia.Image;
dft_measure(ctx.dut_mux_vp, ctx.dut_mux_vn, &v_sense);
iImpCar_Type v_tia_rev = v_tia;
iImpCar_Type v_sense_rev = v_sense;
/* RCAL reverse */
sw.Dswitch = ctx.rcal_sw_d;
sw.Pswitch = ctx.rcal_sw_p;
sw.Nswitch = ctx.rcal_sw_n;
sw.Tswitch = ctx.rcal_sw_t;
AD5940_SWMatrixCfgS(&sw);
AD5940_Delay10us(50);
fImpCar_Type rtia_rev = measure_rtia();
/* power down, open switches */
AD5940_AFECtrlS(AFECTRL_WG | AFECTRL_ADCPWR | AFECTRL_ADCCNV |
AFECTRL_DFT | AFECTRL_SINC2NOTCH | AFECTRL_HSDACPWR |
AFECTRL_HSTIAPWR | AFECTRL_INAMPPWR |
@ -307,18 +376,36 @@ int eis_measure_point(float freq_hz, EISPoint *out)
sw.Tswitch = SWT_OPEN;
AD5940_SWMatrixCfgS(&sw);
/* Z_DUT = V_sense × Rtia_cal / V_TIA */
fImpCar_Type fv_sense = { (float)v_sense.Real, (float)v_sense.Image };
fImpCar_Type fv_tia = { (float)v_tia.Real, (float)v_tia.Image };
/* forward Z using averaged RTIA bracket */
fImpCar_Type rtia_avg = {
.Real = (rtia_before.Real + rtia_after.Real) * 0.5f,
.Image = (rtia_before.Image + rtia_after.Image) * 0.5f,
};
fImpCar_Type fs_fwd = { (float)v_sense_fwd.Real, (float)v_sense_fwd.Image };
fImpCar_Type ft_fwd = { (float)v_tia_fwd.Real, (float)v_tia_fwd.Image };
fImpCar_Type num = AD5940_ComplexMulFloat(&fs_fwd, &rtia_avg);
fImpCar_Type z_fwd = AD5940_ComplexDivFloat(&num, &ft_fwd);
fImpCar_Type num = AD5940_ComplexMulFloat(&fv_sense, &rtia);
fImpCar_Type z = AD5940_ComplexDivFloat(&num, &fv_tia);
/* reverse Z using RTIA from RCAL measured after DUT */
fImpCar_Type fs_rev = { (float)v_sense_rev.Real, (float)v_sense_rev.Image };
fImpCar_Type ft_rev = { (float)v_tia_rev.Real, (float)v_tia_rev.Image };
num = AD5940_ComplexMulFloat(&fs_rev, &rtia_rev);
fImpCar_Type z_rev = AD5940_ComplexDivFloat(&num, &ft_rev);
float mag_fwd = AD5940_ComplexMag(&z_fwd);
float mag_rev = AD5940_ComplexMag(&z_rev);
out->freq_hz = freq_hz;
out->z_real = z.Real;
out->z_imag = z.Image;
out->mag_ohms = AD5940_ComplexMag(&z);
out->phase_deg = AD5940_ComplexPhase(&z) * (float)(180.0 / M_PI);
out->z_real = z_fwd.Real;
out->z_imag = z_fwd.Image;
out->mag_ohms = mag_fwd;
out->phase_deg = AD5940_ComplexPhase(&z_fwd) * (float)(180.0 / M_PI);
out->rtia_mag_before = AD5940_ComplexMag(&rtia_before);
out->rtia_mag_after = AD5940_ComplexMag(&rtia_after);
out->rev_mag = mag_rev;
out->rev_phase = AD5940_ComplexPhase(&z_rev) * (float)(180.0 / M_PI);
out->pct_err = (mag_fwd > 0.0f)
? fabsf(mag_fwd - mag_rev) / mag_fwd * 100.0f : 0.0f;
return 0;
}
@ -328,6 +415,10 @@ int eis_sweep(EISPoint *out, uint32_t max_points)
uint32_t n = eis_calc_num_points(&ctx.cfg);
if (n > max_points) n = max_points;
/* guard: throwaway at start frequency to warm up AFE */
EISPoint guard;
eis_measure_point(ctx.cfg.freq_start_hz, &guard);
SoftSweepCfg_Type sweep;
sweep.SweepEn = bTRUE;
sweep.SweepStart = ctx.cfg.freq_start_hz;
@ -336,24 +427,27 @@ int eis_sweep(EISPoint *out, uint32_t max_points)
sweep.SweepLog = bTRUE;
sweep.SweepIndex = 0;
printf("\n%10s %12s %10s %12s %12s\n",
"Freq(Hz)", "|Z|(Ohm)", "Phase(deg)", "Re(Ohm)", "Im(Ohm)");
printf("--------------------------------------------------------------\n");
printf("\n%10s %12s %10s %12s %12s %7s\n",
"Freq(Hz)", "|Z|(Ohm)", "Phase(deg)", "Re(Ohm)", "Im(Ohm)", "Err%");
printf("---------------------------------------------------------------------\n");
eis_measure_point(ctx.cfg.freq_start_hz, &out[0]);
printf("%10.1f %12.2f %10.2f %12.2f %12.2f\n",
printf("%10.1f %12.2f %10.2f %12.2f %12.2f %6.2f%%\n",
out[0].freq_hz, out[0].mag_ohms, out[0].phase_deg,
out[0].z_real, out[0].z_imag);
out[0].z_real, out[0].z_imag, out[0].pct_err);
for (uint32_t i = 1; i < n; i++) {
float freq;
AD5940_SweepNext(&sweep, &freq);
eis_measure_point(freq, &out[i]);
printf("%10.1f %12.2f %10.2f %12.2f %12.2f\n",
printf("%10.1f %12.2f %10.2f %12.2f %12.2f %6.2f%%\n",
out[i].freq_hz, out[i].mag_ohms, out[i].phase_deg,
out[i].z_real, out[i].z_imag);
out[i].z_real, out[i].z_imag, out[i].pct_err);
}
/* guard: throwaway at stop frequency to cap the sweep cleanly */
eis_measure_point(ctx.cfg.freq_stop_hz, &guard);
AD5940_AFECtrlS(AFECTRL_ALL, bFALSE);
return (int)n;
}

View File

@ -18,6 +18,12 @@ typedef enum {
RCAL_COUNT
} EISRcal;
typedef enum {
ELEC_4WIRE = 0, /* AIN3 drive, AIN0 return, AIN2/AIN1 sense */
ELEC_3WIRE, /* CE0 drive, RE0 sense+, SE0 sense-/TIA */
ELEC_COUNT
} EISElectrode;
typedef struct {
float freq_start_hz;
float freq_stop_hz;
@ -25,6 +31,7 @@ typedef struct {
EISRtia rtia;
EISRcal rcal;
EISElectrode electrode;
uint32_t pga;
uint32_t excit_amp;
} EISConfig;
@ -35,6 +42,11 @@ typedef struct {
float phase_deg;
float z_real;
float z_imag;
float rtia_mag_before;
float rtia_mag_after;
float rev_mag;
float rev_phase;
float pct_err;
} EISPoint;
void eis_default_config(EISConfig *cfg);

View File

@ -2,15 +2,20 @@
#include "ad5940.h"
#include "ad5941_port.h"
#include "eis.h"
#include "echem.h"
#include "ble.h"
#include "temp.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "nvs_flash.h"
#include "esp_log.h"
#define AD5941_EXPECTED_ADIID 0x4144
static EISConfig cfg;
static EISPoint results[EIS_MAX_POINTS];
static LSVPoint lsv_results[ECHEM_MAX_POINTS];
static AmpPoint amp_results[ECHEM_MAX_POINTS];
static ClPoint cl_results[ECHEM_MAX_POINTS];
static void do_sweep(void)
{
@ -50,7 +55,9 @@ void app_main(void)
if (adiid != AD5941_EXPECTED_ADIID) return;
eis_default_config(&cfg);
temp_init();
esp_log_level_set("NimBLE", ESP_LOG_WARN);
ble_init();
printf("Waiting for BLE connection...\n");
ble_wait_for_connection();
@ -69,7 +76,6 @@ void app_main(void)
eis_reconfigure(&cfg);
printf("Sweep: %.0f-%.0f Hz, %u ppd\n",
cfg.freq_start_hz, cfg.freq_stop_hz, cfg.points_per_decade);
ble_send_config(&cfg);
break;
case CMD_SET_RTIA:
@ -78,7 +84,6 @@ void app_main(void)
eis_reconfigure(&cfg);
printf("RTIA: %u\n", cfg.rtia);
}
ble_send_config(&cfg);
break;
case CMD_SET_RCAL:
@ -87,16 +92,115 @@ void app_main(void)
eis_reconfigure(&cfg);
printf("RCAL: %u\n", cfg.rcal);
}
ble_send_config(&cfg);
break;
case CMD_SET_ELECTRODE:
if (cmd.electrode < ELEC_COUNT) {
cfg.electrode = cmd.electrode;
eis_reconfigure(&cfg);
printf("Electrode: %s\n",
cfg.electrode == ELEC_3WIRE ? "3-wire (CE0/RE0/SE0)" : "4-wire (AIN)");
}
break;
case CMD_START_SWEEP:
printf("Config: %.0f-%.0f Hz, %u ppd, rtia=%u, rcal=%u, elec=%s\n",
cfg.freq_start_hz, cfg.freq_stop_hz, cfg.points_per_decade,
cfg.rtia, cfg.rcal,
cfg.electrode == ELEC_3WIRE ? "3-wire" : "4-wire");
do_sweep();
break;
case CMD_GET_CONFIG:
ble_send_config(&cfg);
break;
case CMD_START_LSV: {
LSVConfig lsv_cfg;
lsv_cfg.v_start = cmd.lsv.v_start;
lsv_cfg.v_stop = cmd.lsv.v_stop;
lsv_cfg.scan_rate = cmd.lsv.scan_rate;
lsv_cfg.lp_rtia = cmd.lsv.lp_rtia;
printf("LSV: %.0f-%.0f mV, %.0f mV/s, rtia=%u\n",
lsv_cfg.v_start, lsv_cfg.v_stop, lsv_cfg.scan_rate, lsv_cfg.lp_rtia);
int got = echem_lsv(&lsv_cfg, lsv_results, ECHEM_MAX_POINTS);
printf("LSV complete: %d points\n", got);
ble_send_lsv_start(got, lsv_cfg.v_start, lsv_cfg.v_stop);
for (int i = 0; i < got; i++) {
ble_send_lsv_point(i, lsv_results[i].v_mv, lsv_results[i].i_ua);
vTaskDelay(pdMS_TO_TICKS(10));
}
ble_send_lsv_end();
break;
}
case CMD_START_AMP: {
AmpConfig amp_cfg;
amp_cfg.v_hold = cmd.amp.v_hold;
amp_cfg.interval_ms = cmd.amp.interval_ms;
amp_cfg.duration_s = cmd.amp.duration_s;
amp_cfg.lp_rtia = cmd.amp.lp_rtia;
printf("Amp: %.0f mV, %.0f ms interval, %.0f s\n",
amp_cfg.v_hold, amp_cfg.interval_ms, amp_cfg.duration_s);
ble_send_amp_start(amp_cfg.v_hold);
int got = echem_amp(&amp_cfg, amp_results, ECHEM_MAX_POINTS);
printf("Amp complete: %d points\n", got);
for (int i = 0; i < got; i++) {
ble_send_amp_point(i, amp_results[i].t_ms, amp_results[i].i_ua);
vTaskDelay(pdMS_TO_TICKS(10));
}
ble_send_amp_end();
break;
}
case CMD_GET_TEMP:
ble_send_temp(temp_get());
break;
case CMD_START_PH: {
PhConfig ph_cfg;
ph_cfg.stabilize_s = cmd.ph.stabilize_s;
ph_cfg.temp_c = temp_get();
printf("pH: stabilize %.0f s, temp %.1f C\n",
ph_cfg.stabilize_s, ph_cfg.temp_c);
PhResult ph_result;
echem_ph_ocp(&ph_cfg, &ph_result);
printf("pH: OCP=%.1f mV, pH=%.2f\n",
ph_result.v_ocp_mv, ph_result.ph);
ble_send_ph_result(ph_result.v_ocp_mv, ph_result.ph, ph_result.temp_c);
break;
}
case CMD_START_CL: {
ClConfig cl_cfg;
cl_cfg.v_cond = cmd.cl.v_cond;
cl_cfg.t_cond_ms = cmd.cl.t_cond_ms;
cl_cfg.v_free = cmd.cl.v_free;
cl_cfg.v_total = cmd.cl.v_total;
cl_cfg.t_dep_ms = cmd.cl.t_dep_ms;
cl_cfg.t_meas_ms = cmd.cl.t_meas_ms;
cl_cfg.lp_rtia = cmd.cl.lp_rtia;
ClResult cl_result;
int got = echem_chlorine(&cl_cfg, cl_results, ECHEM_MAX_POINTS, &cl_result);
printf("Cl complete: %d points, free=%.3f uA, total=%.3f uA\n",
got, cl_result.i_free_ua, cl_result.i_total_ua);
ble_send_cl_start(got);
for (int i = 0; i < got; i++) {
ble_send_cl_point(i, cl_results[i].t_ms, cl_results[i].i_ua, cl_results[i].phase);
vTaskDelay(pdMS_TO_TICKS(10));
}
ble_send_cl_result(cl_result.i_free_ua, cl_result.i_total_ua);
ble_send_cl_end();
break;
}
}
}
}

132
main/temp.c Normal file
View File

@ -0,0 +1,132 @@
#include "temp.h"
#include "driver/gpio.h"
#include "esp_rom_sys.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <math.h>
#define OW_PIN GPIO_NUM_35
static float cached_temp = 25.0f;
static portMUX_TYPE ow_mux = portMUX_INITIALIZER_UNLOCKED;
static void ow_low(void)
{
gpio_set_level(OW_PIN, 0);
gpio_set_direction(OW_PIN, GPIO_MODE_OUTPUT);
}
static void ow_release(void)
{
gpio_set_direction(OW_PIN, GPIO_MODE_INPUT);
}
static int ow_reset(void)
{
ow_low();
esp_rom_delay_us(480);
taskENTER_CRITICAL(&ow_mux);
ow_release();
esp_rom_delay_us(70);
int presence = !gpio_get_level(OW_PIN);
taskEXIT_CRITICAL(&ow_mux);
esp_rom_delay_us(410);
return presence;
}
static void ow_write_bit(int bit)
{
taskENTER_CRITICAL(&ow_mux);
ow_low();
if (bit) {
esp_rom_delay_us(6);
ow_release();
taskEXIT_CRITICAL(&ow_mux);
esp_rom_delay_us(54);
} else {
esp_rom_delay_us(60);
ow_release();
taskEXIT_CRITICAL(&ow_mux);
esp_rom_delay_us(1);
}
}
static int ow_read_bit(void)
{
taskENTER_CRITICAL(&ow_mux);
ow_low();
esp_rom_delay_us(2);
ow_release();
esp_rom_delay_us(12);
int bit = gpio_get_level(OW_PIN);
taskEXIT_CRITICAL(&ow_mux);
esp_rom_delay_us(46);
return bit;
}
static void ow_write_byte(uint8_t byte)
{
for (int i = 0; i < 8; i++) {
ow_write_bit(byte & 1);
byte >>= 1;
}
}
static uint8_t ow_read_byte(void)
{
uint8_t byte = 0;
for (int i = 0; i < 8; i++)
if (ow_read_bit())
byte |= (1 << i);
return byte;
}
static float ds18b20_read(void)
{
if (!ow_reset()) return NAN;
ow_write_byte(0xCC); /* Skip ROM */
ow_write_byte(0x44); /* Convert T */
vTaskDelay(pdMS_TO_TICKS(750));
if (!ow_reset()) return NAN;
ow_write_byte(0xCC);
ow_write_byte(0xBE); /* Read Scratchpad */
uint8_t lsb = ow_read_byte();
uint8_t msb = ow_read_byte();
int16_t raw = (msb << 8) | lsb;
return raw / 16.0f;
}
static void temp_task(void *arg)
{
(void)arg;
for (;;) {
float t = ds18b20_read();
if (!isnan(t))
cached_temp = t;
vTaskDelay(pdMS_TO_TICKS(500));
}
}
void temp_init(void)
{
gpio_config_t io = {
.pin_bit_mask = (1ULL << OW_PIN),
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io);
xTaskCreate(temp_task, "temp", 2048, NULL, 3, NULL);
}
float temp_get(void)
{
return cached_temp;
}

7
main/temp.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef TEMP_H
#define TEMP_H
void temp_init(void);
float temp_get(void);
#endif

487
sdkconfig
View File

@ -1,7 +1,9 @@
#
# Automatically generated file. DO NOT EDIT.
# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Configuration
# Espressif IoT Development Framework (ESP-IDF) 5.4.3 Project Configuration
#
CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000
CONFIG_SOC_MPU_REGIONS_MAX_NUM=8
CONFIG_SOC_ADC_SUPPORTED=y
CONFIG_SOC_UART_SUPPORTED=y
CONFIG_SOC_PCNT_SUPPORTED=y
@ -95,7 +97,6 @@ CONFIG_SOC_APB_BACKUP_DMA=y
CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y
CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y
CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y
CONFIG_SOC_CACHE_ACS_INVALID_STATE_ON_PANIC=y
CONFIG_SOC_CPU_CORES_NUM=2
CONFIG_SOC_CPU_INTR_NUM=32
CONFIG_SOC_CPU_HAS_FPU=y
@ -124,7 +125,6 @@ CONFIG_SOC_GPIO_OUT_RANGE_MAX=48
CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000
CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y
CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3
CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y
CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8
CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8
CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y
@ -147,10 +147,8 @@ CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y
CONFIG_SOC_I2S_SUPPORTS_PCM=y
CONFIG_SOC_I2S_SUPPORTS_PDM=y
CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y
CONFIG_SOC_I2S_SUPPORTS_PCM2PDM=y
CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y
CONFIG_SOC_I2S_SUPPORTS_PDM2PCM=y
CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2
CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y
CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4
CONFIG_SOC_I2S_SUPPORTS_TDM=y
CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y
@ -172,8 +170,6 @@ CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3
CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y
CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1
CONFIG_SOC_MMU_PERIPH_NUM=1
CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000
CONFIG_SOC_MPU_REGIONS_MAX_NUM=8
CONFIG_SOC_PCNT_GROUPS=1
CONFIG_SOC_PCNT_UNITS_PER_GROUP=4
CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2
@ -185,7 +181,7 @@ CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8
CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48
CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y
CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y
CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y
CONFIG_SOC_RMT_SUPPORT_ASYNC_STOP=y
CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y
CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y
CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y
@ -208,6 +204,7 @@ CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16
CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128
CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549
CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128
CONFIG_SOC_RTC_CNTL_NEEDS_ATOMIC_ACCESS=y
CONFIG_SOC_RTCIO_PIN_COUNT=22
CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y
CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y
@ -234,7 +231,7 @@ CONFIG_SOC_SPI_SCT_SUPPORTED=y
CONFIG_SOC_SPI_SCT_REG_NUM=14
CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y
CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA
CONFIG_SOC_MEMSPI_SRC_FREQ_120M_SUPPORTED=y
CONFIG_SOC_MEMSPI_SRC_FREQ_120M=y
CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y
CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y
CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y
@ -257,18 +254,13 @@ CONFIG_SOC_LP_TIMER_BIT_WIDTH_LO=32
CONFIG_SOC_LP_TIMER_BIT_WIDTH_HI=16
CONFIG_SOC_TOUCH_SENSOR_VERSION=2
CONFIG_SOC_TOUCH_SENSOR_NUM=15
CONFIG_SOC_TOUCH_MIN_CHAN_ID=1
CONFIG_SOC_TOUCH_MAX_CHAN_ID=14
CONFIG_SOC_TOUCH_SUPPORT_BENCHMARK=y
CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y
CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y
CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y
CONFIG_SOC_TOUCH_SUPPORT_DENOISE_CHAN=y
CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3
CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y
CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1
CONFIG_SOC_TWAI_CONTROLLER_NUM=1
CONFIG_SOC_TWAI_MASK_FILTER_NUM=1
CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y
CONFIG_SOC_TWAI_BRP_MIN=2
CONFIG_SOC_TWAI_BRP_MAX=16384
@ -282,7 +274,6 @@ CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y
CONFIG_SOC_UART_SUPPORT_APB_CLK=y
CONFIG_SOC_UART_SUPPORT_RTC_CLK=y
CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y
CONFIG_SOC_UART_WAKEUP_SUPPORT_ACTIVE_THRESH_MODE=y
CONFIG_SOC_UHCI_NUM=1
CONFIG_SOC_USB_OTG_PERIPH_NUM=1
CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968
@ -326,7 +317,6 @@ CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y
CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y
CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y
CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y
CONFIG_SOC_CLK_LP_FAST_SUPPORT_XTAL_D2=y
CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y
CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y
CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y
@ -353,7 +343,7 @@ CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y
CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y
CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y
CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y
CONFIG_SOC_SPI_MEM_SUPPORT_FLASH_OPI_MODE=y
CONFIG_SOC_SPI_MEM_SUPPORT_OPI_MODE=y
CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y
CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y
CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y
@ -418,17 +408,6 @@ CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y
CONFIG_BOOTLOADER_PROJECT_VER=1
# end of Bootloader manager
#
# Application Rollback
#
# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
# end of Application Rollback
#
# Recovery Bootloader and Rollback
#
# end of Recovery Bootloader and Rollback
CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0
CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set
@ -438,8 +417,6 @@ CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
#
# Log
#
CONFIG_BOOTLOADER_LOG_VERSION_1=y
CONFIG_BOOTLOADER_LOG_VERSION=1
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
@ -454,13 +431,6 @@ CONFIG_BOOTLOADER_LOG_LEVEL=3
# CONFIG_BOOTLOADER_LOG_COLORS is not set
CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y
# end of Format
#
# Settings
#
CONFIG_BOOTLOADER_LOG_MODE_TEXT_EN=y
CONFIG_BOOTLOADER_LOG_MODE_TEXT=y
# end of Settings
# end of Log
#
@ -477,6 +447,7 @@ CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y
CONFIG_BOOTLOADER_WDT_ENABLE=y
# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set
CONFIG_BOOTLOADER_WDT_TIME_MS=9000
# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set
@ -520,7 +491,6 @@ CONFIG_ESP_ROM_HAS_HAL_WDT=y
CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y
CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y
CONFIG_ESP_ROM_HAS_SPI_FLASH=y
CONFIG_ESP_ROM_HAS_SPI_FLASH_MMAP=y
CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y
CONFIG_ESP_ROM_HAS_NEWLIB=y
CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y
@ -660,30 +630,33 @@ CONFIG_BT_CONTROLLER_ENABLED=y
#
# NimBLE Options
#
#
# General
#
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y
# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_NONE is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_ERROR is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_WARNING is not set
CONFIG_BT_NIMBLE_LOG_LEVEL_INFO=y
# CONFIG_BT_NIMBLE_LOG_LEVEL_DEBUG is not set
CONFIG_BT_NIMBLE_LOG_LEVEL=1
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
CONFIG_BT_NIMBLE_MAX_BONDS=3
CONFIG_BT_NIMBLE_MAX_CCCDS=8
CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=0
CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=y
# CONFIG_BT_NIMBLE_PINNED_TO_CORE_1 is not set
CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=4096
CONFIG_BT_NIMBLE_LEGACY_VHCI_ENABLE=y
# end of General
#
# Roles and Profiles
#
CONFIG_BT_NIMBLE_ROLE_CENTRAL=y
CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y
CONFIG_BT_NIMBLE_ROLE_OBSERVER=y
CONFIG_BT_NIMBLE_GATT_CLIENT=y
CONFIG_BT_NIMBLE_GATT_SERVER=y
CONFIG_BT_NIMBLE_NVS_PERSIST=y
# CONFIG_BT_NIMBLE_SMP_ID_RESET is not set
# end of Roles and Profiles
#
# Security (SMP)
#
CONFIG_BT_NIMBLE_SECURITY_ENABLE=y
CONFIG_BT_NIMBLE_SM_LEGACY=y
CONFIG_BT_NIMBLE_SM_SC=y
@ -691,14 +664,46 @@ CONFIG_BT_NIMBLE_SM_SC=y
CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION=y
CONFIG_BT_NIMBLE_SM_LVL=0
CONFIG_BT_NIMBLE_SM_SC_ONLY=0
CONFIG_BT_NIMBLE_PRINT_ERR_NAME=y
# CONFIG_BT_NIMBLE_DEBUG is not set
# CONFIG_BT_NIMBLE_DYNAMIC_SERVICE is not set
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
# CONFIG_BT_NIMBLE_SMP_ID_RESET is not set
CONFIG_BT_NIMBLE_NVS_PERSIST=y
CONFIG_BT_NIMBLE_MAX_BONDS=3
# CONFIG_BT_NIMBLE_HANDLE_REPEAT_PAIRING_DELETION is not set
# end of Security (SMP)
#
# GAP
#
CONFIG_BT_NIMBLE_RPA_TIMEOUT=900
CONFIG_BT_NIMBLE_WHITELIST_SIZE=12
CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=y
CONFIG_BT_NIMBLE_MAX_CONN_REATTEMPT=3
CONFIG_BT_NIMBLE_HS_PVCY=y
# CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN is not set
# CONFIG_BT_NIMBLE_HOST_QUEUE_CONG_CHECK is not set
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
CONFIG_BT_NIMBLE_MAX_CCCDS=8
CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y
CONFIG_BT_NIMBLE_HS_STOP_TIMEOUT_MS=2000
CONFIG_BT_NIMBLE_USE_ESP_TIMER=y
# CONFIG_BT_NIMBLE_HS_FLOW_CTRL is not set
# end of GAP
#
# GATT / ATT
#
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
CONFIG_BT_NIMBLE_ATT_MAX_PREP_ENTRIES=64
CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE=0
CONFIG_BT_NIMBLE_GATT_MAX_PROCS=4
# CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER is not set
# CONFIG_BT_NIMBLE_GATT_CACHING is not set
# CONFIG_BT_NIMBLE_INCL_SVC_DISCOVERY is not set
# end of GATT / ATT
#
# L2CAP
#
CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=0
# end of L2CAP
#
# Memory Settings
@ -713,17 +718,12 @@ CONFIG_BT_NIMBLE_TRANSPORT_EVT_SIZE=70
CONFIG_BT_NIMBLE_TRANSPORT_EVT_COUNT=30
CONFIG_BT_NIMBLE_TRANSPORT_EVT_DISCARD_COUNT=8
CONFIG_BT_NIMBLE_L2CAP_COC_SDU_BUFF_COUNT=1
# CONFIG_BT_NIMBLE_MEMPOOL_RUNTIME_ALLOC is not set
# end of Memory Settings
CONFIG_BT_NIMBLE_GATT_MAX_PROCS=4
# CONFIG_BT_NIMBLE_HS_FLOW_CTRL is not set
CONFIG_BT_NIMBLE_RPA_TIMEOUT=900
# CONFIG_BT_NIMBLE_MESH is not set
CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y
CONFIG_BT_NIMBLE_HS_STOP_TIMEOUT_MS=2000
CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=y
CONFIG_BT_NIMBLE_MAX_CONN_REATTEMPT=3
# CONFIG_BT_NIMBLE_HANDLE_REPEAT_PAIRING_DELETION is not set
#
# BLE 5.x Features
#
CONFIG_BT_NIMBLE_50_FEATURE_SUPPORT=y
CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_2M_PHY=y
CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_CODED_PHY=y
@ -731,17 +731,11 @@ CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_CODED_PHY=y
CONFIG_BT_NIMBLE_EXT_SCAN=y
CONFIG_BT_NIMBLE_ENABLE_PERIODIC_SYNC=y
CONFIG_BT_NIMBLE_MAX_PERIODIC_SYNCS=0
# CONFIG_BT_NIMBLE_GATT_CACHING is not set
# CONFIG_BT_NIMBLE_INCL_SVC_DISCOVERY is not set
CONFIG_BT_NIMBLE_WHITELIST_SIZE=12
# CONFIG_BT_NIMBLE_TEST_THROUGHPUT_TEST is not set
# CONFIG_BT_NIMBLE_BLUFI_ENABLE is not set
CONFIG_BT_NIMBLE_USE_ESP_TIMER=y
CONFIG_BT_NIMBLE_LEGACY_VHCI_ENABLE=y
# CONFIG_BT_NIMBLE_BLE_GATT_BLOB_TRANSFER is not set
# CONFIG_BT_NIMBLE_ISO is not set
# end of BLE 5.x Features
#
# BLE Services
# Services
#
CONFIG_BT_NIMBLE_PROX_SERVICE=y
CONFIG_BT_NIMBLE_ANS_SERVICE=y
@ -766,6 +760,19 @@ CONFIG_BT_NIMBLE_DIS_SERVICE=y
# CONFIG_BT_NIMBLE_SVC_DIS_PNP_ID is not set
# CONFIG_BT_NIMBLE_SVC_DIS_INCLUDED is not set
CONFIG_BT_NIMBLE_GAP_SERVICE=y
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_ENC=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHEN=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHOR=0
# CONFIG_BT_NIMBLE_SVC_GAP_GATT_SECURITY_LEVEL is not set
# CONFIG_BT_NIMBLE_SVC_GAP_RPA_ONLY is not set
CONFIG_BT_NIMBLE_SVC_GAP_CAR_CHAR_NOT_SUPP=y
# CONFIG_BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP is not set
# CONFIG_BT_NIMBLE_SVC_GAP_CAR_SUPP is not set
CONFIG_BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION=-1
#
# GAP Appearance write permissions
@ -777,11 +784,6 @@ CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHN=0
CONFIG_BT_NIMBLE_SVC_GAP_APPEAR_WRITE_PERM_ATHR=0
# end of GAP Appearance write permissions
CONFIG_BT_NIMBLE_SVC_GAP_CAR_CHAR_NOT_SUPP=y
# CONFIG_BT_NIMBLE_SVC_GAP_CAR_NOT_SUPP is not set
# CONFIG_BT_NIMBLE_SVC_GAP_CAR_SUPP is not set
CONFIG_BT_NIMBLE_SVC_GAP_CENT_ADDR_RESOLUTION=-1
#
# GAP device name write permissions
#
@ -796,22 +798,34 @@ CONFIG_BT_NIMBLE_SVC_GAP_PPCP_MIN_CONN_INTERVAL=0
CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SLAVE_LATENCY=0
CONFIG_BT_NIMBLE_SVC_GAP_PPCP_SUPERVISION_TMO=0
# end of Peripheral Preferred Connection Parameters (PPCP) settings
# end of Services
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_ENC=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHEN=0
CONFIG_BT_NIMBLE_SVC_GAP_NAME_WRITE_PERM_AUTHOR=0
# CONFIG_BT_NIMBLE_SVC_GAP_GATT_SECURITY_LEVEL is not set
# CONFIG_BT_NIMBLE_SVC_GAP_RPA_ONLY is not set
# end of BLE Services
# CONFIG_BT_NIMBLE_VS_SUPPORT is not set
#
# Extra Features
#
# CONFIG_BT_NIMBLE_DYNAMIC_SERVICE is not set
# CONFIG_BT_NIMBLE_BLUFI_ENABLE is not set
# CONFIG_BT_NIMBLE_ENC_ADV_DATA is not set
# CONFIG_BT_NIMBLE_HIGH_DUTY_ADV_ITVL is not set
# CONFIG_BT_NIMBLE_HOST_ALLOW_CONNECT_WITH_SCAN is not set
# CONFIG_BT_NIMBLE_HOST_QUEUE_CONG_CHECK is not set
# CONFIG_BT_NIMBLE_ADV_UUID_CONCAT is not set
# CONFIG_BT_NIMBLE_GATTC_PROC_PREEMPTION_PROTECT is not set
# CONFIG_BT_NIMBLE_GATTC_AUTO_PAIR is not set
CONFIG_BT_NIMBLE_EATT_CHAN_NUM=0
# CONFIG_BT_NIMBLE_SUBRATE is not set
# CONFIG_BT_NIMBLE_STATIC_PASSKEY is not set
CONFIG_BT_NIMBLE_DTM_MODE_TEST=y
CONFIG_BT_NIMBLE_MEM_OPTIMIZATION=y
CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC=y
CONFIG_BT_NIMBLE_SM_SIGN_CNT=y
CONFIG_BT_NIMBLE_CPFD_CAFD=y
CONFIG_BT_NIMBLE_RECONFIG_MTU=y
# CONFIG_BT_NIMBLE_LOW_SPEED_MODE is not set
# end of Extra Features
#
# NimBLE Mesh
#
# CONFIG_BT_NIMBLE_MESH is not set
# end of NimBLE Mesh
#
# Host-controller Transport
@ -823,8 +837,35 @@ CONFIG_BT_NIMBLE_HCI_UART_RTS_PIN=19
CONFIG_BT_NIMBLE_HCI_UART_CTS_PIN=23
# end of Host-controller Transport
CONFIG_BT_NIMBLE_EATT_CHAN_NUM=0
# CONFIG_BT_NIMBLE_SUBRATE is not set
#
# Debugging/Testing
#
# CONFIG_BT_NIMBLE_MEM_DEBUG is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_NONE is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_ERROR is not set
# CONFIG_BT_NIMBLE_LOG_LEVEL_WARNING is not set
CONFIG_BT_NIMBLE_LOG_LEVEL_INFO=y
# CONFIG_BT_NIMBLE_LOG_LEVEL_DEBUG is not set
CONFIG_BT_NIMBLE_LOG_LEVEL=1
CONFIG_BT_NIMBLE_PRINT_ERR_NAME=y
# CONFIG_BT_NIMBLE_DEBUG is not set
# CONFIG_BT_NIMBLE_TEST_THROUGHPUT_TEST is not set
# end of Debugging/Testing
#
# Vendor / Optimization
#
# CONFIG_BT_NIMBLE_VS_SUPPORT is not set
# CONFIG_BT_NIMBLE_HIGH_DUTY_ADV_ITVL is not set
# end of Vendor / Optimization
#
# Helper Utils
#
CONFIG_BT_NIMBLE_CHK_HOST_STATUS=y
CONFIG_BT_NIMBLE_UTIL_API=y
CONFIG_BT_NIMBLE_EXTRA_ADV_FIELDS=y
# end of Helper Utils
# end of NimBLE Options
#
@ -931,8 +972,18 @@ CONFIG_BT_CTRL_BLE_ADV=y
# Common Options
#
CONFIG_BT_ALARM_MAX_NUM=50
CONFIG_BT_SMP_CRYPTO_STACK_TINYCRYPT=y
# CONFIG_BT_SMP_CRYPTO_STACK_MBEDTLS is not set
#
# BLE Log
#
# CONFIG_BLE_LOG_ENABLED is not set
# end of BLE Log
# CONFIG_BT_BLE_LOG_SPI_OUT_ENABLED is not set
# CONFIG_BT_BLE_LOG_UHCI_OUT_ENABLED is not set
# CONFIG_BT_LE_USED_MEM_STATISTICS_ENABLED is not set
# end of Common Options
# CONFIG_BT_HCI_LOG_DEBUG_EN is not set
@ -951,11 +1002,11 @@ CONFIG_BT_ALARM_MAX_NUM=50
#
#
# Legacy TWAI Driver Configurations
# TWAI Configuration
#
# CONFIG_TWAI_SKIP_LEGACY_CONFLICT_CHECK is not set
# CONFIG_TWAI_ISR_IN_IRAM is not set
CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y
# end of Legacy TWAI Driver Configurations
# end of TWAI Configuration
#
# Legacy ADC Driver Configuration
@ -1024,13 +1075,6 @@ CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y
# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set
# CONFIG_TEMP_SENSOR_SKIP_LEGACY_CONFLICT_CHECK is not set
# end of Legacy Temperature Sensor Driver Configurations
#
# Legacy Touch Sensor Driver Configurations
#
# CONFIG_TOUCH_SUPPRESS_DEPRECATE_WARN is not set
# CONFIG_TOUCH_SKIP_LEGACY_CONFLICT_CHECK is not set
# end of Legacy Touch Sensor Driver Configurations
# end of Driver Configurations
#
@ -1045,7 +1089,6 @@ CONFIG_EFUSE_MAX_BLK_LEN=256
# ESP-TLS
#
CONFIG_ESP_TLS_USING_MBEDTLS=y
# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set
CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y
# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set
# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set
@ -1097,7 +1140,7 @@ CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
#
CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y
# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set
# CONFIG_GPTIMER_ISR_CACHE_SAFE is not set
# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set
CONFIG_GPTIMER_OBJ_CACHE_SAFE=y
# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:GPTimer Configurations
@ -1108,7 +1151,6 @@ CONFIG_GPTIMER_OBJ_CACHE_SAFE=y
# CONFIG_I2C_ISR_IRAM_SAFE is not set
# CONFIG_I2C_ENABLE_DEBUG_LOG is not set
# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set
CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y
# end of ESP-Driver:I2C Configurations
#
@ -1127,10 +1169,8 @@ CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=y
#
# ESP-Driver:MCPWM Configurations
#
CONFIG_MCPWM_ISR_HANDLER_IN_IRAM=y
# CONFIG_MCPWM_ISR_CACHE_SAFE is not set
# CONFIG_MCPWM_ISR_IRAM_SAFE is not set
# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set
CONFIG_MCPWM_OBJ_CACHE_SAFE=y
# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:MCPWM Configurations
@ -1145,15 +1185,9 @@ CONFIG_MCPWM_OBJ_CACHE_SAFE=y
#
# ESP-Driver:RMT Configurations
#
CONFIG_RMT_ENCODER_FUNC_IN_IRAM=y
CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=y
CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=y
# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set
# CONFIG_RMT_TX_ISR_CACHE_SAFE is not set
# CONFIG_RMT_RX_ISR_CACHE_SAFE is not set
CONFIG_RMT_OBJ_CACHE_SAFE=y
# CONFIG_RMT_ENABLE_DEBUG_LOG is not set
# CONFIG_RMT_ISR_IRAM_SAFE is not set
# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set
# CONFIG_RMT_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:RMT Configurations
#
@ -1178,7 +1212,6 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set
# CONFIG_TOUCH_ISR_IRAM_SAFE is not set
# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set
# CONFIG_TOUCH_SKIP_FSM_CHECK is not set
# end of ESP-Driver:Touch Sensor Configurations
#
@ -1187,14 +1220,6 @@ CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:Temperature Sensor Configurations
#
# ESP-Driver:TWAI Configurations
#
# CONFIG_TWAI_ISR_IN_IRAM is not set
# CONFIG_TWAI_ISR_CACHE_SAFE is not set
# CONFIG_TWAI_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:TWAI Configurations
#
# ESP-Driver:UART Configurations
#
@ -1287,7 +1312,6 @@ CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000
#
# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set
CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000
# CONFIG_ESP_HTTPS_SERVER_CERT_SELECT_HOOK is not set
# end of ESP HTTPS server
#
@ -1358,8 +1382,7 @@ CONFIG_RTC_CLK_CAL_CYCLES=1024
#
# Peripheral Control
#
CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=y
CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=y
CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
# end of Peripheral Control
#
@ -1379,36 +1402,15 @@ CONFIG_XTAL_FREQ_40=y
CONFIG_XTAL_FREQ=40
# end of Main XTAL Config
#
# Power Supplier
#
#
# Brownout Detector
#
CONFIG_ESP_BROWNOUT_DET=y
CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set
CONFIG_ESP_BROWNOUT_DET_LVL=7
CONFIG_ESP_BROWNOUT_USE_INTR=y
# end of Brownout Detector
# end of Power Supplier
CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y
CONFIG_ESP_INTR_IN_IRAM=y
# end of Hardware Settings
#
# ESP-Driver:LCD Controller Configurations
#
# CONFIG_LCD_ENABLE_DEBUG_LOG is not set
# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set
# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set
# CONFIG_LCD_ENABLE_DEBUG_LOG is not set
# end of ESP-Driver:LCD Controller Configurations
#
@ -1462,7 +1464,6 @@ CONFIG_ESP_PHY_IRAM_OPT=y
#
# Power Management
#
CONFIG_PM_SLEEP_FUNC_IN_IRAM=y
# CONFIG_PM_ENABLE is not set
CONFIG_PM_SLP_IRAM_OPT=y
CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y
@ -1481,12 +1482,6 @@ CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y
# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set
# end of ESP Ringbuf
#
# ESP-ROM
#
CONFIG_ESP_ROM_PRINT_IN_IRAM=y
# end of ESP-ROM
#
# ESP Security Specific
#
@ -1539,7 +1534,6 @@ CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=32
CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0
# end of Trace memory
CONFIG_ESP_SYSTEM_IN_IRAM=y
# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set
CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set
@ -1588,13 +1582,28 @@ CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
CONFIG_ESP_DEBUG_OCDAWARE=y
CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y
#
# Brownout Detector
#
CONFIG_ESP_BROWNOUT_DET=y
CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set
CONFIG_ESP_BROWNOUT_DET_LVL=7
# end of Brownout Detector
CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y
CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y
# end of ESP System Settings
#
# IPC (Inter-Processor Call)
#
CONFIG_ESP_IPC_ENABLE=y
CONFIG_ESP_IPC_TASK_STACK_SIZE=1280
CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y
CONFIG_ESP_IPC_ISR_ENABLE=y
@ -1603,7 +1612,6 @@ CONFIG_ESP_IPC_ISR_ENABLE=y
#
# ESP Timer (High Resolution Timer)
#
CONFIG_ESP_TIMER_IN_IRAM=y
# CONFIG_ESP_TIMER_PROFILING is not set
CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y
CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y
@ -1646,12 +1654,10 @@ CONFIG_ESP_WIFI_IRAM_OPT=y
CONFIG_ESP_WIFI_RX_IRAM_OPT=y
CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y
CONFIG_ESP_WIFI_ENABLE_SAE_PK=y
CONFIG_ESP_WIFI_ENABLE_SAE_H2E=y
CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50
# CONFIG_ESP_WIFI_BSS_MAX_IDLE_SUPPORT is not set
CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10
CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15
# CONFIG_ESP_WIFI_FTM_ENABLE is not set
@ -1676,10 +1682,10 @@ CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y
#
# CONFIG_ESP_WIFI_WPS_STRICT is not set
# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set
# CONFIG_ESP_WIFI_WPS_RECONNECT_ON_FAIL is not set
# end of WPS Configuration Options
# CONFIG_ESP_WIFI_DEBUG_PRINT is not set
# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set
CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y
# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set
# end of Wi-Fi
@ -1813,7 +1819,6 @@ CONFIG_FREERTOS_DEBUG_OCDAWARE=y
CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y
CONFIG_FREERTOS_NUMBER_OF_CORES=2
CONFIG_FREERTOS_IN_IRAM=y
# end of FreeRTOS
#
@ -1825,6 +1830,8 @@ CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y
# CONFIG_HAL_ASSERTION_ENABLE is not set
CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2
CONFIG_HAL_WDT_USE_ROM_IMPL=y
CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y
CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y
# end of Hardware Abstraction Layer (HAL) and Low Level (LL)
#
@ -1845,9 +1852,6 @@ CONFIG_HEAP_TRACING_OFF=y
#
# Log
#
CONFIG_LOG_VERSION_1=y
# CONFIG_LOG_VERSION_2 is not set
CONFIG_LOG_VERSION=1
#
# Log Level
@ -1885,15 +1889,6 @@ CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31
CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
# end of Format
#
# Settings
#
CONFIG_LOG_MODE_TEXT_EN=y
CONFIG_LOG_MODE_TEXT=y
# end of Settings
CONFIG_LOG_IN_IRAM=y
# end of Log
#
@ -1901,6 +1896,7 @@ CONFIG_LOG_IN_IRAM=y
#
CONFIG_LWIP_ENABLE=y
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
# CONFIG_LWIP_NETIF_API is not set
CONFIG_LWIP_TCPIP_TASK_PRIO=18
# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set
@ -2012,6 +2008,7 @@ CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5
CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3
CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10
# CONFIG_LWIP_IPV6_ND6_ROUTE_INFO_OPTION_SUPPORT is not set
# CONFIG_LWIP_PPP_SUPPORT is not set
# CONFIG_LWIP_SLIP_SUPPORT is not set
@ -2046,7 +2043,6 @@ CONFIG_LWIP_DNS_MAX_HOST_IP=1
CONFIG_LWIP_DNS_MAX_SERVERS=3
# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set
# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set
# CONFIG_LWIP_USE_ESP_GETADDRINFO is not set
# end of DNS
CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7
@ -2067,9 +2063,6 @@ CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y
CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y
# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set
# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set
CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_NONE=y
# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_DEFAULT is not set
# CONFIG_LWIP_HOOK_DHCP_EXTRA_OPTION_CUSTOM is not set
CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set
@ -2239,23 +2232,20 @@ CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
# end of ESP-MQTT Configurations
#
# LibC
# Newlib
#
CONFIG_LIBC_NEWLIB=y
CONFIG_LIBC_MISC_IN_IRAM=y
CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=y
CONFIG_LIBC_STDOUT_LINE_ENDING_CRLF=y
# CONFIG_LIBC_STDOUT_LINE_ENDING_LF is not set
# CONFIG_LIBC_STDOUT_LINE_ENDING_CR is not set
# CONFIG_LIBC_STDIN_LINE_ENDING_CRLF is not set
# CONFIG_LIBC_STDIN_LINE_ENDING_LF is not set
CONFIG_LIBC_STDIN_LINE_ENDING_CR=y
# CONFIG_LIBC_NEWLIB_NANO_FORMAT is not set
CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y
# CONFIG_LIBC_TIME_SYSCALL_USE_RTC is not set
# CONFIG_LIBC_TIME_SYSCALL_USE_HRT is not set
# CONFIG_LIBC_TIME_SYSCALL_USE_NONE is not set
# end of LibC
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
# CONFIG_NEWLIB_NANO_FORMAT is not set
CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y
# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set
# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set
# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
# end of Newlib
#
# NVS
@ -2275,6 +2265,8 @@ CONFIG_LIBC_TIME_SYSCALL_USE_RTC_HRT=y
#
# CONFIG_OPENTHREAD_SPINEL_ONLY is not set
# end of OpenThread Spinel
# CONFIG_OPENTHREAD_DEBUG is not set
# end of OpenThread
#
@ -2335,7 +2327,6 @@ CONFIG_SPI_FLASH_HPM_DC_AUTO=y
CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50
# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set
# CONFIG_SPI_FLASH_FORCE_ENABLE_C6_H2_SUSPEND is not set
CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=y
# end of Optional and Experimental Features (READ DOCS FIRST)
# end of Main Flash configuration
@ -2361,13 +2352,13 @@ CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192
#
# Auto-detect flash chips
#
CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_GD_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_TH_SUPPORT_ENABLED=y
CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORTED=y
CONFIG_SPI_FLASH_VENDOR_TH_SUPPORTED=y
CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y
CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y
CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y
@ -2450,7 +2441,6 @@ CONFIG_UNITY_ENABLE_DOUBLE=y
CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
# CONFIG_UNITY_ENABLE_FIXTURE is not set
# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
# CONFIG_UNITY_TEST_ORDER_BY_FILE_PATH_AND_LINE is not set
# end of Unity unit testing library
#
@ -2529,7 +2519,6 @@ CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
# Deprecated options for backward compatibility
# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set
# CONFIG_NO_BLOBS is not set
# CONFIG_APP_ROLLBACK_ENABLE is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
@ -2537,6 +2526,7 @@ CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
CONFIG_LOG_BOOTLOADER_LEVEL=3
# CONFIG_APP_ROLLBACK_ENABLE is not set
# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
# CONFIG_FLASHMODE_QIO is not set
# CONFIG_FLASHMODE_QOUT is not set
@ -2565,47 +2555,46 @@ CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
CONFIG_NIMBLE_ENABLED=y
CONFIG_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y
# CONFIG_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set
CONFIG_NIMBLE_MAX_CONNECTIONS=1
CONFIG_NIMBLE_MAX_BONDS=3
CONFIG_NIMBLE_MAX_CCCDS=8
CONFIG_NIMBLE_L2CAP_COC_MAX_NUM=0
CONFIG_NIMBLE_PINNED_TO_CORE=0
CONFIG_NIMBLE_PINNED_TO_CORE_0=y
# CONFIG_NIMBLE_PINNED_TO_CORE_1 is not set
CONFIG_NIMBLE_PINNED_TO_CORE=0
CONFIG_NIMBLE_TASK_STACK_SIZE=4096
CONFIG_BT_NIMBLE_TASK_STACK_SIZE=4096
CONFIG_NIMBLE_ROLE_CENTRAL=y
CONFIG_NIMBLE_ROLE_PERIPHERAL=y
CONFIG_NIMBLE_ROLE_BROADCASTER=y
CONFIG_NIMBLE_ROLE_OBSERVER=y
CONFIG_NIMBLE_NVS_PERSIST=y
CONFIG_NIMBLE_SM_LEGACY=y
CONFIG_NIMBLE_SM_SC=y
# CONFIG_NIMBLE_SM_SC_DEBUG_KEYS is not set
CONFIG_BT_NIMBLE_SM_SC_LVL=0
# CONFIG_NIMBLE_DEBUG is not set
CONFIG_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
CONFIG_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
CONFIG_NIMBLE_NVS_PERSIST=y
CONFIG_NIMBLE_MAX_BONDS=3
CONFIG_NIMBLE_RPA_TIMEOUT=900
CONFIG_NIMBLE_MAX_CONNECTIONS=1
CONFIG_NIMBLE_MAX_CCCDS=8
CONFIG_NIMBLE_CRYPTO_STACK_MBEDTLS=y
# CONFIG_NIMBLE_HS_FLOW_CTRL is not set
CONFIG_NIMBLE_ATT_PREFERRED_MTU=256
CONFIG_NIMBLE_SVC_GAP_APPEARANCE=0
CONFIG_NIMBLE_L2CAP_COC_MAX_NUM=0
CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT=12
CONFIG_BT_NIMBLE_ACL_BUF_COUNT=24
CONFIG_BT_NIMBLE_ACL_BUF_SIZE=255
CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70
CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=30
CONFIG_BT_NIMBLE_HCI_EVT_LO_BUF_COUNT=8
# CONFIG_NIMBLE_HS_FLOW_CTRL is not set
CONFIG_NIMBLE_RPA_TIMEOUT=900
CONFIG_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
CONFIG_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
CONFIG_NIMBLE_SVC_GAP_APPEARANCE=0
# CONFIG_NIMBLE_MESH is not set
CONFIG_NIMBLE_CRYPTO_STACK_MBEDTLS=y
# CONFIG_NIMBLE_DEBUG is not set
# CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_EN is not set
CONFIG_BT_NIMBLE_COEX_PHY_CODED_TX_RX_TLIM_DIS=y
CONFIG_SW_COEXIST_ENABLE=y
CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y
CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y
# CONFIG_CAM_CTLR_DVP_CAM_ISR_IRAM_SAFE is not set
# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set
# CONFIG_MCPWM_ISR_IRAM_SAFE is not set
# CONFIG_MCPWM_ISR_IN_IRAM is not set
# CONFIG_EVENT_LOOP_PROFILING is not set
CONFIG_POST_EVENTS_FROM_ISR=y
CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
@ -2620,26 +2609,6 @@ CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y
# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set
# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set
CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024
CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
CONFIG_BROWNOUT_DET=y
CONFIG_ESP32S3_BROWNOUT_DET=y
CONFIG_BROWNOUT_DET_LVL_SEL_7=y
CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y
# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set
CONFIG_BROWNOUT_DET_LVL=7
CONFIG_ESP32S3_BROWNOUT_DET_LVL=7
CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y
CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
@ -2674,6 +2643,24 @@ CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set
CONFIG_ESP32S3_DEBUG_OCDAWARE=y
CONFIG_BROWNOUT_DET=y
CONFIG_ESP32S3_BROWNOUT_DET=y
CONFIG_BROWNOUT_DET_LVL_SEL_7=y
CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y
# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set
CONFIG_BROWNOUT_DET_LVL=7
CONFIG_ESP32S3_BROWNOUT_DET_LVL=7
CONFIG_IPC_TASK_STACK_SIZE=1280
CONFIG_TIMER_TASK_STACK_SIZE=3584
CONFIG_ESP32_WIFI_ENABLED=y
@ -2708,7 +2695,6 @@ CONFIG_WPA_MBEDTLS_TLS_CLIENT=y
# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set
# CONFIG_WPA_WPS_STRICT is not set
# CONFIG_WPA_DEBUG_PRINT is not set
# CONFIG_WPA_TESTING_OPTIONS is not set
# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
@ -2739,22 +2725,11 @@ CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set
CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
# CONFIG_PPP_SUPPORT is not set
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
# CONFIG_NEWLIB_NANO_FORMAT is not set
CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y
CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y
CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y
# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set
# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set
# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set
# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set
# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set
# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set
CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072