#ifndef DRILL_CURRENT_H
#define DRILL_CURRENT_H
#include <stdint.h>
#include <stdbool.h>
#include "drill_dual_adc.h"
typedef enum { CQ_IDLE,CQ_ZEROING,CQ_READY,CQ_FAILED } cq_state;
typedef enum { CQ_NONE,CQ_ARGUMENT,CQ_INTERLOCK,CQ_TIME,CQ_SEQUENCE,CQ_RANGE,CQ_OFFSET,CQ_NOISE,CQ_LIMIT } cq_fault;
/* These are externally supplied measured reference values. Their provenance,
 * gain accuracy, zero-current condition and hardware cutoff need bench proof. */
typedef struct { uint32_t adc_reference_uv,drv_reference_uv,limit_ma; } cq_profile;
/* 80-byte fixed-width candidate diagnostic. flags:1 software zero convergence,
 * 2 nominal current values available,4 C reconstructed (not a measurement).
 * No bit asserts physical calibration, gain validation or motor-run permission. */
typedef struct {
 uint32_t magic,version,epoch,state,fault,count,zero_a_q8,zero_b_q8;
 int32_t sense_a_ma,sense_b_ma,reconstructed_c_ma;
 uint32_t last_sequence,last_observed_us,flags,limit_ma,adc_reference_uv,drv_reference_uv;
 uint32_t peak_a_counts,peak_b_counts,scale_ma_per_count_q16;
} cq_record;
extern volatile cq_record drill_debug_current;
/* One off-state bench owner from cold reset; false qualification/repeated begin
 * has no effects. A true argument is an assertion by the bench operator, not
 * firmware proof. Default main never calls this entry. No SWD start latch. */
bool drill_current_bench_begin(const cq_profile *,uint32_t now,bool references_and_zero_current_verified);
bool drill_current_active(void);
void drill_current_feed(const du_sample *,uint32_t now);
void drill_current_poll(uint32_t now);
void drill_current_abort(void);
#endif
