#include "stm32g4xx.h"
#include "drill_config_binding.h"
#include "drill_spi_transport.h"
dc_runtime drill_config;
static bool dc_bind_off(void *p){(void)p;return drill_spi_available() && (drill_config.state<DC_WAKE || drill_config.state==DC_FAILED || ((GPIOF->ODR&2u)!=0 && (GPIOF->IDR&2u)!=0));}
static bool dc_bind_fault(void *p){(void)p;return ((GPIOA->MODER>>12)&3u)==0u && (GPIOA->IDR&(1u<<6))!=0;}
static bool dc_bind_awake(void *p,bool awake){(void)p;if(!drill_spi_available())return false;GPIOF->BSRR=awake?2u:2u<<16;__DSB();return ((GPIOF->ODR&2u)!=0)==awake && ((GPIOF->IDR&2u)!=0)==awake;}
static bool dc_bind_submit(void *p,uint16_t word,uint32_t now){(void)p;return drill_spi_start(word,now);}
static bool dc_bind_receive(void *p,uint16_t *word,uint32_t now){(void)p;return drill_spi_get(word,now);}
static bool dc_bind_failed(void *p){(void)p;return drill_spi_failed();}
static void dc_bind_stop(void *p){(void)p;drill_spi_abort();}
static const dc_hal dc_binding={0,dc_bind_off,dc_bind_fault,dc_bind_awake,dc_bind_submit,dc_bind_receive,dc_bind_failed,dc_bind_stop};
bool drill_config_bench_begin(uint32_t now,bool startup_qualified){if(!startup_qualified || drill_config.state!=DC_IDLE)return false;
 if(!drill_spi_available())return false;
 GPIOA->MODER&=~(3u<<12);GPIOA->PUPDR&=~(3u<<12);__DSB();
 return dc_begin(&drill_config,&dc_binding,now,true);}
void drill_config_service(uint32_t now){dc_poll(&drill_config,&dc_binding,now);}
