#include "misc.h" #include "stm32f4xx_can.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "SysTick.h" #include "CAN_interface.h" #include "CAN_messageTypes.h" #include "USART_dump.h" #include #include #include #define MAX_NUMBER_OF_DOORS 15 __attribute__((naked)) __attribute__((section (".start_section")) ) void startup ( void ) { __asm__ volatile(" LDR R0,=0x2001C000\n"); /* set stack */ __asm__ volatile(" MOV SP,R0\n"); __asm__ volatile(" BL main\n"); /* call main */ __asm__ volatile(".L1: B .L1\n"); /* never return */ } uint16_t auxId; //is true when the central unit has sent a can message with init info bool isInited = false; // queue struct typedef struct{ int mainTop; int helperTop; char * mainQueue[MAX_NUMBER_OF_DOORS]; char * helperQueue[MAX_NUMBER_OF_DOORS]; } Queue; uint16_t alarmDelayms; uint8_t numberOfDoors; bool activeDoors[MAX_NUMBER_OF_DOORS]; bool alarmsCalled[MAX_NUMBER_OF_DOORS]; Queue alarms; // the two functions below are defined to create a queue to see who started each timer void enqueue(char data){ while(alarms.mainTop > -1){ alarms.helperTop++; alarms.helperQueue[alarms.helperTop] = alarms.mainQueue[alarms.mainTop]; alarms.mainTop--; } alarms.mainTop++; alarms.mainQueue[alarms.mainTop]; while(alarms.helperTop > -1){ alarms.mainTop++; alarms.mainQueue[alarms.helperTop] = alarms.helperQueue[alarms.mainTop]; alarms.helperTop--; } } char dequeue(){ char data = alarms.mainQueue[alarms.mainTop]; alarms.mainTop--; return data; } //sets the door pins to input and pullup void doorAlarmInit(){ GPIO_InitTypeDef GPIOx_init; int pinNumber = 1; for(int i = 0; i < MAX_NUMBER_OF_DOORS; i++){ GPIOx_init.GPIO_Pin |= pinNumber; pinNumber = 1<