#include "stm32g4xx.h"
#include "drill_encoder_target.h"
#include <assert.h>
#include <stdio.h>
GPIO_TypeDef a104_b,a104_c;RCC_TypeDef a104_rcc;
static void ab(unsigned v){a104_b.IDR=(v&2u)?1u<<2:0;a104_c.IDR=(v&1u)?1u<<15:0;}
int main(void){
 a104_rcc.BDCR=1;a104_b.MODER=a104_b.PUPDR=a104_c.MODER=a104_c.PUPDR=0xffffffffu;
 assert(!drill_encoder_init(0));assert(a104_rcc.AHB2ENR==0 && a104_c.MODER==0xffffffffu);
 a104_rcc.BDCR=0;a104_rcc.AHB2ENR=0x81;ab(0);assert(drill_encoder_init(0));
 assert(a104_rcc.AHB2ENR==0x87);
 assert(a104_b.MODER==(0xffffffffu&~(3u<<4)) && a104_b.PUPDR==a104_b.MODER);
 assert(a104_c.MODER==(0xffffffffu&~(3u<<30)) && a104_c.PUPDR==a104_c.MODER);
 const unsigned seq[]={1,3,2,0};
 for(unsigned j=0;j<4;j++){ab(seq[j]);drill_encoder_poll((j+1)*1000u);}
 assert(drill_debug_encoder.edge_position==4 && drill_debug_encoder.samples==4);
 assert(drill_debug_encoder.available && !(drill_debug_encoder.epoch&1u));
 a104_rcc.BDCR=1;drill_encoder_poll(5000);
 assert(!drill_debug_encoder.available && !(drill_debug_encoder.epoch&1u));
 drill_encoder_poll(6000);assert(drill_debug_encoder.samples==4);
 puts("PASS: reject active LSE before GPIO changes, only PB2/PC15 configured, other RCC/GPIO bits preserved, raw AB count and coherent snapshot, ownership loss disables capture");
}
