#include "can_sensor.h" #include typedef struct { CanSensor_Frame last_frame; uint32_t send_count; uint8_t accept; } FakeCan; static uint8_t fake_send(void *context, const CanSensor_Frame *frame) { FakeCan *fake = (FakeCan *)context; fake->send_count++; fake->last_frame = *frame; return fake->accept; } #define CHECK(condition) \ do { \ if (!(condition)) { \ fprintf(stderr, "check failed at line %d: %s\n", __LINE__, \ #condition); \ return 1; \ } \ } while (0) int main(void) { CanSensor link; CanSensor_Config config; CanSensor_Io io; FakeCan fake = {0}; fake.accept = 1U; io.send = fake_send; io.receive = 0; io.context = &fake; CanSensor_ConfigDefault(&config); CHECK(config.pulse_period_ms == 0U); CHECK(CanSensor_Init(&link, &io, &config) != 0U); /* Нулевой период означает выключенный PULSE при любых метках времени. */ CanSensor_Task(&link, 0U); CanSensor_Task(&link, 0xFFFFFFFFUL); CHECK(fake.send_count == 0U); CanSensor_SetPulsePeriod(&link, 1000U); CHECK(CanSensor_PulsePeriod(&link) == 1000U); CanSensor_Task(&link, 500U); CanSensor_Task(&link, 1499U); CHECK(fake.send_count == 0U); CanSensor_Task(&link, 1500U); CHECK(fake.send_count == 1U); CHECK(fake.last_frame.id == 0x1FFF0000UL); CHECK(fake.last_frame.extended == 1U); CHECK(fake.last_frame.length == 1U); CHECK(fake.last_frame.data[0] == 1U); /* После period=0 дальнейшие вызовы не отправляют heartbeat. */ CanSensor_SetPulsePeriod(&link, 0U); CHECK(CanSensor_PulsePeriod(&link) == 0U); CanSensor_Task(&link, 0xFFFFFFFFUL); CHECK(fake.send_count == 1U); /* Повторное включение начинает новый полный период. */ CanSensor_SetPulsePeriod(&link, 10U); CanSensor_Task(&link, 2000U); CanSensor_Task(&link, 2009U); CHECK(fake.send_count == 1U); CanSensor_Task(&link, 2010U); CHECK(fake.send_count == 2U); CHECK(fake.last_frame.data[0] == 2U); puts("can_sensor pulse tests passed"); return 0; }