Files
overwatch/9_Firmware/9_1_Microcontroller/tests/ad_driver_mock.c
Jason 397969348e Fix all 8 firmware bugs with regression tests
Bugs fixed in adf4382a_manager.c:
- Bug #1: Move initialized=true before sync setup, propagate sync failure
- Bug #3: Implement TriggerTimedSync with sw_sync pulse (was no-op)
- Bug #5: Replace GPIO-only placeholder with TIM3 PWM for DELADJ
- Bug #7: Correct GPIOG pin definitions to match CubeMX (pins 6-15)

Bugs fixed in main.cpp:
- Bug #2: Remove pre-reset ad9523_setup() call (keep only post-reset)
- Bug #4: Move init error check before phase shift calls
- Bug #6: Fix timer variable (last_check -> last_check1) in temp block
- Bug #8: Uncomment uart_print/uart_println debug helpers

Test harness updates:
- All 8 tests rewritten to assert correct post-fix behavior
- Added TIM PWM mock (SPY_TIM_PWM_START/STOP/SET_COMPARE)
- Added mock_adf4382_set_timed_sync_retval for failure injection
- Updated shims and Makefile for new test dependencies
- All 8 tests pass: make clean && make test -> 8/8 passed
2026-03-19 09:42:59 +02:00

144 lines
4.0 KiB
C

/*******************************************************************************
* ad_driver_mock.c -- Mock implementations for ADF4382 and AD9523 drivers
******************************************************************************/
#include "ad_driver_mock.h"
#include <stdlib.h>
#include <string.h>
/* Configurable return values */
int mock_adf4382_init_retval = 0;
int mock_adf4382_set_timed_sync_retval = 0;
int mock_ad9523_setup_retval = 0;
/* Internal device stubs (allocated on the heap by mock init) */
static struct adf4382_dev adf4382_stub_devs[4];
static int adf4382_stub_idx = 0;
static struct ad9523_dev ad9523_stub_devs[2];
static int ad9523_stub_idx = 0;
/* Helper to push spy record (references the extern in stm32_hal_mock) */
extern SpyRecord spy_log[];
extern int spy_count;
static void spy_push_drv(SpyCallType type, void *extra, uint32_t val)
{
if (spy_count < SPY_MAX_RECORDS) {
spy_log[spy_count++] = (SpyRecord){
.type = type,
.port = NULL,
.pin = 0,
.value = val,
.extra = extra
};
}
}
/* ========================= ADF4382 mock =========================== */
int adf4382_init(struct adf4382_dev **device, struct adf4382_init_param *init_param)
{
spy_push_drv(SPY_ADF4382_INIT, (void*)init_param, 0);
if (mock_adf4382_init_retval != 0) {
*device = NULL;
return mock_adf4382_init_retval;
}
/* Return a stub device */
int idx = adf4382_stub_idx % 4;
memset(&adf4382_stub_devs[idx], 0, sizeof(struct adf4382_dev));
adf4382_stub_devs[idx].freq = init_param->freq;
adf4382_stub_devs[idx].ref_freq_hz = init_param->ref_freq_hz;
*device = &adf4382_stub_devs[idx];
adf4382_stub_idx++;
return 0;
}
int adf4382_remove(struct adf4382_dev *dev)
{
spy_push_drv(SPY_ADF4382_REMOVE, dev, 0);
return 0;
}
int adf4382_set_out_power(struct adf4382_dev *dev, uint8_t ch, int32_t pwr)
{
spy_push_drv(SPY_ADF4382_SET_OUT_POWER, dev, (uint32_t)((ch << 16) | (pwr & 0xFFFF)));
return 0;
}
int adf4382_set_en_chan(struct adf4382_dev *dev, uint8_t ch, bool en)
{
spy_push_drv(SPY_ADF4382_SET_EN_CHAN, dev, (uint32_t)((ch << 16) | en));
return 0;
}
int adf4382_set_timed_sync_setup(struct adf4382_dev *dev, bool sync)
{
spy_push_drv(SPY_ADF4382_SET_TIMED_SYNC, dev, (uint32_t)sync);
return mock_adf4382_set_timed_sync_retval;
}
int adf4382_set_ezsync_setup(struct adf4382_dev *dev, bool sync)
{
spy_push_drv(SPY_ADF4382_SET_EZSYNC, dev, (uint32_t)sync);
return 0;
}
int adf4382_set_sw_sync(struct adf4382_dev *dev, bool sw_sync)
{
spy_push_drv(SPY_ADF4382_SET_SW_SYNC, dev, (uint32_t)sw_sync);
return 0;
}
int adf4382_spi_read(struct adf4382_dev *dev, uint16_t reg_addr, uint8_t *data)
{
spy_push_drv(SPY_ADF4382_SPI_READ, dev, (uint32_t)reg_addr);
if (data) {
/* By default, return "locked" status for reg 0x58 */
if (reg_addr == 0x58) {
*data = ADF4382_LOCKED_MSK; /* locked */
} else {
*data = 0;
}
}
return 0;
}
/* ========================= AD9523 mock ============================ */
int32_t ad9523_init(struct ad9523_init_param *init_param)
{
spy_push_drv(SPY_AD9523_INIT, init_param, 0);
return 0;
}
int32_t ad9523_setup(struct ad9523_dev **device, const struct ad9523_init_param *init_param)
{
spy_push_drv(SPY_AD9523_SETUP, (void*)init_param, 0);
if (mock_ad9523_setup_retval != 0) {
return mock_ad9523_setup_retval;
}
int idx = ad9523_stub_idx % 2;
memset(&ad9523_stub_devs[idx], 0, sizeof(struct ad9523_dev));
*device = &ad9523_stub_devs[idx];
ad9523_stub_idx++;
return 0;
}
int32_t ad9523_status(struct ad9523_dev *dev)
{
spy_push_drv(SPY_AD9523_STATUS, dev, 0);
return 0;
}
int32_t ad9523_sync(struct ad9523_dev *dev)
{
spy_push_drv(SPY_AD9523_SYNC, dev, 0);
return 0;
}
int32_t ad9523_remove(struct ad9523_dev *dev)
{
spy_push_drv(SPY_AD9523_REMOVE, dev, 0);
return 0;
}