#include "drill_button.h"
#include <string.h>
void db_init(db_state *s,uint32_t now,bool pressed) {
 if(!s)return;
 memset(s,0,sizeof(*s));dclick_init(&s->clicks,450);
 s->last_us=now;s->candidate_us=now;s->candidate_pressed=s->stable_pressed=pressed;
 s->initialized=true;
 /* Require a stable released state after boot or service discontinuity. */
}
dc_command db_sample(db_state *s,uint32_t now,bool pressed) {
 if(!s || !s->initialized)return DC_NONE;
 uint32_t delta=now-s->last_us;s->last_us=now;
 if(delta>20000u){db_init(s,now,pressed);return DC_NONE;}
 s->elapsed_us+=delta;s->now_ms+=s->elapsed_us/1000u;s->elapsed_us%=1000u;
 dc_command result=dclick_poll(&s->clicks,DC_MAIN_KEY,s->now_ms);
 if(pressed!=s->candidate_pressed){s->candidate_pressed=pressed;s->candidate_us=now;}
 if((uint32_t)(now-s->candidate_us)>=20000u){
  if(!s->released_armed){
   if(!pressed){s->released_armed=true;s->stable_pressed=false;}
  }else if(s->stable_pressed!=pressed){
   s->stable_pressed=pressed;
   if(!pressed)(void)dclick_release(&s->clicks,DC_MAIN_KEY,s->now_ms);
  }
 }
 return result;
}
