GiUCAN

a minimalistic version of BACCAble providing a subset of functionalities: Smart Start and Stop disabling, DPF regeneration warnings, Dashboard info display

View on GitHub
#define DASHBOARD_MESSAGE_MAX_LENGTH 18

#define DASHBOARD_ITEMS                            \
    X(FIRMWARE_ITEM, "GiUCAN " GIUCAN_VERSION)     \
    X(UPTIME_ITEM, "Uptime: %.0fmin")              \
    X(HP_ITEM, "Power: %.1fhp")                    \
    X(NM_ITEM, "Torque: %.0fnm")                   \
    X(DPF_STATUS_ITEM, "DPF: %s")                  \
    X(DPF_CLOG_ITEM, "DPF clog: %.0f%%")           \
    X(DPF_TEMP_ITEM, "DPF t: %.0f"                 \
                     "\xB0"                        \
                     "C")                          \
    X(DPF_REG_ITEM, "DPF ref: %.0f%%")             \
    X(DPF_DIST_ITEM, "DPF dist: %.0fkm")           \
    X(DPF_COUNT_ITEM, "DPF count: %.0f")           \
    X(DPF_MEAN_DIST_ITEM, "DPF mean: %.0fkm")      \
    X(DPF_MEAN_DURATION_ITEM, "DPF mean: %.0fmin") \
    X(BATTERY_V_ITEM, "Battery: %.1fV")            \
    X(BATTERY_A_ITEM, "Battery: %.2fA")            \
    X(BATTERY_P_ITEM, "Battery: %.0f%%")           \
    X(OIL_PRESS_ITEM, "Oil p: %.1fbar")            \
    X(OIL_QUALITY_ITEM, "Oil q: %.0f%%")           \
    X(OIL_TEMP_ITEM, "Oil t: %.0f"                 \
                     "\xB0"                        \
                     "C")                          \
    X(COOLANT_TEMP_ITEM, "Coolant t: %.0f"         \
                         "\xB0"                    \
                         "C")                      \
    X(AIR_IN_ITEM, "Air in t: %.0f"                \
                   "\xB0"                          \
                   "C")                            \
    X(GEAR_ITEM, "Gear: %c")                       \
    X(GEARBOX_TEMP_ITEM, "Gearbox t: %.0f"         \
                         "\xB0"                    \
                         "C")                      \
    X(STEERING_ITEM, "Steering: %.1f"              \
                     "\xB0")                       \
    X(TIRES_TEMP_FRONT_ITEM, "%.0f"                \
                             "\xB0"                \
                             "C ^ T ^ %.0f"        \
                             "\xB0"                \
                             "C")                  \
    X(TIRES_TEMP_REAR_ITEM, "%.0f"                 \
                            "\xB0"                 \
                            "C v T v %.0f"         \
                            "\xB0"                 \
                            "C")

#define CONVERTERS                                                             \
    X(DPF_STATUS_ITEM, const char *, dpf_status_as_string(value), bool, false) \
    X(GEAR_ITEM, char, ((unsigned char)value), bool, false)

#define EXTRACTION_FUNCTIONS                                                      \
    X(extractTempCommon, ((float)(((A(r) * 256) + B(r))) * 0.02f) - 40.0f)        \
    X(extractCarUptime, ((float)((A(r) * 256) + B(r)) / 4.0f))                    \
    X(extractHP, ((float)s->car.torque - 500) * (float)s->car.rpm * 0.000142378f) \
    X(extractNM, (float)s->car.torque - 500)                                      \
    X(extractDpfStatus, (float)s->car.dpf.regenMode)                              \
    X(extractDpfClog, ((float)((A(r) * 256) + B(r))) * 0.01525902f)               \
    X(extractDpfReg, ((float)((A(r) * 256) + B(r))) * 0.001525902f)               \
    X(extractDpfDist, ((float)((A(r) * 65536) + (B(r) * 256) + C(r))) * 0.1)      \
    X(extractDpfCount, (float)((A(r) * 256) + B(r)))                              \
    X(extractDpfMeanDist, (float)((A(r) * 256) + B(r)))                           \
    X(extractDpfMeanDuration, (float)((A(r) * 256) + B(r)) / 60.0f)               \
    X(extractBatteryVolt, (float)((A(r) * 256) + B(r)) * 0.0005f)                 \
    X(extractBatteryPerc, (float)s->car.battery.chargePercent)                    \
    X(extractBatteryAmpere, (float)s->car.battery.current)                        \
    X(extractOilPressure, s->car.oil.pressure)                                    \
    X(extractOilQuality, ((float)((A(r) * 256) + B(r))) * 0.001525902f)           \
    X(extractOilTemp, (float)s->car.oil.temperature)                              \
    X(extractGearboxTemp, (float)A(r) - 40.0f)                                    \
    X(extractGear, (float)s->car.gear)                                            \
    X(extractSteeringAngle, ((float)((((int8_t)A(r)) * 256) + B(r))) / 16.0f)

