Tricks

Dry Interface Implementation

In C each function needs a header definition and an implementation. This also applies to OBC virtual methods. But usually the header and implementation file for an interface contain exactly the same macro calls except for the xxxx_BODY extension in the implementation. Compare vehicle.h and vehicle.c as an example.
This is not very DRY programming (DRY == Don't Repeat Yourself). If you like, you can omit the implementation file by using the interfaceImpl.h header. Define a file interfaceImpl.c where you include all your interface header files. Before them include interfaceImpl.h. Then interfaceImpl.c will provide the implementation for all virtual methods.

interfaceImpl.c

    #include <../obc/interfaceImpl.h>

    #include "vehicle.h"