#include "lamp_output_pins.h"
#include "stm32g0xx.h"
#include <stdbool.h>
static bool pin(GPIO_TypeDef *p,unsigned n,bool high){
 uint32_t bit=1u<<n;
 return ((p->MODER>>(n*2u))&3u)==1u && (p->OTYPER&bit)==0u &&
 (p->ODR&bit)==(high?bit:0u) && (p->IDR&bit)==(high?bit:0u);
}
void lamp_output_pins_request_off(void){
 RCC->IOPENR|=RCC_IOPENR_GPIOAEN|RCC_IOPENR_GPIOBEN|RCC_IOPENR_GPIOCEN;
 RCC->APBENR2|=RCC_APBENR2_SYSCFGEN;
 (void)RCC->IOPENR;(void)RCC->APBENR2;__DSB();
 /* WDOG pad16 may be PA9 or PA11. Blank both latches without remapping. */
 GPIOA->BSRR=(1u<<7)|(1u<<(4u+16u))|(1u<<(9u+16u))|(1u<<(11u+16u));
 GPIOB->BSRR=1u<<(9u+16u);__DSB();
}
uint32_t lamp_output_pins_read_off(void){
 uint32_t result=0;
 if((RCC->IOPENR&RCC_IOPENR_GPIOAEN)!=0u){
  if(pin(GPIOA,4u,false))result|=LAMP_OFF_POWER;
  if(pin(GPIOA,7u,true))result|=LAMP_OFF_OE;
  if((RCC->APBENR2&RCC_APBENR2_SYSCFGEN)!=0u){
   unsigned wd=(SYSCFG->CFGR1&SYSCFG_CFGR1_PA11_RMP)?9u:11u;
   if(pin(GPIOA,wd,false))result|=LAMP_OFF_WDOG;
  }
 }
 if((RCC->IOPENR&(RCC_IOPENR_GPIOBEN|RCC_IOPENR_GPIOCEN))==
    (RCC_IOPENR_GPIOBEN|RCC_IOPENR_GPIOCEN) &&
    (RCC->BDCR&(RCC_BDCR_LSEON|RCC_BDCR_LSERDY|RCC_BDCR_LSEBYP))==0u &&
    ((GPIOC->MODER>>28)&3u)==3u && (GPIOC->PUPDR&(3u<<28))==0u &&
    pin(GPIOB,9u,false))result|=LAMP_OFF_RESET;
 return result;
}