#define EXTRACTORS                                                                                                          \
    X(UPTIME_ITEM, true, true, 0x18DA10F1, 0x03221009, extractCarUptime, false, false, 0, 0, noop_extract)                  \
    X(HP_ITEM, true, false, 0, 0, extractHP, false, false, 0, 0, noop_extract)                                              \
    X(NM_ITEM, true, false, 0, 0, extractNM, false, false, 0, 0, noop_extract)                                              \
    X(DPF_STATUS_ITEM, true, false, 0, 0, extractDpfStatus, false, false, 0, 0, noop_extract)                               \
    X(DPF_CLOG_ITEM, true, true, 0x18DA10F1, 0x032218E4, extractDpfClog, false, false, 0, 0, noop_extract)                  \
    X(DPF_TEMP_ITEM, true, true, 0x18DA10F1, 0x032218DE, extractTempCommon, false, false, 0, 0, noop_extract)               \
    X(DPF_REG_ITEM, true, true, 0x18DA10F1, 0x0322380B, extractDpfReg, false, false, 0, 0, noop_extract)                    \
    X(DPF_DIST_ITEM, true, true, 0x18DA10F1, 0x03223807, extractDpfDist, false, false, 0, 0, noop_extract)                  \
    X(DPF_COUNT_ITEM, true, true, 0x18DA10F1, 0x032218A4, extractDpfCount, false, false, 0, 0, noop_extract)                \
    X(DPF_MEAN_DIST_ITEM, true, true, 0x18DA10F1, 0x03223809, extractDpfMeanDist, false, false, 0, 0, noop_extract)         \
    X(DPF_MEAN_DURATION_ITEM, true, true, 0x18DA10F1, 0x0322380A, extractDpfMeanDuration, false, false, 0, 0, noop_extract) \
    X(BATTERY_V_ITEM, true, true, 0x18DA10F1, 0x03221955, extractBatteryVolt, false, false, 0, 0, noop_extract)             \
    X(BATTERY_A_ITEM, true, false, 0, 0, extractBatteryAmpere, false, false, 0, 0, noop_extract)                            \
    X(BATTERY_P_ITEM, true, false, 0, 0, extractBatteryPerc, false, false, 0, 0, noop_extract)                              \
    X(OIL_PRESS_ITEM, true, false, 0, 0, extractOilPressure, false, false, 0, 0, noop_extract)                              \
    X(OIL_QUALITY_ITEM, true, true, 0x18DA10F1, 0x03223813, extractOilQuality, false, false, 0, 0, noop_extract)            \
    X(OIL_TEMP_ITEM, true, false, 0, 0, extractOilTemp, false, false, 0, 0, noop_extract)                                   \
    X(COOLANT_TEMP_ITEM, true, true, 0x18DA10F1, 0x03221003, extractTempCommon, false, false, 0, 0, noop_extract)           \
    X(AIR_IN_ITEM, true, true, 0x18DA10F1, 0x03221935, extractTempCommon, false, false, 0, 0, noop_extract)                 \
    X(GEAR_ITEM, true, false, 0, 0, extractGear, false, false, 0, 0, noop_extract)                                          \
    X(GEARBOX_TEMP_ITEM, true, true, 0x18DA18F1, 0x032204FE, extractGearboxTemp, false, false, 0, 0, noop_extract)          \
    X(STEERING_ITEM, true, true, 0x18DA2AF1, 0x0322083C, extractSteeringAngle, false, false, 0, 0, noop_extract)

#ifndef VALUES_REFRESH_MS
/* item_type, values_refresh_ms */
#define VALUES_REFRESH_MS            \
    X(FIRMWARE_ITEM, 60000)          \
    X(UPTIME_ITEM, 1000)             \
    X(DPF_STATUS_ITEM, 1000)         \
    X(DPF_CLOG_ITEM, 5000)           \
    X(DPF_TEMP_ITEM, 5000)           \
    X(DPF_REG_ITEM, 1000)            \
    X(DPF_DIST_ITEM, 60000)          \
    X(DPF_COUNT_ITEM, 60000)         \
    X(DPF_MEAN_DIST_ITEM, 60000)     \
    X(DPF_MEAN_DURATION_ITEM, 60000) \
    X(BATTERY_V_ITEM, 1000)          \
    X(BATTERY_A_ITEM, 1000)          \
    X(BATTERY_P_ITEM, 10000)         \
    X(OIL_QUALITY_ITEM, 60000)       \
    X(GEARBOX_TEMP_ITEM, 10000)      \
    X(TIRES_TEMP_FRONT_ITEM, 15000)  \
    X(TIRES_TEMP_REAR_ITEM, 15000)

#endif