WIP: interrupt based light switch detection for front SN #11
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "interrupt-based-ls"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Prototyp für #10
Leider ist diese implementierung nicht besonders flexibel, ich gehe hier davon aus das die LS in den mappings an der gleichen stelle im paket sind, und error sonst. Das geht sogar noch.
Noch uneleganter ist die lösung wo dann die Digital Reads geskipped werden und es hard-coded ist das die ersten beiden DIO_PIN_MAP einträge die light switches sein müssen.
Die EXTI line für den NVIC ist auch schwirig flexibel zu machen, 0-4 sind einzeln, 5-9 und 10-15 gruppiert, das von den mappings herzuleiten wird noch hässlicher.
Alternative zu dem versuch vom "flexiblen" ansatz ist einfach überall von dem auszugehen wie es ist (ersten beiden einträge in der DIO map und in der can signals map) und zu errorn wenn der name nicht stimmt
@o.winkels fällt dir was besseres ein?
Ungetestet, und ich mach das nochmal sauber wenn ich input für den Ansatz habe
interrupt based light switch detection for front SNto WIP: interrupt based light switch detection for front SNSieht gut aus! Würde ein paar Sachen generischer implementieren aber sieht erstmal so aus als würde es funktionieren
@ -85,12 +88,23 @@ void send_latest_can() {
tx_counter++;
#if defined(SN_FRONT)
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
@ -161,0 +176,4 @@
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) {
Was wenn beides gleichzeitig passiert? Würde das "else" weg lassen. Oder wären dass dann 2 gequeuete interrupts?
@ -205,0 +230,4 @@
// 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
Lieber ne Flag in dem Struct hinzufügen (oder noch besser einen neuen Signal Type definieren) als hier Strings zu vergleichen IMO
Achso das ist nur ne Kontrolle. Dann okay i guess
@ -205,0 +240,4 @@
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);
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:
Checkout
From your project repository, check out a new branch and test the changes.