Skip to content

v1.6.0 - SET_THRESHOLD DAC Integration & Enhanced Command Interface (2025-11-18)

Overview

A patch release completing the DAC integration for the SET_THRESHOLD command, enabling real-time hardware control of analog threshold values through the text command interface. This release bridges the gap between configuration memory and physical hardware, allowing threshold changes to immediately affect DAC output voltage.

Implementation: Extended Feature 002-add-runtime-config | Branch: main | Commit: cf2498a

What's New

✨ Major Features

🔌 SET_THRESHOLD DAC Integration

The SET_THRESHOLD command now immediately updates the physical DAC hardware:

Key Achievement:

  • Real-time Hardware Control: Threshold changes instantly update SPI DAC output
  • v0-compatible Protocol: Uses legacy protocol encoding for hardware compatibility
  • Verified Operation: LED behavior confirms DAC updates (LED turns ON/OFF based on threshold vs. detected signal)

Protocol Encoding:

// Convert 12-bit threshold value (0-4095) to SPI format
byte data1 = 0x10 + ((val >> 6) & 0xFF);    // Protocol header + upper 6 bits
byte data2 = ((val << 2) & 0xFF);           // Lower 8 bits shifted left by 2
spi_send_dac_command(ch, data1, data2);

Example:

SET_THRESHOLD 1 500
→ VAL=500 (0x1F4)
→ DATA1=0x17 (0x10 + 0x07), DATA2=0xD0
→ DAC CH1 set to 500

🔧 Enhanced Command Interface

All text commands now fully functional with verified hardware integration:

Complete Command Set:

  1. SET_SAMPLE_COUNT - Detection sensitivity adjustment ✅
  2. SET_THRESHOLD - Hardware threshold control ✅ (NEW: DAC integration)
  3. GET_THRESHOLD - Query configured thresholds ✅
  4. GET_VERSION - Firmware version reporting ✅
  5. STATUS - System status display ✅
  6. RESET - Configuration reset to defaults ✅
  7. DEBUG - Runtime debug mode control ✅
  8. LED - LED test control ✅
  9. HELP - Command reference ✅

New Response Format:

SET_THRESHOLD 1 500
OK (CH1 set to 500)

STATUS
=== SYSTEM STATUS ===
Firmware Version: 1.6.0
Sample Count: 100
Threshold CH1: 500
Threshold CH2: 500
Threshold CH3: 500
Debug Enabled: NO
Debug Level: 1

🐛 Bug Fixes & Improvements

SET_THRESHOLD Hardware Fix

Problem: SET_THRESHOLD command stored values in configuration but did not update the physical DAC hardware, causing LED behavior to be incorrect.

Solution: Integrated SPI DAC control by:

  1. Analyzing legacy Python client protocol to extract encoding formula
  2. Implementing v0-compatible protocol encoding in C
  3. Sending SPI command immediately after configuration update
  4. Verifying hardware response through LED state changes

Testing Results:

  • ✅ SET_THRESHOLD 1 500: Correctly converts to DATA1=0x17, DATA2=0xD0
  • ✅ STATUS command confirms threshold stored correctly
  • ✅ LED turns OFF when threshold > detected signal (hardware verified)
  • ✅ All 3 channels working correctly

Code Quality Improvements

Debug Output Cleanup:

  • Removed verbose SPI debug logging from production code
  • Disabled debug mode by default in platformio.ini
  • Firmware size reduced by removing diagnostic output
  • Clean, production-ready serial interface

Protocol Compliance:

  • Full backward compatibility with legacy 3-byte protocol
  • Text commands take precedence when enabled
  • Conditional compilation ensures clean feature separation

📊 Code Metrics

Metric v1.5.0 v1.6.0 Change
RAM Usage 7.2% 7.3% +0.1%
Flash Usage 26.8% 23.0% -3.8% (debug output removed)
Build Time ~2.8s ~2.5s -0.3s
Total Functions 45+ 50+ +5 (DAC helpers)
Lines of Code ~1,680 ~1,690 +10
Warnings 0 0
Errors 0 0

🔧 Technical Details

New Implementation

File: src/text_command_handler.cpp (lines 179-199)

Protocol encoding for SET_THRESHOLD:

// Send DAC command to update hardware immediately
// Use legacy protocol encoding (v0-compatible):
// val1 = PROTOCOL_HEADER_BIT + (vth >> THRESHOLD_UPPER_BITS_SHIFT)
// val2 = (vth << THRESHOLD_LOWER_BITS_SHIFT) & BYTE_MASK
// Where: PROTOCOL_HEADER_BIT=0x10, THRESHOLD_UPPER_BITS_SHIFT=6, THRESHOLD_LOWER_BITS_SHIFT=2
byte data1 = 0x10 + ((val >> 6) & 0xFF);  // Protocol header (0x10) + upper 6 bits
byte data2 = ((val << 2) & 0xFF);         // Lower 8 bits shifted left by 2

