80 lines
2.6 KiB
C
80 lines
2.6 KiB
C
#include "can_sensor.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
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;
|
|
}
|