/*!
 *
 * Copyright (c) 2021-2024 Diality Inc. - All Rights Reserved.
 * \copyright
 * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN
 * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER.
 *
 * \file    DiagnosticsDialog.qml
 * \author  (last)      Dara Navaei
 * \date    (last)      05-Mar-2024
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  11-May-2021
 *
 */

// Qt
import QtQuick 2.12
// Project
import Gui.Actions      0.1

//  Qml imports
import "qrc:/globals"
import "qrc:/components"

/*!
 * \brief   the post treatment prime stack screen
 */
DiagnosticsBase { id: _root
    objectName  : "_DiagnosticsDD"

    contentItem : Item { id: _content

        DebugDataColumn { id: _DDConcentratePumpColumn
            textObjectName  :"_DDConcentratePumpData"
            title           : qsTr(" Conc Pump ")
            anchors {
                top     : parent.top
                left    : parent.left
            }
            model: [
                vDDConcentratePump.D10PumpCurrentSetSpeed      .toFixed(2) ,
                vDDConcentratePump.D10PumpMeasuredSpeed        .toFixed(2) ,
                vDDConcentratePump.D10PumpTargetRevCount                   ,
                vDDConcentratePump.D10PumpMeasuredRevCount                 ,
                vDDConcentratePump.D10PumpState                            ,
                vDDConcentratePump.D10PumpPulseUS              .toFixed(2) ,
                vDDConcentratePump.D10PumpTargetSpeed          .toFixed(2) ,
                vDDConcentratePump.D10PumpParked                           ,
                vDDConcentratePump.D10PumpParkFault                        ,
                vDDConcentratePump.D11PumpCurrentSetSpeed      .toFixed(2) ,
                vDDConcentratePump.D11PumpMeasuredSpeed        .toFixed(2) ,
                vDDConcentratePump.D11PumpTargetRevCount                   ,
                vDDConcentratePump.D11PumpMeasuredRevCount                 ,
                vDDConcentratePump.D11PumpState                            ,
                vDDConcentratePump.D11PumpPulseUS              .toFixed(2) ,
                vDDConcentratePump.D11PumpTargetSpeed          .toFixed(2) ,
                vDDConcentratePump.D11PumpParked                           ,
                vDDConcentratePump.D11PumpParkFault                        ,
                vDDConcentratePump.D76PumpCurrentSetSpeed      .toFixed(2) ,
                vDDConcentratePump.D76PumpMeasuredSpeed        .toFixed(2) ,
                vDDConcentratePump.D76PumpTargetRevCount                   ,
                vDDConcentratePump.D76PumpMeasuredRevCount                 ,
                vDDConcentratePump.D76PumpState                            ,
                vDDConcentratePump.D76PumpPulseUS              .toFixed(2) ,
                vDDConcentratePump.D76PumpTargetSpeed          .toFixed(2) ,
            ]
            label: [
                "sSpd (D10)        ",
                "mSpd (D10)        ",
                "rCnt (D10)        ",
                "mCnt (D10)        ",
                "State (D10)       ",
                "Plse (D10)        ",
                "tSpd (D10)        ",
                "park (D10)        ",
                "pfault (D10)      ",
                "sSpd (D11)        ",
                "mSpd (D11)        ",
                "rCnt (D11)        ",
                "mCnt (D11)        ",
                "State (D11)       ",
                "Plse (D11)        ",
                "tSpd (D11)        ",
                "park (D11)        ",
                "pfault (D11)      ",
                "sSpd  (D76)       ",
                "mSpd  (D76)       ",
                "rCnt  (D76)       ",
                "mCnt  (D76)       ",
                "State (D76)       ",
                "Plse  (D76)       ",
                "tSpd  (D76)       ",
            ]
        }

        DebugDataColumn { id: _DDDialysatePumpColumn
            textObjectName  :"_DDDialysatePumpData"
            title           : qsTr(" Dial Pump ")
            anchors {
                top         : parent.top
                left        : _DDConcentratePumpColumn.right
                leftMargin  : spacing
            }
            model: [
                vDDDialysatePump.D12PumpTargetRPM             .toFixed(2) ,
                vDDDialysatePump.D12PumpMeasuredSpeed         .toFixed(2) ,
                vDDDialysatePump.D12PumpCurrentSpeed          .toFixed(2) ,
                vDDDialysatePump.D12PumpState                             ,
                vDDDialysatePump.D12PumpTargetPressure        .toFixed(2) ,
                vDDDialysatePump.D12PumpMeasuredPressure      .toFixed(2) ,
                vDDDialysatePump.D12PumpMeasuredCurrent       .toFixed(2) ,
                vDDDialysatePump.D12PumpControl                           ,
                vDDDialysatePump.D12PumpDirErrCnt                         ,
                vDDDialysatePump.D12PumpMeasuredDir                       ,
                vDDDialysatePump.D48PumpTargetRPM             .toFixed(2) ,
                vDDDialysatePump.D48PumpMeasuredSpeed         .toFixed(2) ,
                vDDDialysatePump.D48PumpCurrentSpeed          .toFixed(2) ,
                vDDDialysatePump.D48PumpState                             ,
                vDDDialysatePump.D48PumpTargetPressure        .toFixed(2) ,
                vDDDialysatePump.D48PumpMeasuredPressure      .toFixed(2) ,
                vDDDialysatePump.D48PumpMeasuredCurrent       .toFixed(2) ,
                vDDDialysatePump.D48PumpControl                           ,
                vDDDialysatePump.D48PumpDirErrCnt                         ,
                vDDDialysatePump.D48PumpMeasuredDir                       ,
            ]
            label: [
                "tRPM (D12)     ",
                "mSpd (D12)     ",
                "cSpd (D12)     ",
                "State (D12)    ",
                "tPres (D12)    ",
                "mPres (D12)    ",
                "Ctrl (D12)     ",
                "eCnt (D12)     ",
                "mCurr (D12)    ",
                "mDir (D12)     ",
                "tRPM (D48)     ",
                "mSpd (D48)     ",
                "cSpd (D48)     ",
                "State (D48)    ",
                "tPres (D48)    ",
                "mPres (D48)    ",
                "mCurr (D48)    ",
                "Ctrl (D48)     ",
                "eCnt (D48)     ",
                "mDir (D48)     ",
            ]
        }

        DebugDataColumn { id: _DDHeatersColumn
            textObjectName  :"_DDHeatersData"
            title           : qsTr(" Heaters ")
            anchors {
                top         : parent.top
                left        : _DDDialysatePumpColumn.right
                leftMargin  : spacing
            }
            model: [
                vDDHeaters.mainPrimayHeaterDC           .toFixed(2) ,
                vDDHeaters.primaryTargetTemp            .toFixed(2) ,
                vDDHeaters.primaryHeaterState                       ,
                vDDHeaters.primaryHeaterIntervalCount               ,
                vDDHeaters.trimmerHeaterDC              .toFixed(2) ,
                vDDHeaters.trimmerTargetTemp            .toFixed(2) ,
                vDDHeaters.trimmerHeaterState                       ,
                vDDHeaters.trimmerHeaterIntervalCount               ,
                vDDHeaters.dbg1                         .toFixed(2) ,
                vDDHeaters.dbg2                         .toFixed(2) ,
                vDDHeaters.dbg3                         .toFixed(2) ,
                vDDHeaters.dbg4                         .toFixed(2) ,
                vDDHeaters.dbg5                         .toFixed(2) ,
                vDDHeaters.dbg6                         .toFixed(2) ,
                vDDHeaters.dbg7                         .toFixed(2) ,
                vDDHeaters.dbg8                         .toFixed(2) ,
                vDDHeaters.dbg9                         .toFixed(2) ,
            ]
            label: [
                "pHeat (D5)         ",
                "pTemp (D5)         ",
                "pState (D5)        ",
                "pIC (D5)           ",
                "tHeat (D45)        ",
                "tTemp (D45)        ",
                "tstate (D45)       ",
                "tIC (D45)          ",
                "dbg1               ",
                "dbg2               ",
                "dbg3               ",
                "dbg4               ",
                "dbg5               ",
                "dbg6               ",
                "dbg7               ",
                "dbg8               ",
                "dbg9               ",
            ]
        }

        DebugDataColumn { id: _DDTemperatureColumn
            textObjectName  :"_DDTemperatureData"
            title           : qsTr(" Temp ")
            anchors {
                top         : parent.top
                left        : _DDHeatersColumn.right
                leftMargin  : spacing
            }
            model: [
                vDDTemperatures.inletHeatExchanger       .toFixed(2) ,
                vDDTemperatures.outletHeatExchanger      .toFixed(2) ,
                vDDTemperatures.hydraulicsPrimaryHeater  .toFixed(2) ,
                vDDTemperatures.trimmerHeater            .toFixed(2) ,
                vDDTemperatures.boardTemperature         .toFixed(2) ,
                vDDTemperatures.barometricTemperature    .toFixed(2) ,
                vDDTemperatures.D16Conductivity          .toFixed(2) ,
                vDDTemperatures.D28Conductivity          .toFixed(2) ,
                vDDTemperatures.D30Conductivity          .toFixed(2) ,
                vDDTemperatures.D44Conductivity          .toFixed(2) ,
                vDDTemperatures.D75Conductivity          .toFixed(2) ,
                vDDTemperatures.D4MovingAverage          .toFixed(2) ,
                vDDTemperatures.D50MovingAverage         .toFixed(2) ,
                vDDTemperatures.D28MovingAverage         .toFixed(2) ,
                vDDTemperatures.D30MovingAverage         .toFixed(2) ,
            ]
            label: [
                "inHE  (D1)         ",
                "outHE (X6)         ",
                "hydr  (D4)         ",
                "trim  (D50)        ",
                "board              ",
                "baro               ",
                "Cond  (D16)        ",
                "Cond  (D28)        ",
                "Cond  (D30)        ",
                "Cond  (D44)        ",
                "Cond  (D75)        ",
                "mAvg  (D4)         ",
                "mAvg  (D50)        ",
                "mAvg  (D28)        ",
                "mAvg  (D30)        ",
            ]
        }

        DebugDataColumn { id: _DDPressureColumn
            textObjectName  :"_DDPressureData"
            title           : qsTr(" Pressure ")
            anchors {
                top         : parent.top
                left        : _DDTemperatureColumn.right
                leftMargin  : spacing
            }
            model: [
                vDDPressures.waterInletPSI      .toFixed(2),
                vDDPressures.waterOutletPSI     .toFixed(2),
                vDDPressures.hydrolicOutletPSI  .toFixed(2),
                vDDPressures.bicarbBagPSI       .toFixed(2),
                vDDPressures.spentDialysatePSI  .toFixed(2),
                vDDPressures.freshDialysatePSI  .toFixed(2),
                vDDPressures.transmembranePSI   .toFixed(2),
                vDDPressures.waterInletTemp     .toFixed(2),
                vDDPressures.waterOutletTemp    .toFixed(2),
                vDDPressures.hydrolicOutletTemp .toFixed(2),
                vDDPressures.bicarbBagTemp      .toFixed(2),
                vDDPressures.spentDialysateTemp .toFixed(2),
                vDDPressures.freshDialysateTemp .toFixed(2),
                vDDPressures.transmembraneTemp  .toFixed(2),
            ]
            label: [
                "WInPSI   (M1)     ",
                "WOutPSI  (M3)     ",
                "HOutPSI  (D9)     ",
                "BBagPSI  (D66)    ",
                "SDialPSI (D51)    ",
                "FDialPSI (D18)    ",
                "TransPSI (D41)    ",
                "WInTmp   (M1)     ",
                "WOutTmp  (M3)     ",
                "HOutTmp  (D9)     ",
                "BBagTmp  (D66)    ",
                "SDialTmp (D51)    ",
                "FDialTmp (D18)    ",
                "TransTmp (D41)    ",
            ]
        }

        DebugDataColumn { id: _DDGenDialColumn
            textObjectName  :"_DDGenDialData"
            title           : qsTr(" GenDial ")
            anchors {
                top         : parent.top
                left        : _DDPressureColumn.right
                leftMargin  : spacing
            }

            model: [
                vDDGenDialysate.genDialysateExec               ,
                vDDGenDialysate.ddInProgress                   ,
                vDDGenDialysate.isDialGood                     ,
                vDDGenDialysate.fltLevel1                      ,
                vDDGenDialysate.bicarbLevel                    ,
                vDDGenDialysate.spentLevel                     ,
                vDDGenDialysate.hydNegativePressure .toFixed(2),
                vDDGenDialysate.hydPositivePressure .toFixed(2),
                vDDGenDialysate.spentPressure       .toFixed(2),
            ]
            label: [
                "Exec           ",
                "inProg         ",
                "isGood         ",
                "fltLvL (D6)    ",
                "bicarbLvL (D63)",
                "sptLvL (D46)   ",
                "hydNeg (D19)   ",
                "hydPos (D18)   ",
                "sptPres (D51)  ",
            ]
        }

        DebugDataColumn { id: _DDHydraulicsValveColumn
            textObjectName  :"_DDHydraulicValveData"
            title           : qsTr(" Hyd Valve ")
            anchors {
                top         : _DDGenDialColumn.bottom
                topMargin   : spacing
                left        : _DDGenDialColumn.left
            }

            model: [
                Number(vDDValvesStates.hydraulicsOutletValve )           ,
                Number(vDDValvesStates.thermalDisinfectValve )           ,
                Number(vDDValvesStates.HydraulicsBypassValve )           ,
                Number(vDDValvesStates.rinsePortValve        )           ,
                Number(vDDValvesStates.drainValve            )           ,
                Number(vDDValvesStates.dialyzerBypassValve   )           ,
                Number(vDDValvesStates.purgeValve1           )           ,
                Number(vDDValvesStates.pressureTestValve     )           ,
                Number(vDDValvesStates.dryBicarbInletValve   )           ,
                Number(vDDValvesStates.dialyzerInletValve    )           ,
                Number(vDDValvesStates.dialyzerOutletValve   )           ,
                Number(vDDValvesStates.purgeValve2           )           ,
                Number(vDDValvesStates.hydraulicsInletValve  )           ,
                Number(vDDValvesStates.dryBicarbValve        )           ,
                Number(vDDValvesStates.deScalerValve        )            ,
            ]
            label: [
                "HydOut (D14)         ",
                "ThemD (D52)          ",
                "HydByP (D8)          ",
                "RinseP (D54)         ",
                "Drain (D53)          ",
                "DialByP (D34)        ",
                "PurgV1 (D64)         ",
                "PresT (D31)          ",
                "DryBic (D65)         ",
                "DialIn (D35)         ",
                "DialOut (D40)        ",
                "PurgV2 (D47)         ",
                "HydIn (D3)           ",
                "Dry Bicarb (D80)     ",
                "De-scaler (D81)      ",
            ]
        }

        DebugDataColumn { id: _DDCondColumn
            textObjectName  :"_DDCondlData"
            title           : qsTr(" Cond ")
            anchors {
                top         : _DDDialysatePumpColumn.bottom
                topMargin   : spacing
                left        : _DDDialysatePumpColumn.left
            }
            model: [
                vDDConductivity.bicarbCondutivity1     .toFixed(2),
                vDDConductivity.acidBicarbCondutivity1 .toFixed(2),
                vDDConductivity.acidBicarbCondutivity2 .toFixed(2),
                vDDConductivity.spentCondutivity1      .toFixed(2),
                vDDConductivity.bicarbCondutivity2     .toFixed(2),
            ]
            label: [
                "bicarb1 (D17) ",
                "acidb1 (D27)  ",
                "acidb1 (D29)  ",
                "spent (D43)   ",
                "bicarb2 (D74) ",
            ]
        }

        DebugDataColumn { id: _DDLevelColumn
            textObjectName  :"_DDLevelData"
            title           : qsTr(" Levels ")
            anchors {
                top         : _DDPressureColumn.bottom
                topMargin   : spacing
                left        : _DDPressureColumn.left
            }
            model: [
                vDDLevel.floaterLevel         ,
                vDDLevel.bicarbLevel          ,
                vDDLevel.spentDialysateLevel  ,
            ]
            label: [
                "floater (D6)  ",
                "bicarb (D63)  ",
                "sptDial (D46) ",
            ]
        }

        DebugDataColumn { id: _DDBCValvesColumn
            textObjectName  :"_DDBCValvesData"
            title           : qsTr(" BC Valves ")
            anchors {
                top         : _DDTemperatureColumn.bottom
                topMargin   : spacing
                left        : _DDHeatersColumn.right
                leftMargin  : spacing
            }
            model: [
                Number(vDDValvesStates.balancingChamberValve1 ) ,
                Number(vDDValvesStates.balancingChamberValve2 ) ,
                Number(vDDValvesStates.balancingChamberValve3 ) ,
                Number(vDDValvesStates.balancingChamberValve4 ) ,
                Number(vDDValvesStates.balancingChamberValve5 ) ,
                Number(vDDValvesStates.balancingChamberValve6 ) ,
                Number(vDDValvesStates.balancingChamberValve7 ) ,
                Number(vDDValvesStates.balancingChamberValve8 ) ,
            ]
            label: [
                "BC1 (D23) ",
                "BC2 (D19) ",
                "BC3 (D25) ",
                "BC4 (D21) ",
                "BC5 (D24) ",
                "BC6 (D20) ",
                "BC7 (D26) ",
                "BC8 (D22) ",
            ]
        }

        DebugDataColumn { id: _DDIOValvesColumn
            textObjectName  :"_DDIOValvesColumn"
            title           : qsTr(" IO Valves ")
            anchors {
                top         : _DDBCValvesColumn.bottom
                topMargin   : spacing
                left        : _DDBCValvesColumn.left
            }
            model: [
                Number(vDDValvesStates.ioValve0 ) ,
                Number(vDDValvesStates.ioValve1 ) ,
            ]
            label: [
                "IO0 (M4)  ",
                "IO1 (M12) ",
            ]
        }

        DebugDataColumn { id: _DDSpareValvesColumn
            textObjectName  :"_DDSpareValvesColumn"
            title           : qsTr(" Spare Valves ")
            anchors {
                top         : _DDHeatersColumn.bottom
                topMargin   : spacing
                left        : _DDHeatersColumn.left
            }
            model: [
                Number(vDDValvesStates.spareValve0 ) ,
                Number(vDDValvesStates.spareValve1 ) ,
                Number(vDDValvesStates.spareValve2 ) ,
                Number(vDDValvesStates.spareValve3 ) ,
                Number(vDDValvesStates.spareValve4 ) ,
                Number(vDDValvesStates.spareValve5 ) ,
                Number(vDDValvesStates.spareValve6 ) ,
                Number(vDDValvesStates.spareValve7 ) ,
            ]
            label: [
                "D79            ",
                "D82            ",
                "D91            ",
                "Spare Valve 3  ",
                "Spare Valve 4  ",
                "Spare Valve 5  ",
                "D100           ",
                "Spare Valve 7  ",
            ]
        }

        DebugDataColumn { id: _DDFPValvesColumn
            textObjectName  :"_DDFPValvesColumn"
            title           : qsTr(" FP Valves ")
            anchors {
                top         : _DDLevelColumn.bottom
                topMargin   : spacing
                left        : _DDPressureColumn.left
            }
            model: [
                Number(vDDValvesStates.fpValve0)    ,
                Number(vDDValvesStates.fpValve1)    ,
                Number(vDDValvesStates.fpValve2)    ,
                Number(vDDValvesStates.fpValve3)    ,
                Number(vDDValvesStates.fpValve4)    ,
                Number(vDDValvesStates.fpValve5)    ,
            ]
            label: [
                "P11    ",
                "P33    ",
                "P34    ",
                "P37    ",
                "P39    ",
                "P6     ",
            ]
        }

        DebugDataColumn { id: _DDBloodLeakColumn
            textObjectName  :"_DDBloodLeakData"
            title           : qsTr(" Blood Leak ")
            anchors {
                top         : _DDConcentratePumpColumn.bottom
                topMargin   : spacing
                left        : parent.left
            }
            model: [
                vDDBloodLeak.bloodLeak         ,
            ]
            label: [
                "BL         ",
            ]
        }

        // TODO: The TouchRect should be unnecessary since the first communication message with UI/TD is the version.
        TouchRect {
            width       : _DDVersionsColumn.width
            height      : _DDVersionsColumn.height
            onClicked   : vAdjustmentVersions.doAdjustment()
            radius      : 5
            anchors {
                bottom          : parent.bottom
                right           : parent.right
            }

            DebugDataColumn { id: _DDVersionsColumn
                textObjectName  :"_DDVersionsData"
                title           : ""
                horizontalAlignmentText: Text.AlignLeft
                fontPixelSizeText: Fonts.fontPixelDebugTitle
                isTouchRect             : true
                model: [ "DD: v%1.%2.%3-%4 v%5.%6.%7-%8 c%9\nDD Serial#: %10"
                    .arg(vAdjustmentVersions.ddVerMajor             )
                    .arg(vAdjustmentVersions.ddVerMinor             )
                    .arg(vAdjustmentVersions.ddVerMicro             )
                    .arg(vAdjustmentVersions.ddVerBuild             )
                    .arg(vAdjustmentVersions.ddVerFPGAMajor         )
                    .arg(vAdjustmentVersions.ddVerFPGAMinor         )
                    .arg(vAdjustmentVersions.ddVerFPGALab           )
                    .arg(vAdjustmentVersions.ddVerFPGAId            )
                    .arg(vAdjustmentVersions.ddVerCompatibilityRev  )
                    .arg(vAdjustmentVersions.ddSerial               )
                ]
            }
        }
    }

    Connections { target: _GuiView
        function onDidActionReceive( vAction, vData ) {
            // DEBUG: console.debug("onDidActionReceive", vAction, vData)
            if (vAction === GuiActions.ID_CANBusFaultCount ) {
                _canbusFaultCountText.count = vData[0]
            }
        }
    }
}
