#include "led_indicator.h" #include typedef struct { uint32_t now; uint8_t outputs[3]; uint32_t writes[3]; } FakePort; static void fake_write(void *context, uint8_t channel, uint8_t on) { FakePort *fake = (FakePort *)context; fake->outputs[channel] = on; fake->writes[channel]++; } static uint32_t fake_now(void *context) { return ((FakePort *)context)->now; } #define CHECK(condition) \ do { \ if (!(condition)) { \ fprintf(stderr, "check failed at line %d: %s\n", __LINE__, \ #condition); \ return 1; \ } \ } while (0) int main(void) { LedIndicator indicator; LedIndicator_Channel channels[3]; LedIndicator_Config config; LedIndicator_Pattern patterns[LED_INDICATOR_MODE_COUNT]; FakePort fake = {0}; LedIndicator_Port port = {fake_write, fake_now, &fake}; LedIndicator_ConfigDefault(&config); CHECK(LedIndicator_ValidateConfig(&config) != 0U); CHECK(LedIndicator_CopyDefaultPatterns(patterns, LED_INDICATOR_MODE_COUNT) == LED_INDICATOR_MODE_COUNT); patterns[LED_INDICATOR_MODE_WORK].duration_ms[0] = 25U; CHECK(patterns[LED_INDICATOR_MODE_WORK].duration_ms[0] == 25U); CHECK(LedIndicator_Init(&indicator, channels, 3U, &port, &config) != 0U); CHECK(fake.writes[0] == 1U && fake.writes[1] == 1U && fake.writes[2] == 1U); CHECK(LedIndicator_SetMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U); CHECK(fake.outputs[0] == 1U); fake.now = 99U; CHECK(LedIndicator_SetMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U); LedIndicator_Process(&indicator); CHECK(fake.outputs[0] == 1U); fake.now = 100U; LedIndicator_Process(&indicator); CHECK(fake.outputs[0] == 0U); fake.now = 1000U; LedIndicator_Process(&indicator); CHECK(fake.outputs[0] == 1U); fake.now = 1050U; CHECK(LedIndicator_RestartMode(&indicator, 0U, LED_INDICATOR_MODE_WORK) != 0U); fake.now = 1150U; LedIndicator_Process(&indicator); CHECK(fake.outputs[0] == 0U); CHECK(LedIndicator_SetModeAt(&indicator, 1U, LED_INDICATOR_MODE_ERROR, 0xFFFFFFF0UL) != 0U); LedIndicator_ProcessAt(&indicator, 0x00000054UL); CHECK(fake.outputs[1] == 0U); /* 100 ms после старта, переход во второй шаг. */ LedIndicator_ProcessAt(&indicator, 0x000000B8UL); CHECK(fake.outputs[1] == 1U); /* 200 ms после старта, второй импульс. */ CHECK(LedIndicator_SetModeAt(&indicator, 2U, LED_INDICATOR_MODE_STARTUP, 10U) != 0U); LedIndicator_ProcessAt(&indicator, 610U); CHECK(fake.outputs[2] == 1U); /* Однократный startup завершён постоянным ON. */ CHECK(LedIndicator_SetMode(&indicator, 3U, LED_INDICATOR_MODE_ON) == 0U); CHECK(LedIndicator_GetMode(&indicator, 0U) == LED_INDICATOR_MODE_WORK); puts("led indicator tests passed"); return 0; }