#include "drill_encoder.h"
#include <limits.h>
#include <string.h>
bool de_init(de_state *s,uint32_t now,uint8_t ab){
 if(!s)return false;
 memset(s,0,sizeof(*s));if(ab>3u)return false;
 s->last_us=now;s->previous=ab;s->initialized=true;return true;
}
int8_t de_sample(de_state *s,uint32_t now,uint8_t ab){
 static const int8_t delta[16]={0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};
 if(!s||!s->initialized)return 0;
 if(ab>3u){s->initialized=false;return 0;}
 uint32_t elapsed=now-s->last_us;s->last_us=now;
 uint8_t old=s->previous;s->previous=ab;
 if(elapsed>2000u){++s->service_gaps;return 0;}
 if((old^ab)==3u){++s->invalid_transitions;return 0;}
 int8_t step=delta[(old<<2)|ab];
 if((step>0&&s->edge_position==INT32_MAX)||(step<0&&s->edge_position==INT32_MIN)){
  s->saturated=true;return 0;
 }
 s->edge_position+=step;return step;
}
