I think "software engineers aren't really engineers" is putting "real engineering" on a pedestal that is borne of ignorance. Hillel Wayne's engineer interviews were eye-opening on this: https://www.hillelwayne.com/post/are-we-really-engineers/
The arrow operator is a field access through a pointer. That is, if you have a pointer to a struct, it's the same as dereferencing the pointer and accessing the field: "(*foo).bar" corresponds to "foo->bar".
I think the main driving logic is on line 228. It could definitely do with some more descriptive variable names, though - "a" for angle, and "s" for sense inputs seems a bit too short.
The UK is renationalising railways now.