#include "stm32g0xx.h"
#include "lamp_board_inputs.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
GPIO_TypeDef a,b,c;
RCC_TypeDef r;
int main(void) {
 unsigned cases=0;
 for(unsigned bits=0;bits<128;bits++) {
  memset(&a,0,sizeof a);memset(&b,0,sizeof b);
  const unsigned pins[]={0,9,10,11,12,6};
  for(unsigned n=0;n<6;n++) if(bits&(1u<<n))a.IDR|=(1u<<pins[n]);
  b.IDR=(bits&64u)?1u:0u;
  const GPIO_TypeDef prior_a=a,prior_b=b;
  lamp_board_input_snapshot s=lamp_board_inputs_read(0u);
  assert(s.thermal_contact_closed==((bits&16u)!=0));
  assert(s.hardware_interlock_closed==((bits&1u)!=0));
  assert(s.user_key_pressed==((bits&64u)==0));
  assert(s.guard_inputs.hardware_interlock_ok==s.hardware_interlock_closed);
  assert(!s.guard_inputs.temperature_ok && !s.guard_inputs.supply_ok);
  assert(!s.guard_inputs.led_driver_ok && !s.guard_inputs.infrared_hand_present);
  assert(memcmp(&a,&prior_a,sizeof a)==0 && memcmp(&b,&prior_b,sizeof b)==0);
  lg_guard g;const lg_config c={.channels=1,.max_run_ms=100,.ticket_lifetime_ms=20,.max_poll_gap_ms=10,.channel_input_mw={1},.input_budget_mw=1,.calibration_id=1};
  const lg_inputs good={true,true,true,true,true};lg_frame f;
  assert(lg_init(&g,&c,1,0));lg_poll(&g,0,good);assert(lg_arm(&g,LG_AI,50,0));
  assert(lg_issue_ticket(&g,0,&f));f.source_frame_seq=1;f.hand_present=true;f.pwm[0]=1;
  assert(lg_accept_ai(&g,&f,0) && g.output_enable);
  lg_poll(&g,1,s.guard_inputs);
  assert(g.mode==LG_FAULT && !g.output_enable && !g.pending_ticket && !g.armed);
  assert(!lg_issue_ticket(&g,1,&f));assert(!lg_accept_ai(&g,&f,1));
  cases++;
 }
 printf("PASS: %u GPIO combinations; PA12 vs PA10 alias isolation; read-only sampler; unbound IR/ADC/driver stays false; active AI output cancelled by real sampler/policy path. MMIO model only.\n",cases);
}
