#define main drill_entry
#include "firmware/固件/drill_target/src/main.c"
#undef main
#include "firmware/固件/drill_target/src/drill_pwm_stage.c"
#include "firmware/固件/drill_target/src/drill_spi_transport.c"
#include "firmware/固件/drill_target/src/drill_timebase.c"
#include "firmware/固件/drill_target/src/drill_safe_gpio.c"
#include "firmware/固件/drill_target/src/drill_config_binding.c"
#include "firmware/固件/drill_target/src/drill_config_async.c"
#include "firmware/固件/drill_driver/drv8316.c"
#include "firmware/固件/drill_target/src/drill_adc_capture.c"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
ADC_TypeDef adc1,adc2;ADC_Common_TypeDef adc_common;RCC_TypeDef rcc;GPIO_TypeDef ga,gb,gf;TIM_TypeDef timer,timer2;SPI_TypeDef spi;host_systick_type systick;unsigned host_systick_config_calls;
static jmp_buf returned;
static unsigned resets,wfi_calls;
void host_wait(void){if(++wfi_calls==1){timer2.CNT+=1000;SysTick_Handler();return;}longjmp(returned,1);}
static void pins(GPIO_TypeDef *p){p->ODR=(p->ODR|(p->BSRR&65535u))&~(p->BSRR>>16);p->IDR=p->ODR;p->BSRR=0;}
void host_dsb(void){if(rcc.AHB2RSTR&RCC_AHB2RSTR_ADC12RST){memset(&adc1,0,sizeof adc1);memset(&adc2,0,sizeof adc2);memset(&adc_common,0,sizeof adc_common);adc1.CR=adc2.CR=ADC_CR_DEEPPWD;}if(rcc.APB1RSTR1&RCC_APB1RSTR1_TIM2RST)memset(&timer2,0,sizeof timer2);if(rcc.APB1RSTR1&RCC_APB1RSTR1_SPI2RST)memset(&spi,0,sizeof spi);pins(&ga);pins(&gb);pins(&gf);if(rcc.APB2RSTR&RCC_APB2RSTR_TIM1RST){memset(&timer,0,sizeof timer);++resets;}}
int main(void){
 for(unsigned n=0;n<256;++n){
  drill_config=(dc_runtime){0};memset(&rcc,0,sizeof rcc);memset(&ga,0,sizeof ga);memset(&gb,0,sizeof gb);memset(&gf,0,sizeof gf);
  memset(&timer,0xff,sizeof timer);wfi_calls=0;owned=false;timebase_owned=false;memset(&timer2,0xff,sizeof timer2);memset(&systick,0,sizeof systick);host_systick_config_calls=0;state=UNINITIALIZED;memset(&spi,0xff,sizeof spi);resets=0;drill_debug_pwm_stage_available=99;
  rcc.CR=RCC_CR_HSION|RCC_CR_HSIRDY;rcc.CFGR=RCC_CFGR_SW_HSI|RCC_CFGR_SWS_HSI;
  ga.MODER=gb.MODER=gf.MODER=n*0x01010101u;
  ga.ODR=gb.ODR=gf.ODR=65535;ga.IDR=gb.IDR=gf.IDR=65535;
  if(!setjmp(returned))drill_entry();
  assert(drill_debug_pwm_stage_available==1&&drill_pwm_stage_available());assert(resets==1);assert(drill_debug_timebase_available==1&&timebase_available()&&host_systick_config_calls==1);assert(drill_debug_spi_available==1&&drill_spi_available());
  assert(drill_adc_state==DA_IDLE&&!(rcc.AHB2ENR&RCC_AHB2ENR_ADC12EN));assert(!drill_adc_bench_begin(1000,false));assert(drill_config.state==DC_IDLE);assert(!drill_config_bench_begin(1000,false));assert(drill_config.state==DC_IDLE);
  assert(timer.CCER==0&&!(timer.CR1&TIM_CR1_CEN)&&!(timer.BDTR&TIM_BDTR_MOE));
  assert((ga.ODR&((1u<<5)|(1u<<7)|(7u<<8)))==0&&!(gb.ODR&3u)&&!(gf.ODR&2u));
  assert(drill_debug_now_us==1000&&wfi_calls==2);assert(ga.ODR&(1u<<12));assert(timer.CCR1==0&&timer.CCR2==0&&timer.CCR3==0);
 }
 puts("256 REAL MAIN SAFE-BOOT TO STOPPED TIM1 SCENARIOS PASS");
}