spi_send_dac_command(ch, data1, data2);

Architecture

Integration Points:

  • text_command_handler.cpp → spi_control.h (DAC control)
  • spi_control.cpp (SPI transaction management)
  • config.h (protocol constants and pin definitions)

Data Flow:

User Command (SET_THRESHOLD 1 500)
    ↓
Parse & Validate (text_command_handler)
    ↓
Update Configuration (config_set_threshold)
    ↓
Encode v0 Protocol (data1, data2 calculation)
    ↓
Send SPI Command (spi_send_dac_command)
    ↓
DAC Hardware Updates → LED Behavior Changes

Installation

Via Git Tag

git checkout v1.6.0
# or
git clone --branch v1.6.0 https://gitlab.com/osechi/kurikintons.git

Build from Source

# Build firmware
task build

# Upload to ESP32
task upload

# Monitor serial output
task monitor

Using New Features

# Connect serial monitor
task monitor

# Test DAC control (SET_THRESHOLD now updates hardware immediately)
# Type: SET_THRESHOLD 1 2048
# Response: OK (CH1 set to 2048)

# Verify threshold was set
# Type: STATUS

# Check LED behavior (should match threshold configuration)

Changelog

Added

  • SET_THRESHOLD command now includes real-time DAC hardware control
  • v0-compatible protocol encoding for threshold-to-DAC conversion
  • Documentation for SET_THRESHOLD DAC integration in CLAUDE.md

Changed

  • Enhanced SET_THRESHOLD response format: OK (CH{ch} set to {val})\n
  • Removed verbose SPI transaction debug output
  • Disabled debug mode by default in platformio.ini for cleaner serial output
  • Updated progress log with DAC integration details

Fixed

  • SET_THRESHOLD now correctly updates physical DAC hardware, not just configuration
  • LED behavior now correctly responds to threshold changes
  • Removed spurious debug messages from serial output

Documentation

  • Updated progress log with DAC integration completion
  • Added protocol encoding formula to source code comments
  • Documented v0-compatible protocol constants

Known Issues

None. This is a stable patch release with full hardware integration.

Breaking Changes

None. This release is fully backward compatible with v1.5.0. All existing commands work identically, with enhanced functionality for SET_THRESHOLD.

Testing

All changes have been verified:

  • ✅ SET_THRESHOLD correctly encodes values using v0 protocol
  • ✅ SPI DAC receives correct data bytes
  • ✅ Hardware behavior verified (LED turns OFF/ON based on threshold)
  • ✅ All 3 channels working with DAC integration
  • ✅ Configuration persists correctly in memory
  • ✅ STATUS command reflects actual hardware state
  • ✅ No debug output in normal operation
  • ✅ Code compiles without warnings or errors
  • ✅ RAM/Flash usage within acceptable ranges

Supported Hardware

  • Microcontroller: ESP32-WROOM-32E
  • SPI DAC: 3-channel digital control (v0-compatible protocol)
  • Sensors: BME280 (temperature, humidity, pressure)
  • ADC: 12-bit converter with configurable channel jumper
  • I2C: Standard 100kHz I2C bus
  • UART: 115200 baud serial communication

Compatibility

Dependency Version Status
PlatformIO >=6.1.18
Arduino ESP32 3.20017
Adafruit BME280 2.3.0
Adafruit BusIO 1.17.4

Upgrading from v1.5.0

This release fixes SET_THRESHOLD hardware integration and cleans up debug output:

  1. Firmware Update (recommended):
git pull origin main
git checkout v1.6.0
task build && task upload
  1. Testing DAC Integration:
task monitor
# Type: STATUS
# Type: SET_THRESHOLD 1 1000
# Watch: LED should change based on new threshold
# Type: STATUS (verify threshold stored)
  1. Backward Compatibility: All v1.5.0 commands work identically; SET_THRESHOLD now includes hardware control
  • SPI Protocol - DAC control details
  • API Documentation - Module APIs and data structures
  • CLAUDE.md - Developer guide with text command details

Contributors

  • Shota Takahashi (SET_THRESHOLD DAC integration, debugging, testing)

License

MIT License - See LICENSE file for details

Release Information

  • Date: November 18, 2025
  • Version: 1.6.0
  • Git Tag: v1.6.0
  • Commits: 3 (DAC integration + progress log + version bump)
  • Files Changed: 3 modified (text_command_handler.cpp, spi_control.cpp, platformio.ini)
  • Build Size: 301,245 bytes Flash (reduced by 3.8% from v1.5.0)