Add BT1035 driver with manual chapter and expand Si4684 tuning docs.

Implement Bt1035Driver AT init (AT+AUXCFG=1), core AT parser with host tests,
wire boot into HardwareBootstrap, and document DAB/FM tuning workflows in ch-si4684.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 17:07:37 +02:00
co-authored by Cursor
parent d6fa41e944
commit d49b2011dd
22 changed files with 979 additions and 48 deletions
@@ -34,6 +34,7 @@ add_library(digiradio_core STATIC
"${CORE_SRC_DIR}/EnhancementsDesign.cpp"
"${CORE_SRC_DIR}/AudioProfile.cpp"
"${CORE_SRC_DIR}/AudioProfileJson.cpp"
"${CORE_SRC_DIR}/Bt1035At.cpp"
)
target_include_directories(digiradio_core PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/../include"
@@ -70,3 +71,7 @@ add_test(NAME audio_profile_json_test COMMAND audio_profile_json_test)
add_executable(enhancements_design_test enhancements_design_test.cpp)
target_link_libraries(enhancements_design_test PRIVATE digiradio_core)
add_test(NAME enhancements_design_test COMMAND enhancements_design_test)
add_executable(bt1035_at_test bt1035_at_test.cpp)
target_link_libraries(bt1035_at_test PRIVATE digiradio_core)
add_test(NAME bt1035_at_test COMMAND bt1035_at_test)
@@ -0,0 +1,71 @@
/**
* @file bt1035_at_test.cpp
* @brief Host tests for FSC-BT1035 AT command builder and parser.
*
* DigiRadio firmware — https://github.com/manvalan/DigiRadio
*
* Copyright 2026 Michele Bigi
* SPDX-License-Identifier: Apache-2.0
*
* @author Michele Bigi
* @date 2026-07-06
*/
#include "core/Bt1035At.hpp"
#include <cstdlib>
#include <iostream>
#include <string>
namespace {
[[nodiscard]] int runInitSequenceTest()
{
const auto sequence = core::bootInitSequence();
if (sequence.size() != core::kBt1035BootInitCommandCount) {
std::cerr << "init sequence size mismatch\n";
return EXIT_FAILURE;
}
if (sequence[1U] != core::Bt1035AtCommand::AuxLineIn) {
std::cerr << "AUXCFG=1 must be in init sequence\n";
return EXIT_FAILURE;
}
const std::string aux = core::buildBt1035AtLine(core::Bt1035AtCommand::AuxLineIn);
if (aux != "AT+AUXCFG=1\r\n") {
std::cerr << "AUXCFG command line mismatch\n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
[[nodiscard]] int runParseTest()
{
if (core::parseBt1035AtResponse("OK\r\n") != core::Bt1035AtResponseKind::Ok) {
std::cerr << "OK parse failed\n";
return EXIT_FAILURE;
}
if (core::parseBt1035AtResponse("ERROR\r\n")
!= core::Bt1035AtResponseKind::Error) {
std::cerr << "ERROR parse failed\n";
return EXIT_FAILURE;
}
if (core::parseBt1035AtResponse("garbage")
!= core::Bt1035AtResponseKind::Unexpected) {
std::cerr << "unexpected parse failed\n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
} // namespace
int main()
{
if (runInitSequenceTest() != EXIT_SUCCESS) {
return EXIT_FAILURE;
}
if (runParseTest() != EXIT_SUCCESS) {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}