/**
 * @file actuator_driver.h
 * @brief Low-level control of the EPB actuators.
 *
 * @arch SWA-003
 * @reqs SWE-006 SWE-013 SWE-014 SWE-015
 *
 * ASIL: B
 */
#ifndef ACTUATOR_DRIVER_H
#define ACTUATOR_DRIVER_H

#include "epb_types.h"

typedef enum {
    ACT_DIR_STOP    = 0,
    ACT_DIR_APPLY   = 1,
    ACT_DIR_RELEASE = 2
} ActuatorDirection;

typedef struct {
    ActuatorDirection direction;
    uint8_t           pwm_percent;   /* 0..100   */
    uint16_t          current_ma;    /* current motor current */
    uint16_t          peak_current_ma;
    uint16_t          clamping_force_n; /* estimated from current */
    bool              overcurrent;
    EpbStatus         last_error;
} ActuatorStatus;

/** Current limit (spec) and time window for cutoff (spec). */
#define ACT_OVERCURRENT_LIMIT_MA   8000U
#define ACT_OVERCURRENT_WINDOW_MS  100U
#define ACT_FORCE_PER_AMP_N        2500U  /* lineare Naeherung */

EpbStatus      actuator_init(void);
EpbStatus      actuator_apply(ActuatorId id, uint8_t pwm_percent);
EpbStatus      actuator_release(ActuatorId id, uint8_t pwm_percent);
EpbStatus      actuator_stop(ActuatorId id);
ActuatorStatus actuator_get_status(ActuatorId id);

/**
 * @brief ISR hook for current sampling. Called at 1 kHz.
 *
 * Replaced by test doubles for testing.
 */
void actuator_isr_1khz(ActuatorId id, uint16_t current_sample_ma);

#endif /* ACTUATOR_DRIVER_H */
