#include "stm32g0xx.h"
#include "lamp_driver_diagnostics.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
GPIO_TypeDef b;RCC_TypeDef r;I2C_TypeDef i;
bool lamp_i2c_pins_available(void){return true;}
int main(int argc,char **argv){
 int failat=argc>1?atoi(argv[1]):-1;bool slow=argc>2;uint32_t e[3]={0,0,0};
 i.CR1=I2C_CR1_PE;i.TIMINGR=1;assert(lamp_driver_diagnostics_init(e,0));
 unsigned tick=0,transactions=0;uint32_t now=0;pca_async_snapshot out;
 while(transactions<24){
 now=slow?tick:tick/16u;
 i.ISR=0;lamp_driver_diagnostics_poll(now);tick++;
 if((int)transactions==failat){i.ISR=I2C_ISR_NACKF|I2C_ISR_BUSY;lamp_driver_diagnostics_poll(slow?tick:tick/16u);break;}
 i.ISR=I2C_ISR_TXIS|I2C_ISR_BUSY;lamp_driver_diagnostics_poll(slow?tick:tick/16u);tick++;
 i.ISR=I2C_ISR_TC|I2C_ISR_BUSY;lamp_driver_diagnostics_poll(slow?tick:tick/16u);tick++;
 i.RXDR=0;i.ISR=I2C_ISR_RXNE|I2C_ISR_BUSY;lamp_driver_diagnostics_poll(slow?tick:tick/16u);tick++;
 assert(!lamp_driver_diagnostics_get(slow?tick:tick/16u,&out));
 i.ISR=I2C_ISR_STOPF;now=slow?tick:tick/16u;lamp_driver_diagnostics_poll(now);tick++;transactions++;
 }
 bool success=lamp_driver_diagnostics_get(now,&out);
 assert(success==(failat<0 && !slow));
 if(success){assert(out.sequence==1 && out.chip[0].requested_mask==0xffffff && out.chip[2].requested_mask==0x1fff);}
 else assert((i.CR1&I2C_CR1_PE)==0);
 puts("PASS actual A50 reader + A51 target adapter + async bank end-to-end MMIO simulation");
}
