Добавить переносимый планировщик PULSE

This commit is contained in:
2026-09-01 20:54:58 +03:00
parent e9ec078b38
commit af82687e42
5 changed files with 179 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ void CanSensor_ConfigDefault(CanSensor_Config *config)
}
config->tx_id = CAN_SENSOR_DEFAULT_TX_ID;
config->rx_id = CAN_SENSOR_DEFAULT_RX_ID;
config->pulse_period_ms = 0U;
config->extended = 1U;
config->retries = CAN_SENSOR_DEFAULT_RETRIES;
}
@@ -72,6 +73,9 @@ uint8_t CanSensor_Init(CanSensor *link, const CanSensor_Io *io,
link->send_errors = 0U;
link->received_messages = 0U;
link->dropped_frames = 0U;
link->pulse_last_ms = 0U;
link->pulse_counter = 0U;
link->pulse_armed = 0U;
return 1U;
}
@@ -201,3 +205,51 @@ uint8_t CanSensor_Poll(CanSensor *link, CanSensor_Message *out)
}
return 0U;
}
void CanSensor_SetPulsePeriod(CanSensor *link, uint32_t period_ms)
{
if (link == 0) {
return;
}
if (link->config.pulse_period_ms != period_ms) {
link->config.pulse_period_ms = period_ms;
/* После включения или смены периода отсчитываем полный новый период. */
link->pulse_armed = 0U;
}
}
uint32_t CanSensor_PulsePeriod(const CanSensor *link)
{
return (link != 0) ? link->config.pulse_period_ms : 0U;
}
void CanSensor_Task(CanSensor *link, uint32_t now_ms)
{
CanSensor_Frame frame;
const uint32_t period_ms = (link != 0) ? link->config.pulse_period_ms : 0U;
if ((link == 0) || (link->io.send == 0) || (period_ms == 0U)) {
return;
}
if (link->pulse_armed == 0U) {
link->pulse_last_ms = now_ms;
link->pulse_armed = 1U;
return;
}
if ((now_ms - link->pulse_last_ms) < period_ms) {
return;
}
frame.id = (link->config.tx_id & CAN_SENSOR_ADDRESS_MASK)
| ((uint32_t)CAN_SENSOR_MSGTYPE_PULSE << 16U);
frame.extended = 1U;
frame.length = 1U;
link->pulse_counter++;
frame.data[0] = link->pulse_counter;
if (can_sensor_send_frame(link, &frame) != 0U) {
link->pulse_last_ms = now_ms;
} else {
/* Счётчик меняется только для реально поставленных в очередь кадров. */
link->pulse_counter--;
}
}