WIP: interrupt based light switch detection for front SN #11
@ -60,6 +60,9 @@ FDCAN_TxHeaderTypeDef txHeader;
|
||||
// Declare buffer in AXI SRAM
|
||||
static uint16_t adc_values[NUM_ADC_PINS];
|
||||
static uint8_t dio_values[NUM_DIO_PINS];
|
||||
#ifdef SN_FRONT
|
||||
static uint8_t ls_values[2];
|
||||
#endif /* SN_FRONT */
|
||||
|
||||
static uint16_t filtered_values[NUM_ADC_PINS];
|
||||
|
||||
@ -85,12 +88,23 @@ void send_latest_can() {
|
||||
|
||||
tx_counter++;
|
||||
|
||||
#if defined(SN_FRONT)
|
||||
|
||||
memcpy(dio_values, ls_values, 2);
|
||||
memset(ls_values, 0, 2);
|
||||
for (int di = 2; di < NUM_DIO_PINS; di++) { //TODO: find way to make this dependent on mappings
|
||||
dio_values[di] = HAL_GPIO_ReadPin(
|
||||
DIO_PIN_MAP[di].port,
|
||||
DIO_PIN_MAP[di].pin
|
||||
);
|
||||
}
|
||||
#elif defined(SN_REAR)
|
||||
for (int di = 0; di < NUM_DIO_PINS; di++) {
|
||||
dio_values[di] = HAL_GPIO_ReadPin(
|
||||
DIO_PIN_MAP[di].port,
|
||||
DIO_PIN_MAP[di].pin
|
||||
);
|
||||
}
|
||||
#endif /* SN_FRONT */
|
||||
|
||||
for (int pi = 0; pi < NUM_TX_PKT; pi++) {
|
||||
|
||||
@ -158,6 +172,16 @@ void filter_adc() {
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SN_FRONT
|
||||
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
||||
if (GPIO_Pin == DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[0].channel].pin) {
|
||||
ls_values[1] = 1;
|
||||
} else if (GPIO_Pin == DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[1].channel].pin) {
|
||||
o.winkels
commented
Was wenn beides gleichzeitig passiert? Würde das "else" weg lassen. Oder wären dass dann 2 gequeuete interrupts? Was wenn beides gleichzeitig passiert? Würde das "else" weg lassen. Oder wären dass dann 2 gequeuete interrupts?
|
||||
ls_values[0] = 1;
|
||||
}
|
||||
}
|
||||
#endif /* SN_FRONT */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/**
|
||||
@ -202,6 +226,36 @@ int main(void)
|
||||
/* Initialize interrupts */
|
||||
MX_NVIC_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
// Enable Interrupts for Light Switch Pins
|
||||
#ifdef SN_FRONT
|
||||
// check if pin name is "LS L"
|
||||
if (strcmp(CAN_SIGNAL_MAP[0].signals[0].name, "LS L") != 0
|
||||
o.winkels
commented
Lieber ne Flag in dem Struct hinzufügen (oder noch besser einen neuen Signal Type definieren) als hier Strings zu vergleichen IMO Lieber ne Flag in dem Struct hinzufügen (oder noch besser einen neuen Signal Type definieren) als hier Strings zu vergleichen IMO
o.winkels
commented
Achso das ist nur ne Kontrolle. Dann okay i guess Achso das ist nur ne Kontrolle. Dann okay i guess
|
||||
|| strcmp(CAN_SIGNAL_MAP[0].signals[1].name, "LS R") != 0
|
||||
) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
GPIO_InitStruct.Pin = CAN_SIGNAL_MAP[0].signals[0].channel;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[0].channel].port, &GPIO_InitStruct);
|
||||
o.winkels
commented
Statt an all diesen Orten immer hardcoded in die Map zu indexieren würde ich eher entweder feste indizes definieren:
oder noch besser statt 2 separaten Init-Calls hier direkt durch ein array iterieren:
oder noch einfacher wenn du wie oben das Attribut hinzufügst:
Statt an all diesen Orten immer hardcoded in die Map zu indexieren würde ich eher entweder feste indizes definieren:
```
#define EXTI_PIN_1_PIN L9
#define EXTI_PIN_1_PIN LA
```
oder noch besser statt 2 separaten Init-Calls hier direkt durch ein array iterieren:
```
int EXTI_PINS[2] = {L9, LA};
```
oder noch einfacher wenn du wie oben das Attribut hinzufügst:
```
for (int di = 0; di < NUM_DIO_PINS; di++) {
if (DIO_PIN_MAP[di].exti_idx >= 0)
HAL_GPIO_Init(...)
```
|
||||
GPIO_InitStruct.Pin = CAN_SIGNAL_MAP[0].signals[1].channel;
|
||||
HAL_GPIO_Init(DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[1].channel].port, &GPIO_InitStruct);
|
||||
|
||||
// Did not find a way to make this dependent on mappings,
|
||||
// since the EXTI lines are shared for pins 10-15
|
||||
// so i just error if the pins are not 10, 15
|
||||
if (DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[0].channel].pin != GPIO_PIN_10
|
||||
|| DIO_PIN_MAP[CAN_SIGNAL_MAP[0].signals[1].channel].pin != GPIO_PIN_15
|
||||
) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
|
||||
#endif /* SN_FRONT */
|
||||
|
||||
hMainCAN = &hfdcan1;
|
||||
hPeriCAN = &hfdcan2;
|
||||
|
Loading…
x
Reference in New Issue
Block a user
Vorschlag:
DIO_PIN_MAP
Type um ein numerisches Feldexti_idx
ergänzen, -1 wenn kein interrupt. DannWürde sowieso nicht den Begriff
ls
benutzen da das ja ein feature ist was unabhängig von der spezifischen Sensorik nützlich sein kann. Lieberinterrupt
oderirq
oderexti