void sendOccupancyStatus(const char* seatId, uint64_t data,
        CanSignal* lowerSignal, CanSignal* upperSignal,
        CanSignal* signals, int signalCount, Listener* listener) {
    if(lowerSignal == NULL || upperSignal == NULL) {
        debug("Upper or lower occupancy signal for seat ID %s is NULL, "
                "vehicle may not support", seatId);
        return;
    }

    float rawLowerStatus = decodeCanSignal(lowerSignal, data);
    float rawUpperStatus = decodeCanSignal(upperSignal, data);

    bool send = true;
    bool lowerStatus = booleanHandler(NULL, signals, signalCount,
            rawLowerStatus, &send);
    bool upperStatus = booleanHandler(NULL, signals, signalCount,
            rawUpperStatus, &send);
    if(lowerStatus) {
        if(upperStatus) {
            sendEventedStringMessage("occupancy_status", seatId, "adult",
                    listener);
        } else {
            sendEventedStringMessage("occupancy_status", seatId, "child",
                    listener);
        }
    } else {
        sendEventedStringMessage("occupancy_status", seatId, "empty",
                listener);
    }
}
void sendDoorStatus(const char* doorId, uint64_t data, CanSignal* signal,
        CanSignal* signals, int signalCount, Listener* listener) {
    float rawAjarStatus = decodeCanSignal(signal, data);
    bool send = true;
    bool ajarStatus = booleanHandler(NULL, signals, signalCount, rawAjarStatus, &send);

    if(send && (signal->sendSame || !signal->received ||
                rawAjarStatus != signal->lastValue)) {
        signal->received = true;
        sendEventedBooleanMessage(DOOR_STATUS_GENERIC_NAME, doorId, ajarStatus,
                listener);
    }
    signal->lastValue = rawAjarStatus;
}
void sendDoorStatus(const char* doorId, uint64_t data, CanSignal* signal,
        CanSignal* signals, int signalCount, Listener* listener) {
    if(signal == NULL) {
        debug("Specific door signal for ID %s is NULL, vehicle may not support",
                doorId);
        return;
    }

    float rawAjarStatus = decodeCanSignal(signal, data);
    bool send = true;
    bool ajarStatus = booleanHandler(NULL, signals, signalCount, rawAjarStatus,
            &send);

    if(send && (signal->sendSame || !signal->received ||
                rawAjarStatus != signal->lastValue)) {
        signal->received = true;
        sendEventedBooleanMessage(DOOR_STATUS_GENERIC_NAME, doorId, ajarStatus,
                listener);
    }
    signal->lastValue = rawAjarStatus;
}