static uint8_t dispatchMeasurementReply(ibusAddress_t address) { int value; switch (sensorAddressTypeLookup[address - ibusBaseAddress]) { case IBUS_SENSOR_TYPE_EXTERNAL_VOLTAGE: value = getBatteryVoltage() * 10; if (telemetryConfig()->report_cell_voltage) { value /= getBatteryCellCount(); } return sendIbusMeasurement(address, value); case IBUS_SENSOR_TYPE_TEMPERATURE: value = gyroGetTemperature() * 10; return sendIbusMeasurement(address, value + IBUS_TEMPERATURE_OFFSET); case IBUS_SENSOR_TYPE_RPM: return sendIbusMeasurement(address, (uint16_t) rcCommand[THROTTLE]); } return 0; }
static void showBatteryPage(void) { uint8_t rowIndex = PAGE_TITLE_LINE_COUNT; if (batteryConfig()->voltageMeterSource != VOLTAGE_METER_NONE) { tfp_sprintf(lineBuffer, "Volts: %d.%1d Cells: %d", getBatteryVoltage() / 10, getBatteryVoltage() % 10, getBatteryCellCount()); padLineBuffer(); i2c_OLED_set_line(bus, rowIndex++); i2c_OLED_send_string(bus, lineBuffer); uint8_t batteryPercentage = calculateBatteryPercentageRemaining(); i2c_OLED_set_line(bus, rowIndex++); drawHorizonalPercentageBar(SCREEN_CHARACTER_COLUMN_COUNT, batteryPercentage); } if (batteryConfig()->currentMeterSource != CURRENT_METER_NONE) { int32_t amperage = getAmperage(); tfp_sprintf(lineBuffer, "Amps: %d.%2d mAh: %d", amperage / 100, amperage % 100, getMAhDrawn()); padLineBuffer(); i2c_OLED_set_line(bus, rowIndex++); i2c_OLED_send_string(bus, lineBuffer); uint8_t capacityPercentage = calculateBatteryPercentageRemaining(); i2c_OLED_set_line(bus, rowIndex++); drawHorizonalPercentageBar(SCREEN_CHARACTER_COLUMN_COUNT, capacityPercentage); } }
/** * Gets average battery cell voltage in 0.01V units. */ static int osdGetBatteryAverageCellVoltage(void) { return (getBatteryVoltage() * 10) / getBatteryCellCount(); }