indicatorPanel = output_channelsIndicatorPanel, 2 indicator = {sd_present}, "No", "Yes" indicator = {isIgnitionEnabledIndicator}, "No", "Yes" indicator = {isInjectionEnabledIndicator}, "No", "Yes" indicator = {sd_logging_internal}, "No", "Yes" indicator = {unusedb4}, "No", "Yes" indicator = {isFuelPumpOn}, "No", "Yes" indicator = {isFanOn}, "No", "Yes" indicator = {isO2HeaterOn}, "No", "Yes" indicator = {checkEngine}, "No", "Yes" indicator = {needBurn}, "No", "Yes" indicator = {sd_msd}, "No", "Yes" indicator = {clutchUpState}, "No", "Yes" indicator = {clutchDownState}, "No", "Yes" indicator = {isFan2On}, "No", "Yes" indicator = {alternatorOnOff}, "No", "Yes" indicator = {brakePedalState}, "No", "Yes" indicator = {toothLogReady}, "No", "Yes" indicator = {acSwitchState}, "No", "Yes" indicator = {isTpsError}, "No", "Yes" indicator = {isCltError}, "No", "Yes" indicator = {isMapError}, "No", "Yes" indicator = {isIatError}, "No", "Yes" indicator = {acState}, "No", "Yes" indicator = {isTriggerError}, "No", "Yes" indicator = {hasCriticalError}, "No", "Yes" indicator = {isWarnNow}, "No", "Yes" indicator = {isPedalError}, "No", "Yes" indicator = {isKnockChipOk}, "No", "Yes" indicator = {launchTriggered}, "No", "Yes" indicator = {isTps2Error}, "No", "Yes" indicator = {isIdleClosedLoop}, "No", "Yes" indicator = {isIdleCoasting}, "No", "Yes" indicator = {isMainRelayOn}, "No", "Yes" indicator = {isUsbConnected}, "No", "Yes" indicator = {launchSpeedCondition}, "No", "Yes" indicator = {launchRpmCondition}, "No", "Yes" indicator = {launchTpsCondition}, "No", "Yes" indicator = {launchActivateSwitchCondition}, "No", "Yes" indicator = {launchIsLaunchCondition}, "No", "Yes" indicator = {launchCombinedConditions}, "No", "Yes" indicator = {launchActivatePinState}, "No", "Yes" indicator = {dfcoActive}, "No", "Yes" indicator = {tpsAccelActive}, "No", "Yes" liveGraph = output_channelsGraph, "Graph", South graphLine = sd_present graphLine = isIgnitionEnabledIndicator graphLine = isInjectionEnabledIndicator graphLine = sd_logging_internal graphLine = unusedb4 graphLine = isFuelPumpOn graphLine = isFanOn graphLine = isO2HeaterOn graphLine = checkEngine graphLine = needBurn graphLine = sd_msd graphLine = clutchUpState graphLine = clutchDownState graphLine = isFan2On graphLine = alternatorOnOff graphLine = brakePedalState graphLine = toothLogReady graphLine = acSwitchState graphLine = isTpsError graphLine = isCltError graphLine = isMapError graphLine = isIatError graphLine = acState graphLine = isTriggerError graphLine = hasCriticalError graphLine = isWarnNow graphLine = isPedalError graphLine = isKnockChipOk graphLine = launchTriggered graphLine = isTps2Error graphLine = isIdleClosedLoop graphLine = isIdleCoasting graphLine = RPMValue graphLine = rpmAcceleration graphLine = speedToRpmRatio graphLine = vehicleSpeedKph graphLine = internalMcuTemperature graphLine = coolant graphLine = intake graphLine = auxTemp1 graphLine = auxTemp2 graphLine = TPSValue graphLine = throttlePedalPosition graphLine = tpsADC graphLine = rawMaf graphLine = mafMeasured graphLine = MAPValue graphLine = baroPressure graphLine = lambdaValue graphLine = knockRetard graphLine = idleCurrentPosition graphLine = VBatt graphLine = oilPressure graphLine = vvtPositionB1I graphLine = chargeAirMass graphLine = crankingFuelMs graphLine = currentTargetAfr graphLine = baseFuel graphLine = fuelRunning graphLine = actualLastInjection graphLine = injectorDutyCycle graphLine = veValue graphLine = injectionOffset graphLine = tCharge graphLine = injectorLagMs graphLine = iatCorrection graphLine = cltCorrection graphLine = baroCorrection graphLine = currentEnginePhase graphLine = wallFuelAmount graphLine = wallFuelCorrection graphLine = revolutionCounterSinceStart graphLine = deltaTps graphLine = canReadCounter graphLine = tpsAccelFuel graphLine = ignitionAdvance graphLine = sparkDwellValue graphLine = coilDutyCycle graphLine = idleAirValvePosition graphLine = etbTarget graphLine = etb1DutyCycle graphLine = etb1Error graphLine = fuelTankLevel graphLine = totalFuelConsumption graphLine = fuelFlowRate graphLine = veTableYAxis graphLine = afrTableYAxis graphLine = knockLevel graphLine = seconds graphLine = engineMode graphLine = firmwareVersion graphLine = tsConfigVersion graphLine = calibrationValue graphLine = calibrationMode graphLine = idleTargetPosition graphLine = fuelingLoad graphLine = ignitionLoad graphLine = engineMakeCodeNameCrc16 graphLine = totalTriggerErrorCounter graphLine = orderingErrorCounter graphLine = warningCounter graphLine = lastErrorCode graphLine = recentErrorCode1 graphLine = recentErrorCode2 graphLine = recentErrorCode3 graphLine = recentErrorCode4 graphLine = recentErrorCode5 graphLine = recentErrorCode6 graphLine = recentErrorCode7 graphLine = recentErrorCode8 graphLine = debugFloatField1 graphLine = debugFloatField2 graphLine = debugFloatField3 graphLine = debugFloatField4 graphLine = debugFloatField5 graphLine = debugFloatField6 graphLine = debugFloatField7 graphLine = debugIntField1 graphLine = debugIntField2 graphLine = debugIntField3 graphLine = debugIntField4 graphLine = debugIntField5 graphLine = accelerationX graphLine = accelerationY graphLine = egt1 graphLine = egt2 graphLine = egt3 graphLine = egt4 graphLine = egt5 graphLine = egt6 graphLine = egt7 graphLine = egt8 graphLine = TPS2Value graphLine = rawTps1Primary graphLine = rawPpsPrimary graphLine = rawClt graphLine = rawIat graphLine = rawOilPressure graphLine = tuneCrc16 graphLine = fuelClosedLoopBinIdx graphLine = tcuCurrentGear graphLine = rawPpsSecondary graphLine = knock1 graphLine = knock2 graphLine = knock3 graphLine = knock4 graphLine = knock5 graphLine = knock6 graphLine = knock7 graphLine = knock8 graphLine = knock9 graphLine = knock10 graphLine = knock11 graphLine = knock12 graphLine = tcuDesiredGear graphLine = flexPercent graphLine = rawIdlePositionSensor graphLine = rawWastegatePosition graphLine = wastegatePositionSensor graphLine = idlePositionSensor graphLine = rawLowFuelPressure graphLine = rawHighFuelPressure graphLine = lowFuelPressure graphLine = highFuelPressure graphLine = targetLambda graphLine = AFRValue graphLine = VssAcceleration graphLine = lambdaValue2 graphLine = AFRValue2 graphLine = vvtPositionB1E graphLine = vvtPositionB2I graphLine = vvtPositionB2E graphLine = fuelPidCorrection1 graphLine = fuelPidCorrection2 graphLine = rawTps1Secondary graphLine = rawTps2Primary graphLine = rawTps2Secondary graphLine = knockCount graphLine = accelerationZ graphLine = accelerationRoll graphLine = accelerationYaw graphLine = vvtTargets1 graphLine = vvtTargets2 graphLine = vvtTargets3 graphLine = vvtTargets4 graphLine = turboSpeed graphLine = wbTemperature1 graphLine = wbTemperature2 graphLine = wbHeaterDuty1 graphLine = wbHeaterDuty2 graphLine = tps1Split graphLine = tps2Split graphLine = tps12Split graphLine = accPedalSplit graphLine = m_requested_pump graphLine = boostControlTarget graphLine = sparkCutReason graphLine = fuelCutReason graphLine = fuel_requested_percent graphLine = fuel_requested_percent_pi graphLine = m_I_sum_percent graphLine = m_pressureTarget_kPa graphLine = mafEstimate graphLine = instantRpm graphLine = di_nextStart graphLine = systemEventReuse graphLine = rawMap graphLine = rawAfr graphLine = tpsAccelFrom graphLine = tpsAccelTo graphLine = calibrationValue2 graphLine = isMainRelayOn graphLine = isUsbConnected graphLine = luaInvocationCounter graphLine = luaLastCycleDuration graphLine = testBenchIter graphLine = unusedInTheMiddle1 graphLine = unusedInTheMiddle2 graphLine = unusedInTheMiddle3 graphLine = unusedInTheMiddle4 graphLine = unusedInTheMiddle5 graphLine = unusedInTheMiddle6 graphLine = unusedInTheMiddle7 graphLine = unusedInTheMiddle8 graphLine = unusedInTheMiddle9 graphLine = unusedInTheMiddle10 graphLine = unusedInTheMiddle11 graphLine = unusedInTheMiddle12 graphLine = unusedInTheMiddle13 graphLine = unusedInTheMiddle14 graphLine = unusedInTheMiddle15 graphLine = auxLinear1 graphLine = auxLinear2 graphLine = launchSpeedCondition graphLine = launchRpmCondition graphLine = launchTpsCondition graphLine = launchActivateSwitchCondition graphLine = launchIsLaunchCondition graphLine = launchCombinedConditions graphLine = launchActivatePinState graphLine = dfcoActive graphLine = tpsAccelActive graphLine = TEMPLOG_MAP_AT_CYCLE_COUNT graphLine = TEMPLOG_map_peak graphLine = boostControllerOutput graphLine = boostControllerOpenLoopPart graphLine = TEMPLOG_MAP_AT_SPECIAL_POINT graphLine = TEMPLOG_MAP_AT_DIFF graphLine = vvtSyncGapRatio graphLine = vvtCurrentPosition graphLine = triggerSyncGapRatio graphLine = triggerStateIndex graphLine = vvtCounter graphLine = vvtSyncCounter graphLine = vvtStateIndex graphLine = fallbackMap graphLine = boostControllerClosedLoopPart graphLine = detectedGear graphLine = timingCltCorrection graphLine = timingIatCorrection graphLine = timingPidCorrection graphLine = instantMAPValue graphLine = mostRecentTimeBetweenSparkEvents graphLine = mostRecentTimeBetweenIgnitionEvents graphLine = maxLockedDuration graphLine = maxTriggerReentrant graphLine = canWriteOk graphLine = canWriteNotOk graphLine = triggerPrimaryFall graphLine = triggerPrimaryRise graphLine = triggerSecondaryFall graphLine = triggerSecondaryRise graphLine = triggerVvtFall graphLine = triggerVvtRise graphLine = startStopStateToggleCounter graphLine = starterState graphLine = starterRelayDisable graphLine = multiSparkCounter graphLine = idleState graphLine = injectorFlowPressureRatio graphLine = injectorFlowPressureDelta graphLine = etbFeedForward graphLine = etbIntegralError graphLine = etbCurrentTarget graphLine = alternatorStatus graphLine = idleStatus graphLine = etbStatus graphLine = boostStatus graphLine = auxSpeed1 graphLine = auxSpeed2 graphLine = unusedAtTheEnd1 graphLine = unusedAtTheEnd2 graphLine = unusedAtTheEnd3 graphLine = unusedAtTheEnd4 graphLine = unusedAtTheEnd5 graphLine = unusedAtTheEnd6 graphLine = unusedAtTheEnd7 graphLine = unusedAtTheEnd8 graphLine = unusedAtTheEnd9 graphLine = unusedAtTheEnd10 graphLine = unusedAtTheEnd11 graphLine = unusedAtTheEnd12 graphLine = unusedAtTheEnd13 graphLine = unusedAtTheEnd14 graphLine = unusedAtTheEnd15 graphLine = unusedAtTheEnd16 graphLine = unusedAtTheEnd17 graphLine = unusedAtTheEnd18 graphLine = unusedAtTheEnd19 graphLine = unusedAtTheEnd20 graphLine = unusedAtTheEnd21 graphLine = unusedAtTheEnd22 graphLine = unusedAtTheEnd23 graphLine = unusedAtTheEnd24 graphLine = unusedAtTheEnd25 graphLine = unusedAtTheEnd26 graphLine = unusedAtTheEnd27 graphLine = unusedAtTheEnd28 graphLine = unusedAtTheEnd29 graphLine = unusedAtTheEnd30 graphLine = unusedAtTheEnd31 graphLine = unusedAtTheEnd32 graphLine = unusedAtTheEnd33 graphLine = unusedAtTheEnd34 graphLine = unusedAtTheEnd35 graphLine = unusedAtTheEnd36 graphLine = unusedAtTheEnd37 graphLine = unusedAtTheEnd38 graphLine = unusedAtTheEnd39 graphLine = unusedAtTheEnd40 graphLine = unusedAtTheEnd41 graphLine = unusedAtTheEnd42 graphLine = unusedAtTheEnd43 graphLine = unusedAtTheEnd44 graphLine = unusedAtTheEnd45 graphLine = unusedAtTheEnd46 graphLine = unusedAtTheEnd47 graphLine = unusedAtTheEnd48 graphLine = unusedAtTheEnd49 graphLine = unusedAtTheEnd50 graphLine = unusedAtTheEnd51 graphLine = unusedAtTheEnd52 graphLine = unusedAtTheEnd53 graphLine = unusedAtTheEnd54 graphLine = unusedAtTheEnd55 graphLine = unusedAtTheEnd56 graphLine = unusedAtTheEnd57 graphLine = unusedAtTheEnd58 graphLine = unusedAtTheEnd59 graphLine = unusedAtTheEnd60 graphLine = unusedAtTheEnd61 graphLine = unusedAtTheEnd62 graphLine = unusedAtTheEnd63 graphLine = unusedAtTheEnd64 graphLine = unusedAtTheEnd65 graphLine = unusedAtTheEnd66 graphLine = unusedAtTheEnd67 graphLine = unusedAtTheEnd68 graphLine = unusedAtTheEnd69 graphLine = unusedAtTheEnd70 graphLine = unusedAtTheEnd71 graphLine = unusedAtTheEnd72 dialog = output_channelsDialog, "output_channels" panel = output_channelsIndicatorPanel panel = output_channelsGraph indicatorPanel = high_pressure_fuel_pumpIndicatorPanel, 2 indicator = {noValve}, "No", "Yes" indicator = {angleAboveMin}, "No", "Yes" indicator = {isHpfpInactive}, "No", "Yes" liveGraph = high_pressure_fuel_pumpGraph, "Graph", South graphLine = m_requested_pump graphLine = fuel_requested_percent graphLine = fuel_requested_percent_pi graphLine = noValve graphLine = angleAboveMin graphLine = isHpfpInactive graphLine = nextLobe graphLine = nextStart dialog = high_pressure_fuel_pumpDialog, "high_pressure_fuel_pump" panel = high_pressure_fuel_pumpIndicatorPanel panel = high_pressure_fuel_pumpGraph liveGraph = injector_modelGraph, "Graph", South graphLine = m_deadtime graphLine = pressureDelta graphLine = pressureRatio dialog = injector_modelDialog, "injector_model" panel = injector_modelGraph indicatorPanel = launch_control_stateIndicatorPanel, 2 indicator = {combinedConditions}, "No", "Yes" indicator = {launchActivatePinState}, "No", "Yes" indicator = {isLaunchCondition}, "No", "Yes" indicator = {isSwitchActivated}, "No", "Yes" indicator = {isClutchActivated}, "No", "Yes" indicator = {isValidInputPin}, "No", "Yes" indicator = {activateSwitchCondition}, "No", "Yes" indicator = {rpmCondition}, "No", "Yes" indicator = {speedCondition}, "No", "Yes" indicator = {tpsCondition}, "No", "Yes" liveGraph = launch_control_stateGraph, "Graph", South graphLine = retardThresholdRpm graphLine = combinedConditions graphLine = launchActivatePinState graphLine = isLaunchCondition graphLine = isSwitchActivated graphLine = isClutchActivated graphLine = isValidInputPin graphLine = activateSwitchCondition graphLine = rpmCondition graphLine = speedCondition graphLine = tpsCondition dialog = launch_control_stateDialog, "launch_control_state" panel = launch_control_stateIndicatorPanel panel = launch_control_stateGraph indicatorPanel = boost_controlIndicatorPanel, 2 indicator = {isTpsInvalid}, "No", "Yes" indicator = {m_shouldResetPid}, "No", "Yes" indicator = {isBelowClosedLoopThreshold}, "No", "Yes" indicator = {isNotClosedLoop}, "No", "Yes" indicator = {isZeroRpm}, "No", "Yes" liveGraph = boost_controlGraph, "Graph", South graphLine = isTpsInvalid graphLine = m_shouldResetPid graphLine = isBelowClosedLoopThreshold graphLine = isNotClosedLoop graphLine = isZeroRpm graphLine = openLoopPart graphLine = closedLoopPart dialog = boost_controlDialog, "boost_control" panel = boost_controlIndicatorPanel panel = boost_controlGraph indicatorPanel = ac_controlIndicatorPanel, 2 indicator = {engineTooSlow}, "No", "Yes" indicator = {engineTooFast}, "No", "Yes" indicator = {noClt}, "No", "Yes" indicator = {engineTooHot}, "No", "Yes" indicator = {tpsTooHigh}, "No", "Yes" indicator = {acButtonState}, "No", "Yes" indicator = {isDisabledByLua}, "No", "Yes" liveGraph = ac_controlGraph, "Graph", South graphLine = engineTooSlow graphLine = engineTooFast graphLine = noClt graphLine = engineTooHot graphLine = tpsTooHigh graphLine = acButtonState graphLine = isDisabledByLua graphLine = latest_usage_ac_control graphLine = acSwitchLastChangeTimeMs dialog = ac_controlDialog, "ac_control" panel = ac_controlIndicatorPanel panel = ac_controlGraph indicatorPanel = fan_controlIndicatorPanel, 2 indicator = {cranking}, "No", "Yes" indicator = {notRunning}, "No", "Yes" indicator = {disabledWhileEngineStopped}, "No", "Yes" indicator = {brokenClt}, "No", "Yes" indicator = {enabledForAc}, "No", "Yes" indicator = {hot}, "No", "Yes" indicator = {cold}, "No", "Yes" liveGraph = fan_controlGraph, "Graph", South graphLine = cranking graphLine = notRunning graphLine = disabledWhileEngineStopped graphLine = brokenClt graphLine = enabledForAc graphLine = hot graphLine = cold dialog = fan_controlDialog, "fan_control" panel = fan_controlIndicatorPanel panel = fan_controlGraph indicatorPanel = fuel_pump_controlIndicatorPanel, 2 indicator = {isPrime}, "No", "Yes" indicator = {engineTurnedRecently}, "No", "Yes" indicator = {isPumpOn}, "No", "Yes" indicator = {ignitionOn}, "No", "Yes" liveGraph = fuel_pump_controlGraph, "Graph", South graphLine = isPrime graphLine = engineTurnedRecently graphLine = isPumpOn graphLine = ignitionOn dialog = fuel_pump_controlDialog, "fuel_pump_control" panel = fuel_pump_controlIndicatorPanel panel = fuel_pump_controlGraph indicatorPanel = main_relayIndicatorPanel, 2 indicator = {isBenchTest}, "No", "Yes" indicator = {hasIgnitionVoltage}, "No", "Yes" indicator = {mainRelayState}, "No", "Yes" indicator = {delayedShutoffRequested}, "No", "Yes" liveGraph = main_relayGraph, "Graph", South graphLine = isBenchTest graphLine = hasIgnitionVoltage graphLine = mainRelayState graphLine = delayedShutoffRequested dialog = main_relayDialog, "main_relay" panel = main_relayIndicatorPanel panel = main_relayGraph liveGraph = engine_stateGraph, "Graph", South graphLine = sd graphLine = targetAFR graphLine = engineCycleDurationMs graphLine = minRpmKcurrentTPS graphLine = currentTpsAdc graphLine = tpsVoltageMCU graphLine = tpsVoltageBoard graphLine = currentBaroCorrectedVE graphLine = injectorFlowCorrection graphLine = baroCorrection graphLine = cranking graphLine = running graphLine = etbFeedForward graphLine = targetFromTable graphLine = sparkDwell graphLine = dwellAngle graphLine = cltTimingCorrection dialog = engine_stateDialog, "engine_state" panel = engine_stateGraph indicatorPanel = tps_accel_stateIndicatorPanel, 2 indicator = {isAboveAccelThreshold}, "No", "Yes" indicator = {isBelowDecelThreshold}, "No", "Yes" indicator = {isTimeToResetAccumulator}, "No", "Yes" indicator = {isFractionalEnrichment}, "No", "Yes" indicator = {belowEpsilon}, "No", "Yes" indicator = {tooShort}, "No", "Yes" liveGraph = tps_accel_stateGraph, "Graph", South graphLine = tpsFrom graphLine = tpsTo graphLine = deltaTps graphLine = extraFuel graphLine = valueFromTable graphLine = isAboveAccelThreshold graphLine = isBelowDecelThreshold graphLine = isTimeToResetAccumulator graphLine = isFractionalEnrichment graphLine = belowEpsilon graphLine = tooShort graphLine = fractionalInjFuel graphLine = accumulatedValue graphLine = maxExtraPerCycle graphLine = maxExtraPerPeriod graphLine = maxInjectedPerPeriod graphLine = cycleCnt dialog = tps_accel_stateDialog, "tps_accel_state" panel = tps_accel_stateIndicatorPanel panel = tps_accel_stateGraph liveGraph = trigger_centralGraph, "Graph", South graphLine = hwEventCounters1 graphLine = hwEventCounters2 graphLine = hwEventCounters3 graphLine = hwEventCounters4 graphLine = hwEventCounters5 graphLine = hwEventCounters6 graphLine = vvtCamCounter dialog = trigger_centralDialog, "trigger_central" panel = trigger_centralGraph liveGraph = trigger_stateGraph, "Graph", South graphLine = currentGap graphLine = totalRevolutionCounter dialog = trigger_stateDialog, "trigger_state" panel = trigger_stateGraph liveGraph = wall_fuel_stateGraph, "Graph", South graphLine = wallFuelCorrection graphLine = wallFuel dialog = wall_fuel_stateDialog, "wall_fuel_state" panel = wall_fuel_stateGraph indicatorPanel = idle_stateIndicatorPanel, 2 indicator = {mightResetPid}, "No", "Yes" indicator = {shouldResetPid}, "No", "Yes" indicator = {wasResetPid}, "No", "Yes" indicator = {mustResetPid}, "No", "Yes" indicator = {isCoasting}, "No", "Yes" indicator = {useIacTableForCoasting}, "No", "Yes" indicator = {notIdling}, "No", "Yes" indicator = {needReset}, "No", "Yes" indicator = {isInDeadZone}, "No", "Yes" indicator = {isBlipping}, "No", "Yes" indicator = {useClosedLoop}, "No", "Yes" indicator = {badTps}, "No", "Yes" indicator = {looksLikeRunning}, "No", "Yes" indicator = {looksLikeCoasting}, "No", "Yes" indicator = {looksLikeCrankToIdle}, "No", "Yes" indicator = {useInstantRpmForIdle}, "No", "Yes" indicator = {isVerboseIAC}, "No", "Yes" liveGraph = idle_stateGraph, "Graph", South graphLine = idleState graphLine = currentIdlePosition graphLine = baseIdlePosition graphLine = iacByTpsTaper graphLine = throttlePedalUpState graphLine = mightResetPid graphLine = shouldResetPid graphLine = wasResetPid graphLine = mustResetPid graphLine = isCoasting graphLine = useIacTableForCoasting graphLine = notIdling graphLine = needReset graphLine = isInDeadZone graphLine = isBlipping graphLine = useClosedLoop graphLine = badTps graphLine = looksLikeRunning graphLine = looksLikeCoasting graphLine = looksLikeCrankToIdle graphLine = useInstantRpmForIdle graphLine = isVerboseIAC graphLine = targetRpmByClt graphLine = targetRpmAcBump dialog = idle_stateDialog, "idle_state" panel = idle_stateIndicatorPanel panel = idle_stateGraph liveGraph = ignition_stateGraph, "Graph", South graphLine = baseDwell graphLine = dwellVoltageCorrection graphLine = luaTimingAdd graphLine = luaTimingMult dialog = ignition_stateDialog, "ignition_state" panel = ignition_stateGraph liveGraph = electronic_throttleGraph, "Graph", South graphLine = idlePosition graphLine = trim graphLine = luaAdjustment dialog = electronic_throttleDialog, "electronic_throttle" panel = electronic_throttleGraph