Index: denali.pro
===================================================================
diff -u -r4947841e8cdd7e72d4fe26e604f7e5061fb86d64 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- denali.pro (.../denali.pro) (revision 4947841e8cdd7e72d4fe26e604f7e5061fb86d64)
+++ denali.pro (.../denali.pro) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -5,9 +5,10 @@
QMAKE_CXXFLAGS += -Wall -Werror -Wextra -Wimplicit-fallthrough=3 # -save-temps # see .ii
# -Wpedantic -Wconversion -Wshadow # these can't always be used, since it gives errors in Qt library.
-TRANSLATIONS += denali.ts
+TRANSLATIONS += \
+ resources/translations/translation_es.ts \
+ resources/translations/translation_de.ts
-
#CONFIG += disable_crc
disable_crc {
message( *** IMPORTANT : DISABLED CRC CHECK *** )
Index: denali.qrc
===================================================================
diff -u -r90e68000c37bc14b0dfd5f18caf425c24cc0b5f4 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- denali.qrc (.../denali.qrc) (revision 90e68000c37bc14b0dfd5f18caf425c24cc0b5f4)
+++ denali.qrc (.../denali.qrc) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -182,7 +182,6 @@
sources/gui/qml/plugins/virtualkeyboard/layouts/fallback/numbers.qml
sources/gui/qml/plugins/virtualkeyboard/layouts/fallback/symbols.qml
-
sources/gui/qml/globals/Variables.qml
sources/gui/qml/globals/Colors.qml
Index: main.cpp
===================================================================
diff -u -ra522e6aa7a36ac696a9a956200e89d838f319e25 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- main.cpp (.../main.cpp) (revision a522e6aa7a36ac696a9a956200e89d838f319e25)
+++ main.cpp (.../main.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -548,24 +548,32 @@
// SYSTEM TEST FOR INSTRUCTIONS WHEN THERE IS NO PORT AVAILABLE
// Storage::FileHandler::copyFolder(QString(Storage::USB_Mount_Point) + "Instructions", QString(Storage::Settings_Path()));
- //! - Translation initialization
- //! AMIR
- //!
- Storage::Settings settings;
- settings.loadTranslation();
-
//! - Initializing required thread types
Threads::registerTypes();
- bool guiStarted = startGui();
-
//! - Initializing Logger
if(_Logger.init(Threads::_Logger_Thread)) {
_Logger.enableConsoleOut(gConsoleoutLogs);
}
_Logger.postInit();
+ // That is enough to call to the I function here to create the object in the thread that Settings is leaving in,
+ // which currently is Application_Thread, since the Settings is created in that thread.
+ _Settings;
+ QTranslator translator;
+ { // on-shot use of settings to load the translation only
+ // Storage::Settings settings;
+ //! - Reading localization
+ if ( ! Storage::Settings::readLocale() ) {
+ //! - Translation initialization
+ Storage::Settings::loadTranslation(translator);
+ }
+ }
+
+ //! - Starting the application interface
+ bool guiStarted = startGui();
+
if (gFakeInterval) {
QString msg = " ~~ !!!!! APPLICATION RUNNING IN THE TEST MODE !!!!! ~~ ";
qDebug() << msg;
Fisheye: Tag d9b9df9b23da89b4c27f4672ff6e7f570adcc48a refers to a dead (removed) revision in file `resources/translation/translation_es.ts'.
Fisheye: No comparison available. Pass `N' to diff?
Index: resources/translations/translation_de.qm
===================================================================
diff -u
Binary files differ
Index: resources/translations/translation_de.ts
===================================================================
diff -u
--- resources/translations/translation_de.ts (revision 0)
+++ resources/translations/translation_de.ts (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -0,0 +1,5386 @@
+
+
+ AlarmListDialog
+
+
+ Alarm list
+ ßlarm list
+
+
+
+ ApplicationPost
+
+
+ The POST log file could not be read.
+ ßhe POST log file could not be read.
+
+
+
+ BPHREntry
+
+
+ Blood Pressure
+ ßlood Pressure
+
+
+
+ mmHg
+ ßmHg
+
+
+
+ Heart Rate
+ ßeart Rate
+
+
+
+ BPM
+ ßPM
+
+
+
+ BackButton
+
+
+ BACK
+ ßACK
+
+
+
+ Bluetooth::BluetoothInterface
+
+
+ BCUFF Battery: %1
+ ßCUFF Battery: %1
+
+
+
+ Can::CanInterface
+
+
+ Connected
+ ßonnected
+
+
+
+ Device Creation
+ ßevice Creation
+
+
+
+ Connection
+ ßonnection
+
+
+
+ Disconnected
+ ßisconnected
+
+
+
+ Can::MessageDispatcher
+
+
+ Out of Sync : %1 , %2
+ ßut of Sync : %1 , %2
+
+
+
+ Ack Req, Sq:%1, ID:%2
+ ßck Req, Sq:%1, ID:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckReq : %1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ß~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckReq : %1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ ,%1,Ack Bak, Sq:%2
+ ß ,%1,Ack Bak, Sq:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ß~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ ,%1,Ack Req, Sq:%2, ID:%3
+ ß ,%1,Ack Req, Sq:%2, ID:%3
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ß~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Ack Bak, Sq:%1, Dst:%2
+ ßck Bak, Sq:%1, Dst:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ß~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Can::MessageInterpreter
+
+
+ Unhandled Message ID (HD)
+ ßnhandled Message ID (HD)
+
+
+
+ Unknown transmit Message with ID '%1'
+ ßnknown transmit Message with ID '%1'
+
+
+
+ CheckListView
+
+
+ Complete!
+ ßomplete!
+
+
+
+ CloudSyncController
+
+
+ CS Unknown Error
+ ßS Unknown Error
+
+
+
+ CS The device registration failed
+ ßS The device registration failed
+
+
+
+ CS Invalid Device State
+ ßS Invalid Device State
+
+
+
+ CS The treatment report delivery failed
+ ßS The treatment report delivery failed
+
+
+
+ CS The device check-in failed
+ ßS The device check-in failed
+
+
+
+ CS The device decommissioning failed
+ ßS The device decommissioning failed
+
+
+
+ CS Invalid UI Message CRC
+ ßS Invalid UI Message CRC
+
+
+
+ CS DRT device registration failed
+ ßS DRT device registration failed
+
+
+
+ CS Patient association failed
+ ßS Patient association failed
+
+
+
+ CS New token certification failed
+ ßS New token certification failed
+
+
+
+ CS Token verification failed
+ ßS Token verification failed
+
+
+
+ CS Cloud device validation failed
+ ßS Cloud device validation failed
+
+
+
+ CS Patient ID does not exists
+ ßS Patient ID does not exists
+
+
+
+ CS Temporary patient ID creation failed
+ ßS Temporary patient ID creation failed
+
+
+
+ CS Save credentials failed
+ ßS Save credentials failed
+
+
+
+ CS Unknown device state
+ ßS Unknown device state
+
+
+
+ CS Config file save failed
+ ßS Config file save failed
+
+
+
+
+ CS Log upload failed
+ ßS Log upload failed
+
+
+
+ CS The device factory reset failed
+ ßS The device factory reset failed
+
+
+
+ CS The log retention failed
+ ßS The log retention failed
+
+
+
+ CS Out buffer file does not exist
+ ßS Out buffer file does not exist
+
+
+
+ CS Out buffer empty
+ ßS Out buffer empty
+
+
+
+ CS Incorrect header
+ ßS Incorrect header
+
+
+
+ CS Incorrect timestamp
+ ßS Incorrect timestamp
+
+
+
+ CS Incorrect sequence
+ ßS Incorrect sequence
+
+
+
+ CS Incorrect CRC
+ ßS Incorrect CRC
+
+
+
+ CS Incorrect ID
+ ßS Incorrect ID
+
+
+
+ CS Incorrect parameter count
+ ßS Incorrect parameter count
+
+
+
+ CS Invalid ID
+ ßS Invalid ID
+
+
+
+ CS Mismatch parameter count
+ ßS Mismatch parameter count
+
+
+
+ CS Missing parameter
+ ßS Missing parameter
+
+
+
+ CS No history available
+ ßS No history available
+
+
+
+ CS Duplicate data
+ ßS Duplicate data
+
+
+
+ CS The log folder cannot be created.
+ ßS The log folder cannot be created.
+
+
+
+ CS Error writing to the input file.
+ ßS Error writing to the input file.
+
+
+
+ CS The credentials file does not exist.
+ ßS The credentials file does not exist.
+
+
+
+ CS The credentials folder is incorrect.
+ ßS The credentials folder is incorrect.
+
+
+
+ CS No credential file name provided.
+ ßS No credential file name provided.
+
+
+
+ CS The credentials folder is empty.
+ ßS The credentials folder is empty.
+
+
+
+ CS No Treatment Code provided.
+ ßS No Treatment Code provided.
+
+
+
+ CS The provided Treatment Code is empty.
+ ßS The provided Treatment Code is empty.
+
+
+
+ CS No Log Name provided.
+ ßS No Log Name provided.
+
+
+
+ CS The provided Log Name is empty.
+ ßS The provided Log Name is empty.
+
+
+
+ CS Not Sent, Device not registered.
+ ßS Not Sent, Device not registered.
+
+
+
+ CS No Log Retention summary provided.
+ ßS No Log Retention summary provided.
+
+
+
+ ConfirmButton
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ ConfirmDialog
+
+
+ Are you sure?
+ ßre you sure?
+
+
+
+ CANCEL
+ ßANCEL
+
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ ID
+ ßD
+
+
+
+ ConfirmTreatmentTable
+
+
+ New Treatment
+ ßew Treatment
+
+
+
+ PRESCRIPTION
+ ßRESCRIPTION
+
+
+
+ OPERATING PARAMETERS
+ ßPERATING PARAMETERS
+
+
+
+ Blood Flow Rate
+ ßlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ ßialysate Flow Rate
+
+
+
+ Duration
+ ßuration
+
+
+
+ Heparin Dispensing Rate
+ ßeparin Dispensing Rate
+
+
+
+ Heparin Bolus Volume
+ ßeparin Bolus Volume
+
+
+
+ Heparin Stop Time
+ ßeparin Stop Time
+
+
+
+ Saline Bolus Volume
+ ßaline Bolus Volume
+
+
+
+ Heparin Type
+ ßeparin Type
+
+
+
+ Acid Concentrate
+ ßcid Concentrate
+
+
+
+ Bicarbonate Concentrate
+ ßicarbonate Concentrate
+
+
+
+ Dialyzer Type
+ ßialyzer Type
+
+
+
+ Dialysate Temperature
+ ßialysate Temperature
+
+
+
+ Blood Pressure Measure Interval
+ ßlood Pressure Measure Interval
+
+
+
+ Device::DeviceController
+
+
+ %1 - Device or resource busy (%2)
+ ß1 - Device or resource busy (%2)
+
+
+
+ %1 - %2 (%3 , %4)
+ ß1 - %2 (%3 , %4)
+
+
+
+ Encrypted Partition %1 started.
+ ßncrypted Partition %1 started.
+
+
+
+ Factory Reset started.
+ ßactory Reset started.
+
+
+
+ Decommissioning started.
+ ßecommissioning started.
+
+
+
+ USB unmount started.
+ ßSB unmount started.
+
+
+
+ USB mount started
+ ßSB mount started
+
+
+
+ Device::DeviceError
+
+
+ The device script abnormal exit.
+ ßhe device script abnormal exit.
+
+
+
+ The device script file is not found.
+ ßhe device script file is not found.
+
+
+
+ The device script file is not executable.
+ ßhe device script file is not executable.
+
+
+
+ The request is already in progress.
+ ßhe request is already in progress.
+
+
+
+ The requested value is out of range.
+ ßhe requested value is out of range.
+
+
+
+ The requested value is incorrect.
+ ßhe requested value is incorrect.
+
+
+
+ The response value is incorrect.
+ ßhe response value is incorrect.
+
+
+
+ The watch file cannot be created.
+ ßhe watch file cannot be created.
+
+
+
+ The watch file is not found.
+ ßhe watch file is not found.
+
+
+
+ The watch file cannot be added.
+ ßhe watch file cannot be added.
+
+
+
+ The Bluetooth cuff pair clear error.
+ ßhe Bluetooth cuff pair clear error.
+
+
+
+ The Bluetooth cuff pair query error.
+ ßhe Bluetooth cuff pair query error.
+
+
+
+ No paired Bluetooth cuff found.
+ ßo paired Bluetooth cuff found.
+
+
+
+ The Bluetooth cuff pair invalid address.
+ ßhe Bluetooth cuff pair invalid address.
+
+
+
+ The Encrypted Partition error.
+ ßhe Encrypted Partition error.
+
+
+
+ DiagnosticsDialog
+
+
+ ROP
+ ßROP
+
+
+
+ DRP
+ ßDRP
+
+
+
+ Prssr
+ ßPrssr
+
+
+
+ Rsrvr
+ ßRsrvr
+
+
+
+ Heatrs
+ ßHeatrs
+
+
+
+ CANerr: %1
+ ßANerr: %1
+
+
+
+ LoadCl
+ ßLoadCl
+
+
+
+ Tmprtr
+ ßTmprtr
+
+
+
+ Conduct
+ ßConduct
+
+
+
+ Air Status
+ ßir Status
+
+
+
+ DG Mode
+ ßDG Mode
+
+
+
+ BP
+ ßBP
+
+
+
+ DPi
+ ßDPi
+
+
+
+ UF/DPo
+ ßUF/DPo
+
+
+
+ Prsr Oc
+ ßPrsr Oc
+
+
+
+ Syringe
+ ßSyringe
+
+
+
+ HD Mode
+ ßHD Mode
+
+
+
+ Vlv
+ ßlv
+
+
+
+ BLD
+ ßBLD
+
+
+
+ Alarms
+ ßAlarms
+
+
+
+ PreTx States
+ ßPreTx States
+
+
+
+ DisinfectStack
+
+
+ Disinfection
+ ßisinfection
+
+
+
+ Water Flush
+ ßater Flush
+
+
+
+ Heat Disinfect with Active Cool
+ ßeat Disinfect with Active Cool
+
+
+
+ Chemical Disinfect
+ ßhemical Disinfect
+
+
+
+ Chemical Flush
+ ßhemical Flush
+
+
+
+ RO Permeate Sample
+ ßO Permeate Sample
+
+
+
+ Heat Disinfect
+ ßeat Disinfect
+
+
+
+ EndTreatmentAdditional
+
+
+ Saline Bolus
+ ßaline Bolus
+
+
+
+ EndTreatmentEndStack
+
+
+ Treatment Complete
+ ßreatment Complete
+
+
+
+ START RINSEBACK
+ ßTART RINSEBACK
+
+
+
+ Treatment Complete Paused
+ ßreatment Complete Paused
+
+
+
+ EndTreatmentRecirculateStack
+
+
+ BACK TO RECIRCULATE
+ ßACK TO RECIRCULATE
+
+
+
+ END TREATMENT
+ ßND TREATMENT
+
+
+
+ RESUME TREATMENT
+ ßESUME TREATMENT
+
+
+
+ Recirculate Disconnect
+ ßecirculate Disconnect
+
+
+
+ Recirculate
+ ßecirculate
+
+
+
+ Recirculate Stopped
+ ßecirculate Stopped
+
+
+
+ Recirculate Reconnect
+ ßecirculate Reconnect
+
+
+
+ EndTreatmentRinseback
+
+
+ Rinseback
+ ßinseback
+
+
+
+ End
+ ßnd
+
+
+
+ Decelerate
+ ßecelerate
+
+
+
+ Resume
+ ßesume
+
+
+
+ Pause
+ ßause
+
+
+
+ Accelerate
+ ßccelerate
+
+
+
+ EndTreatmentRinsebackComplete
+
+
+ Rinseback Complete
+ ßinseback Complete
+
+
+
+ END TREATMENT
+ ßND TREATMENT
+
+
+
+ RECIRCULATE
+ ßECIRCULATE
+
+
+
+ SALINE BOLUS
+ ßALINE BOLUS
+
+
+
+ (50mL)
+ ß50mL)
+
+
+
+ EndTreatmentRinsebackInit
+
+
+ Rinseback Setup
+ ßinseback Setup
+
+
+
+ END TREATMENT
+ ßND TREATMENT
+
+
+
+ START RINSEBACK
+ ßTART RINSEBACK
+
+
+
+ EndTreatmentRinsebackReconnect
+
+
+ Rinseback Reconnect
+ ßinseback Reconnect
+
+
+
+ END TREATMENT
+ ßND TREATMENT
+
+
+
+ ExportButton
+
+
+ Export
+ ßxport
+
+
+
+ MainHome
+
+
+ CREATE TREATMENT
+ ßREATE TREATMENT
+
+
+
+ MainStack
+
+
+ SERVICE MODE
+ ßERVICE MODE
+
+
+
+ ManagerStack
+
+
+ Treatment Management
+ ßreatment Management
+
+
+
+ NotificationBar
+
+
+ ID
+ ßD
+
+
+
+ NotificationDialog
+
+
+ Notification
+ ßotification
+
+
+
+ RESUME
+ ßESUME
+
+
+
+ RINSEBACK
+ ßINSEBACK
+
+
+
+ END TREATMENT
+ ßND TREATMENT
+
+
+
+ OK
+ ßK
+
+
+
+ ID
+ ßD
+
+
+
+ PostTreatmentBase
+
+
+ Disconnection
+ ßisconnection
+
+
+
+ Review
+ ßeview
+
+
+
+ Disposables
+ ßisposables
+
+
+
+ Disinfection
+ ßisinfection
+
+
+
+ PostTreatmentReview
+
+
+ NEXT
+ ßEXT
+
+
+
+ Code:
+ ßode:
+
+
+
+ PostTreatmentStack
+
+
+ Patient Disconnection
+ ßatient Disconnection
+
+
+
+ Treatment Review
+ ßreatment Review
+
+
+
+ Disposables Removal
+ ßisposables Removal
+
+
+
+ PowerItem
+
+
+ Cannot shutdown during 'Treatment'
+ ßannot shutdown during 'Treatment'
+
+
+
+ System is shutting down
+ ßystem is shutting down
+
+
+
+ PreTreatmentBase
+
+
+ Create
+ ßreate
+
+
+
+ Sample
+ ßample
+
+
+
+ Consumables
+ ßonsumables
+
+
+
+ Disposables
+ ßisposables
+
+
+
+ Prime
+ ßrime
+
+
+
+ BP/HR
+ ßP/HR
+
+
+
+ Ultrafiltration
+ ßltrafiltration
+
+
+
+ Connection
+ ßonnection
+
+
+
+ Start
+ ßtart
+
+
+
+ PreTreatmentConfirm
+
+
+ Code:
+ ßode:
+
+
+
+ PreTreatmentConnectionStack
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ BP/HR
+ ßP/HR
+
+
+
+ CONNECTION
+ ßONNECTION
+
+
+
+ Press CONNECTION to pair a Bluetooth Pressure Measurement Cuff.
+ ßress CONNECTION to pair a Bluetooth Pressure Measurement Cuff.
+
+
+
+ Press START on Blood Pressure Measurement Cuff to display reading or enter vitals manually
+ ßress START on Blood Pressure Measurement Cuff to display reading or enter vitals manually
+
+
+
+ Bluetooth Cuff
+ ßluetooth Cuff
+
+
+
+ Ultrafiltration Setup
+ ßltrafiltration Setup
+
+
+
+ Patient Connection
+ ßatient Connection
+
+
+
+ CONTINUE
+ ßONTINUE
+
+
+
+ Start Treatment
+ ßtart Treatment
+
+
+
+ START
+ ßTART
+
+
+
+ PreTreatmentConsumablesStack
+
+
+ Consumables Installation
+ ßonsumables Installation
+
+
+
+ Consumables Self Test
+ ßonsumables Self Test
+
+
+
+ Self Test Complete!
+ ßelf Test Complete!
+
+
+
+ BiCarb Pump Check
+ ßiCarb Pump Check
+
+
+
+ Acid Pump Check
+ ßcid Pump Check
+
+
+
+ PreTreatmentCreate
+
+
+ RESET
+ ßESET
+
+
+
+ PREPOPULATE
+ ßREPOPULATE
+
+
+
+ PRESCRIPTION
+ ßRESCRIPTION
+
+
+
+ Blood Flow Rate
+ ßlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ ßialysate Flow Rate
+
+
+
+ Duration
+ ßuration
+
+
+
+ Heparin Dispensing Rate
+ ßeparin Dispensing Rate
+
+
+
+
+
+
+
+
+ OFF
+ ßFF
+
+
+
+
+
+ ON
+ ßN
+
+
+
+ Heparin Bolus Volume
+ ßeparin Bolus Volume
+
+
+
+ Heparin Stop Time
+ ßeparin Stop Time
+
+
+
+ Saline Bolus
+ ßaline Bolus
+
+
+
+ OPERATING PARAMETERS
+ ßPERATING PARAMETERS
+
+
+
+ Heparin Type
+ ßeparin Type
+
+
+
+ Acid Concentrate
+ ßcid Concentrate
+
+
+
+ Bicarbonate Concentrate
+ ßicarbonate Concentrate
+
+
+
+ Dialyzer Type
+ ßialyzer Type
+
+
+
+ Dialysate Temperature
+ ßialysate Temperature
+
+
+
+ Blood Pressure Measurement Interval
+ ßlood Pressure Measurement Interval
+
+
+
+ PreTreatmentCreateStack
+
+
+ Patient ID
+ ßatient ID
+
+
+
+
+ CONTINUE
+ ßONTINUE
+
+
+
+ SKIP
+ ßKIP
+
+
+
+ Create a Custom Treatment
+ ßreate a Custom Treatment
+
+
+
+ Confirm Treatment
+ ßonfirm Treatment
+
+
+
+ PreTreatmentDisposablesStack
+
+
+ System Self Test
+ ßystem Self Test
+
+
+
+ Cartridge Installation
+ ßartridge Installation
+
+
+
+
+
+ NEXT
+ ßEXT
+
+
+
+ Cartridge Connection
+ ßartridge Connection
+
+
+
+ Heparin Syringe
+ ßeparin Syringe
+
+
+
+ Saline Bag
+ ßaline Bag
+
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ PreTreatmentPrimeStack
+
+
+ Begin Prime
+ ßegin Prime
+
+
+
+ Self Test Complete!
+ ßelf Test Complete!
+
+
+
+ Occlusion Sensor Check
+ ßcclusion Sensor Check
+
+
+
+ Cartridge Install Checks
+ ßartridge Install Checks
+
+
+
+ Pressure Leak Check
+ ßressure Leak Check
+
+
+
+ Priming Heparin Line
+ ßriming Heparin Line
+
+
+
+ Syringe Pump Occlusion Check
+ ßyringe Pump Occlusion Check
+
+
+
+ CONTINUE
+ ßONTINUE
+
+
+
+ Priming
+ ßriming
+
+
+
+ Priming Complete!
+ ßriming Complete!
+
+
+
+ Start Prime
+ ßtart Prime
+
+
+
+ Blood Circuit Priming
+ ßlood Circuit Priming
+
+
+
+ Dialysate Circuit Priming
+ ßialysate Circuit Priming
+
+
+
+ Wet Self Tests
+ ßet Self Tests
+
+
+
+ PreTreatmentUltrafiltration
+
+
+ Ultrafiltration Volume
+ ßltrafiltration Volume
+
+
+
+ PreTreatmentWaterSampleStack
+
+
+ Flushing Carbon Filters for Water Sample
+ ßlushing Carbon Filters for Water Sample
+
+
+
+ NEXT
+ ßEXT
+
+
+
+ Water Sample
+ ßater Sample
+
+
+
+ WATER SAMPLE
+ ßATER SAMPLE
+
+
+
+ Water Sample Result
+ ßater Sample Result
+
+
+
+ FAIL
+ ßAIL
+
+
+
+ PASS
+ ßASS
+
+
+
+ Water Sample Result Failed
+ ßater Sample Result Failed
+
+
+
+ OK
+ ßK
+
+
+
+ PressureRangeSlider
+
+
+ LOW
+ ßOW
+
+
+
+ HIGH
+ ßIGH
+
+
+
+ QObject
+
+
+ Application terminated by SIGINT
+ ßpplication terminated by SIGINT
+
+
+
+ Application terminated by SIGTERM
+ ßpplication terminated by SIGTERM
+
+
+
+ Unknown device error %2 [%1]
+ ßnknown device error %2 [%1]
+
+
+
+ Device error [%1]
+ ßevice error [%1]
+
+
+
+ Removed previously paired device(s).
+ ßemoved previously paired device(s).
+
+
+
+ The Encrypt Partition Command Complete.
+ ßhe Encrypt Partition Command Complete.
+
+
+
+ Paired BCuff Query %1 %2
+ ßaired BCuff Query %1 %2
+
+
+
+ The Factory Reset Command Complete.
+ ßhe Factory Reset Command Complete.
+
+
+
+ The Decommissioning Command Complete.
+ ßhe Decommissioning Command Complete.
+
+
+
+ The USB (un)mount Command Complete.
+ ßhe USB (un)mount Command Complete.
+
+
+
+ Indication for when no alarms is a possible situation.
+ ßndication for when no alarms is a possible situation.
+
+
+
+ HD stuck button POST failure.
+Stop or Off button detected to be pressed for at least 1 second during test shortly after power up.
+ ßD stuck button POST failure.
+Stop or Off button detected to be pressed for at least 1 second during test shortly after power up.
+
+
+
+ HD FPGA POST failure.
+ ßD FPGA POST failure.
+
+
+
+ DG FPGA POST failure.
+ ßG FPGA POST failure.
+
+
+
+ HD Watchdog POST failure.
+ ßD Watchdog POST failure.
+
+
+
+ DG Watchdog POST failure.
+ ßG Watchdog POST failure.
+
+
+
+ HD UI communication POST failure.
+UI failed to communicate within a reasonable time after power up.
+ ßD UI communication POST failure.
+UI failed to communicate within a reasonable time after power up.
+
+
+
+ HD RTC battery low.
+ ßD RTC battery low.
+
+
+
+ HD accelerometer failed POST.
+ ßD accelerometer failed POST.
+
+
+
+ DG accelerometer failed POST.
+ ßG accelerometer failed POST.
+
+
+
+ HD blood leak sensor setting embedded mode failure.
+ ßD blood leak sensor setting embedded mode failure.
+
+
+
+ HD dialysate temperature below target temperature or below safety temp.
+ ßD dialysate temperature below target temperature or below safety temp.
+
+
+
+ HD firmware image integrity POST test failed.
+ ßD firmware image integrity POST test failed.
+
+
+
+ DG firmware image integrity POST test failed.
+ ßG firmware image integrity POST test failed.
+
+
+
+ DG invalid usage record CRC.
+ ßG invalid usage record CRC.
+
+
+
+ HD dialysate temperature above high safety.
+ ßD dialysate temperature above high safety.
+
+
+
+ HD alarm audio failed POST.
+ ßD alarm audio failed POST.
+
+
+
+ HD UI POST failed.
+ ßD UI POST failed.
+
+
+
+ HD didn't get ACK on message to DG that required acknowledgment.
+ ßD didn't get ACK on message to DG that required acknowledgment.
+
+
+
+ HD dialysate temperature above target temperature.
+ ßD dialysate temperature above target temperature.
+
+
+
+ DG conductivity sensors invalid calibration record.
+ ßG conductivity sensors invalid calibration record.
+
+
+
+ DG drain line volume invalid calibration record.
+ ßG drain line volume invalid calibration record.
+
+
+
+ DG reservoirs invalid calibration record.
+ ßG reservoirs invalid calibration record.
+
+
+
+ DG acid concentrate calibration record.
+ ßG acid concentrate calibration record.
+
+
+
+ DG bicarb concentrate calibration record.
+ ßG bicarb concentrate calibration record.
+
+
+
+ DG accelerometer invalid calibration record.
+ ßG accelerometer invalid calibration record.
+
+
+
+ HD accelerometer invalid calibration record.
+ ßD accelerometer invalid calibration record.
+
+
+
+ HD blood leak sensor zero and self test sequence failed.
+ ßD blood leak sensor zero and self test sequence failed.
+
+
+
+ DG two wire sensors FPGA fault.
+ ßG two wire sensors FPGA fault.
+
+
+
+ HD heparin force sensor invalid calibration record.
+ ßD heparin force sensor invalid calibration record.
+
+
+
+ HD Software fault.
+Software found itself in an unexpected state.
+ ßD Software fault.
+Software found itself in an unexpected state.
+
+
+
+ HD blood pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ßD blood pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD blood pump failed motor off check.
+Measured speed while commanded off.
+ ßD blood pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD blood pump failed motor direction check.
+Measured vs commanded.
+ ßD blood pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD blood pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ßD blood pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ HD dialysis inlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ßD dialysis inlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD dialysis inlet pump failed motor off check.
+Measured speed while commanded off.
+ ßD dialysis inlet pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD dialysis inlet pump failed motor direction check.
+Measured vs commanded.
+ ßD dialysis inlet pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD dialysis inlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ßD dialysis inlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ HD dialysis outlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ßD dialysis outlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD dialysis outlet pump failed motor off check.
+Measured speed while commanded off.
+ ßD dialysis outlet pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD dialysis outlet pump failed motor direction check.
+Measured vs commanded.
+ ßD dialysis outlet pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD dialysis outlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ßD dialysis outlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ DG main primary heater FPGA fault.
+ ßG main primary heater FPGA fault.
+
+
+
+ HD UI communication timeout.
+ ßD UI communication timeout.
+
+
+
+ HD too many bad communications CRC.
+ ßD too many bad communications CRC.
+
+
+
+ HD didn't get ACK on message to UI that required acknowledgment.
+ ßD didn't get ACK on message to UI that required acknowledgment.
+
+
+
+ DG maximum RO Pump PWM exceeded.
+ ßG maximum RO Pump PWM exceeded.
+
+
+
+ HD ultrafiltration volume accuracy error during treatment.
+ ßD ultrafiltration volume accuracy error during treatment.
+
+
+
+ HD FPGA communication down for too long.
+ ßD FPGA communication down for too long.
+
+
+
+ DG FPGA not accepting commanded valve states.
+ ßG FPGA not accepting commanded valve states.
+
+
+
+ HD blood pump failed motor speed check.
+Measured vs commanded.
+ ßD blood pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD dialysate inlet pump failed motor speed check.
+Measured vs commanded.
+ ßD dialysate inlet pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD dialysate outlet pump failed motor speed check.
+Measured vs commanded.
+ ßD dialysate outlet pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD critical data integrity check failed.
+ ßD critical data integrity check failed.
+
+
+
+ DG critical data integrity check failed.
+ ßG critical data integrity check failed.
+
+
+
+ HD accelerometer error (no readings or FPGA reports error).
+ ßD accelerometer error (no readings or FPGA reports error).
+
+
+
+ DG accelerometer error (no readings or FPGA reports error).
+ ßG accelerometer error (no readings or FPGA reports error).
+
+
+
+ HD valve homing failed.
+ ßD valve homing failed.
+
+
+
+ HD valve transition time out.
+ ßD valve transition time out.
+
+
+
+ HD valve not functional.
+ ßD valve not functional.
+
+
+
+ HD valve current out of range.
+ ßD valve current out of range.
+
+
+
+ HD valve position out of target.
+ ßD valve position out of target.
+
+
+
+ HD syringe pump prime timeout.
+ ßD syringe pump prime timeout.
+
+
+
+ DG barometric pressure sensor out of range.
+ ßG barometric pressure sensor out of range.
+
+
+
+ HD DG requests DG command with invalid parameter fault.
+ ßD DG requests DG command with invalid parameter fault.
+
+
+
+ HD blood leak sensor set point set failure.
+ ßD blood leak sensor set point set failure.
+
+
+
+ HD blood pump occlusion self-test failure alarm.
+ ßD blood pump occlusion self-test failure alarm.
+
+
+
+ HD active reservoir recirculation out of range.
+ ßD active reservoir recirculation out of range.
+
+
+
+ HD blood leak sensor invalid calibration record.
+ ßD blood leak sensor invalid calibration record.
+
+
+
+ HD arterial pressure self-test failure alarm.
+ ßD arterial pressure self-test failure alarm.
+
+
+
+ HD venous pressure self-test failure alarm.
+ ßD venous pressure self-test failure alarm.
+
+
+
+ HD No load cell data message receive at least once every 2 seconds.
+ ßD No load cell data message receive at least once every 2 seconds.
+
+
+
+ HD No dialysate temperature data message receive at least once every 2 seconds.
+ ßD No dialysate temperature data message receive at least once every 2 seconds.
+
+
+
+ DG inlet UV reactor is on with no flow.
+ ßG inlet UV reactor is on with no flow.
+
+
+
+ HD syringe pump self-test failure alarm.
+ ßD syringe pump self-test failure alarm.
+
+
+
+ HD monitored voltage is out of range.
+ ßD monitored voltage is out of range.
+
+
+
+ DG monitored voltage is out of range.
+ ßG monitored voltage is out of range.
+
+
+
+ HD syringe pump direction (from encoder) error.
+ ßD syringe pump direction (from encoder) error.
+
+
+
+ HD syringe pump direction (from controller) error.
+ ßD syringe pump direction (from controller) error.
+
+
+
+ HD syringe pump fault reported by FPGA.
+ ßD syringe pump fault reported by FPGA.
+
+
+
+ HD syringe pump over travel error.
+ ßD syringe pump over travel error.
+
+
+
+ HD syringe pump DAC write failure.
+ ßD syringe pump DAC write failure.
+
+
+
+ HD syringe pump is running while the BP is off.
+ ßD syringe pump is running while the BP is off.
+
+
+
+ DG set RTC year is invalid.
+ ßG set RTC year is invalid.
+
+
+
+ HD pump track latch opened alarm.
+ ßD pump track latch opened alarm.
+
+
+
+ HD set RTC year is invalid.
+ ßD set RTC year is invalid.
+
+
+
+ DG heating invalid calibration record.
+ ßG heating invalid calibration record.
+
+
+
+ DG concentrate pumps hall sensor out of range.
+ ßG concentrate pumps hall sensor out of range.
+
+
+
+ DG outlet UV reactor on with no flow.
+ ßG outlet UV reactor on with no flow.
+
+
+
+
+ DG load cells A1/B1 FPGA fault.
+ ßG load cells A1/B1 FPGA fault.
+
+
+
+ HD No dialysate flow data receive in the last 3 seconds.
+ ßD No dialysate flow data receive in the last 3 seconds.
+
+
+
+ DG temperature sensors invalid calibration record.
+ ßG temperature sensors invalid calibration record.
+
+
+
+ DG outlet primary conductivity out of range.
+ ßG outlet primary conductivity out of range.
+
+
+
+ DG pressure out of range.
+ ßG pressure out of range.
+
+
+
+ DG watchdog expired.
+ ßG watchdog expired.
+
+
+
+ DG inlet water temperature in high range.
+ ßG inlet water temperature in high range.
+
+
+
+ DG fill conductivity out of range.
+ ßG fill conductivity out of range.
+
+
+
+ HD battery communication fault.
+ ßD battery communication fault.
+
+
+
+ HD syringe pump stall alarm.
+ ßD syringe pump stall alarm.
+
+
+
+ DG conductivity sensors invalid temperature compensation calibration record.
+ ßG conductivity sensors invalid temperature compensation calibration record.
+
+
+
+ UI POST HD communication failure.
+ ßI POST HD communication failure.
+
+
+
+ DG heat disinfect temperature gradient out of range.
+ ßG heat disinfect temperature gradient out of range.
+
+
+
+ HD invalid calibration CRC.
+ ßD invalid calibration CRC.
+
+
+
+ HD air trap level sensors reporting illegal combination of air/fluid.
+ ßD air trap level sensors reporting illegal combination of air/fluid.
+
+
+
+ DG invalid calibration CRC.
+ ßG invalid calibration CRC.
+
+
+
+ DG dialysate flow sensor invalid calibration record.
+ ßG dialysate flow sensor invalid calibration record.
+
+
+
+ HD reports DG restarted fault.
+ ßD reports DG restarted fault.
+
+
+
+ HD syringe pump ADC FPGA fault.
+ ßD syringe pump ADC FPGA fault.
+
+
+
+ HD syringe pump volume check error.
+ ßD syringe pump volume check error.
+
+
+
+ HD syringe pump speed check error.
+ ßD syringe pump speed check error.
+
+
+
+ HD syringe pump not stopped in off state error.
+ ßD syringe pump not stopped in off state error.
+
+
+
+ DG Drain pump current out of range.
+ ßG Drain pump current out of range.
+
+
+
+ HD venous air bubble detector self-test failure.
+ ßD venous air bubble detector self-test failure.
+
+
+
+ DG temperature sensor out of range.
+ ßG temperature sensor out of range.
+
+
+
+ HD UI SD card failure.
+ ßD UI SD card failure.
+
+
+
+ DG CAN message not acked.
+ ßG CAN message not acked.
+
+
+
+ DG RTC config error.
+ ßG RTC config error.
+
+
+
+ DG RTC battery low error.
+ ßG RTC battery low error.
+
+
+
+ HD pre-treatment mode wet self-test prime check failure.
+ ßD pre-treatment mode wet self-test prime check failure.
+
+
+
+ DG main primary heater voltage out of range.
+ ßG main primary heater voltage out of range.
+
+
+
+ DG small primary heater voltage out of range.
+ ßG small primary heater voltage out of range.
+
+
+
+ DG trimmer heater voltage out of range.
+ ßG trimmer heater voltage out of range.
+
+
+
+ HD end of treatment alarm (high priority).
+ ßD end of treatment alarm (high priority).
+
+
+
+ HD blood sitting too long after treatment stopped by user alarm (>5 min).
+ ßD blood sitting too long after treatment stopped by user alarm (>5 min).
+
+
+
+ HD blood leak detected alarm.
+ ßD blood leak detected alarm.
+
+
+
+ HD venous pressure too low during treatment.
+ ßD venous pressure too low during treatment.
+
+
+
+ HD venous air bubble detected alarm.
+ ßD venous air bubble detected alarm.
+
+
+
+ HD blood leak recovering please wait.
+ ßD blood leak recovering please wait.
+
+
+
+ HD venous pressure too high during treatment.
+ ßD venous pressure too high during treatment.
+
+
+
+ HD arterial pressure too low during treatment.
+ ßD arterial pressure too low during treatment.
+
+
+
+ HD arterial pressure too high during treatment.
+ ßD arterial pressure too high during treatment.
+
+
+
+ DG fluid leak detected alarm.
+ ßG fluid leak detected alarm.
+
+
+
+ HD fluid leak detected alarm.
+ ßD fluid leak detected alarm.
+
+
+
+ HD experienced large acceleration.
+ ßD experienced large acceleration.
+
+
+
+ DG experienced large acceleration.
+ ßG experienced large acceleration.
+
+
+
+ HD tilt exceeds maximum.
+ ßD tilt exceeds maximum.
+
+
+
+ DG tilt exceeds maximum.
+ ßG tilt exceeds maximum.
+
+
+
+ HD AC power lost alarm.
+ ßD AC power lost alarm.
+
+
+
+ HD DG communication timeout.
+ ßD DG communication timeout.
+
+
+
+ HD air trap fill timeout during treatment.
+ ßD air trap fill timeout during treatment.
+
+
+
+ HD blood pump occlusion detected.
+ ßD blood pump occlusion detected.
+
+
+
+ DG dialysate temperature sensors out of range.
+ ßG dialysate temperature sensors out of range.
+
+
+
+ DG cleaning mode inlet water conductivity out of high range.
+ ßG cleaning mode inlet water conductivity out of high range.
+
+
+
+ DG concentrate conductivity after adding acid out of range alarm.
+ ßG concentrate conductivity after adding acid out of range alarm.
+
+
+
+ DG RTC or timer accuracy failure.
+ ßG RTC or timer accuracy failure.
+
+
+
+ DG wait for the DG to produce dialysate.
+ ßG wait for the DG to produce dialysate.
+
+
+
+ DG Cleaning mode inlet water temperature too high.
+ ßG Cleaning mode inlet water temperature too high.
+
+
+
+ HD watchdog expired.
+ ßD watchdog expired.
+
+
+
+ DG inlet water conductivity in high range.
+ ßG inlet water conductivity in high range.
+
+
+
+ DG inlet water conductivity in low range.
+ ßG inlet water conductivity in low range.
+
+
+
+ DG inlet water pressure in low range.
+ ßG inlet water pressure in low range.
+
+
+
+ HD prime completed high priority alarm.
+ ßD prime completed high priority alarm.
+
+
+
+ DG cleaning mode inlet water conductivity out of low range.
+ ßG cleaning mode inlet water conductivity out of low range.
+
+
+
+ HD No reservoirs data message receive at least once every 2 seconds.
+ ßD No reservoirs data message receive at least once every 2 seconds.
+
+
+
+ HD No DG operation mode message receive at least once every 2 seconds.
+ ßD No DG operation mode message receive at least once every 2 seconds.
+
+
+
+ DG chemical disinfect prime acid line timeout.
+ ßG chemical disinfect prime acid line timeout.
+
+
+
+ DG inlet water temperature is in the low range.
+ ßG inlet water temperature is in the low range.
+
+
+
+ DG chemical disinfect flush remove acid and close the concentrate cap.
+ ßG chemical disinfect flush remove acid and close the concentrate cap.
+
+
+
+ HD blood pump rotor speed too high.
+ ßD blood pump rotor speed too high.
+
+
+
+ DG comm too many bad CRCs.
+ ßG comm too many bad CRCs.
+
+
+
+ DG FPGA clock speed check failure.
+ ßG FPGA clock speed check failure.
+
+
+
+ HD sees primary load cell for reservoir 1 change too much too fast.
+ ßD sees primary load cell for reservoir 1 change too much too fast.
+
+
+
+ HD sees primary load cell for reservoir 2 change too much too fast.
+ ßD sees primary load cell for reservoir 2 change too much too fast.
+
+
+
+ HD in treatment rinseback operation timeout.
+ ßD in treatment rinseback operation timeout.
+
+
+
+
+
+ Test alarm, clear top only.
+ ßest alarm, clear top only.
+
+
+
+ HD cartridge door opened alarm.
+ ßD cartridge door opened alarm.
+
+
+
+ DG Dialysate flow rate out of maximum range.
+ ßG Dialysate flow rate out of maximum range.
+
+
+
+ HD syringe empty alarm.
+ ßD syringe empty alarm.
+
+
+
+ HD syringe pump occlusion alarm.
+ ßD syringe pump occlusion alarm.
+
+
+
+ HD syringe pump not enough Heparin alarm.
+ ßD syringe pump not enough Heparin alarm.
+
+
+
+ HD RTC configuration error.
+ ßD RTC configuration error.
+
+
+
+ HD RTC or timer accuracy failure.
+ ßD RTC or timer accuracy failure.
+
+
+
+ HD pump direction status error.
+ ßD pump direction status error.
+
+
+
+ DG software fault.
+Software found itself in an unexpected state.
+ ßG software fault.
+Software found itself in an unexpected state.
+
+
+
+ HD communication timeout.
+ ßD communication timeout.
+
+
+
+ DG FPGA communication down for too long.
+ ßG FPGA communication down for too long.
+
+
+
+ DG RO flow out of maximum range.
+ ßG RO flow out of maximum range.
+
+
+
+ DG load cells weight out of range for tare.
+ ßG load cells weight out of range for tare.
+
+
+
+ DG load cells invalid calibration.
+ ßG load cells invalid calibration.
+
+
+
+ DG invalid load cell value.
+ ßG invalid load cell value.
+
+
+
+ DG inlet UV reactor not healthy.
+ ßG inlet UV reactor not healthy.
+
+
+
+ DG fan RPM out of range.
+ ßG fan RPM out of range.
+
+
+
+ DG concentrate pump fault.
+ ßG concentrate pump fault.
+
+
+
+ DG concentrate pump CP1 speed control error.
+ ßG concentrate pump CP1 speed control error.
+
+
+
+ DG concentrate pump CP2 speed control error.
+ ßG concentrate pump CP2 speed control error.
+
+
+
+ DG drain pump RPM out of range.
+ ßG drain pump RPM out of range.
+
+
+
+ DG drain pump off fault.
+ ßG drain pump off fault.
+
+
+
+ DG flow rate out of upper range.
+ ßG flow rate out of upper range.
+
+
+
+ DG flow rate out of lower range.
+ ßG flow rate out of lower range.
+
+
+
+ HD blood pump partial occlusion detected.
+ ßD blood pump partial occlusion detected.
+
+
+
+ DG RO pump duty cycle out of range.
+ ßG RO pump duty cycle out of range.
+
+
+
+ DG RO pump pressure out of range.
+ ßG RO pump pressure out of range.
+
+
+
+ DG CPi/CPo sensors FPGA fault.
+ ßG CPi/CPo sensors FPGA fault.
+
+
+
+ DG CD1/CD2 sensors FPGA fault.
+ ßG CD1/CD2 sensors FPGA fault.
+
+
+
+ DG RO flow too low while primary heater is on.
+ ßG RO flow too low while primary heater is on.
+
+
+
+ DG Dialysate flow too low while trimmer heater is on.
+ ßG Dialysate flow too low while trimmer heater is on.
+
+
+
+ DG thermistors/sensors temperature out of range.
+ ßG thermistors/sensors temperature out of range.
+
+
+
+ HD pre-treatment mode wet self-test lc vs FMD failure.
+ ßD pre-treatment mode wet self-test lc vs FMD failure.
+
+
+
+ HD pre-treatment mode dry pressure normal self-test failure.
+ ßD pre-treatment mode dry pressure normal self-test failure.
+
+
+
+ DG fill conductivities acid/bicarb invalid calibration record.
+ ßG fill conductivities acid/bicarb invalid calibration record.
+
+
+
+ DG RO rejection ratio out of range.
+ ßG RO rejection ratio out of range.
+
+
+
+ DG conductivity sensor fault.
+ ßG conductivity sensor fault.
+
+
+
+ DG dialysate fill runs out of time.
+ ßG dialysate fill runs out of time.
+
+
+
+ DG flow meter check failure alarm.
+ ßG flow meter check failure alarm.
+
+
+
+ HD venous pressure occlusion alarm.
+ ßD venous pressure occlusion alarm.
+
+
+
+ DG drain circulation line timeout.
+ ßG drain circulation line timeout.
+
+
+
+ HD battery pack detected an error.
+ ßD battery pack detected an error.
+
+
+
+ HD blood sitting too long warning (>4 min).
+ ßD blood sitting too long warning (>4 min).
+
+
+
+ HD end of treatment alarm (user not acting to end treatment).
+ ßD end of treatment alarm (user not acting to end treatment).
+
+
+
+ HD prime completed medium priority alarm.
+ ßD prime completed medium priority alarm.
+
+
+
+
+
+
+
+
+ Available for use.
+ ßvailable for use.
+
+
+
+ HD end treatment sub-mode timeout alarm.
+ ßD end treatment sub-mode timeout alarm.
+
+
+
+ HD syringe detected alarm.
+ ßD syringe detected alarm.
+
+
+
+ HD syringe pump syringe removed alarm.
+ ßD syringe pump syringe removed alarm.
+
+
+
+ DG THd sensors FPGA fault.
+ ßG THd sensors FPGA fault.
+
+
+
+ HD Saline bag is empty.
+ ßD Saline bag is empty.
+
+
+
+ HD occlusion sensor FPGA fault.
+ ßD occlusion sensor FPGA fault.
+
+
+
+ HD arterial sensor FPGA fault.
+ ßD arterial sensor FPGA fault.
+
+
+
+ HD treatment stopped by user action.
+ ßD treatment stopped by user action.
+
+
+
+ HD end of treatment warning.
+ ßD end of treatment warning.
+
+
+
+ HD prime completed low priority alarm.
+ ßD prime completed low priority alarm.
+
+
+
+ HD time out on prime saline purge air state.
+ ßD time out on prime saline purge air state.
+
+
+
+ HD prime dialysate dialyzer time out alarm.
+ ßD prime dialysate dialyzer time out alarm.
+
+
+
+ HD prime dialysate bypass time out alarm.
+ ßD prime dialysate bypass time out alarm.
+
+
+
+ HD pre-treatment mode dry pressure self-test failure.
+ ßD pre-treatment mode dry pressure self-test failure.
+
+
+
+ HD pre-treatment mode wet self-test LC vs LC failure.
+ ßD pre-treatment mode wet self-test LC vs LC failure.
+
+
+
+ DG barometric sensor coefficients bad CRC.
+ ßG barometric sensor coefficients bad CRC.
+
+
+
+ DG inlet water pressure in high range.
+ ßG inlet water pressure in high range.
+
+
+
+ HD in treatment stopped sub-mode after rinseback completed (no escalation).
+ ßD in treatment stopped sub-mode after rinseback completed (no escalation).
+
+
+
+ HD needs new cartridge to be installed.
+ ßD needs new cartridge to be installed.
+
+
+
+ HD no cartridge loaded or installed improperly alarm.
+ ßD no cartridge loaded or installed improperly alarm.
+
+
+
+ HD fail to remove cartridge alarm.
+ ßD fail to remove cartridge alarm.
+
+
+
+ DG bicarb conductivity out of range during bicarb pump check alarm.
+ ßG bicarb conductivity out of range during bicarb pump check alarm.
+
+
+
+ DG reservoir drain time out.
+ ßG reservoir drain time out.
+
+
+
+ DG reservoir fill time out.
+ ßG reservoir fill time out.
+
+
+
+ DG reservoir leak time out.
+ ßG reservoir leak time out.
+
+
+
+ DG cleaning mode temperature sensors difference out of range.
+ ßG cleaning mode temperature sensors difference out of range.
+
+
+
+ DG heat disinfect target temperature time out (could not reach to temperature).
+ ßG heat disinfect target temperature time out (could not reach to temperature).
+
+
+
+ DG cleaning mode conductivity sensors out of range.
+ ßG cleaning mode conductivity sensors out of range.
+
+
+
+
+ Alarm Id available.
+ ßlarm Id available.
+
+
+
+ DG chemical disinfect could not reach to target temperature out of range.
+ ßG chemical disinfect could not reach to target temperature out of range.
+
+
+
+ DG chemical disinfect target conductivity out of range.
+ ßG chemical disinfect target conductivity out of range.
+
+
+
+ DG chemical disinfect insert acid and remove the concentrate cap.
+ ßG chemical disinfect insert acid and remove the concentrate cap.
+
+
+
+ HD invalid system record.
+ ßD invalid system record.
+
+
+
+ HD invalid service record.
+ ßD invalid service record.
+
+
+
+ DG invalid system record.
+ ßG invalid system record.
+
+
+
+ DG invalid service record.
+ ßG invalid service record.
+
+
+
+ HD and UI software builds are not compatible.
+ ßD and UI software builds are not compatible.
+
+
+
+ HD processor is in Disinfect Chemical Flush mode.
+ ßD processor is in Disinfect Chemical Flush mode.
+
+
+
+ HD invalid institutional record.
+ ßD invalid institutional record.
+
+
+
+ HD UI POST OS version compatibility failure.
+ ßD UI POST OS version compatibility failure.
+
+
+
+ HD temperatures out of range.
+ ßD temperatures out of range.
+
+
+
+ HD UI POST Application Integrity (Sha256Sum) failure.
+ ßD UI POST Application Integrity (Sha256Sum) failure.
+
+
+
+ HD UI POST CANBus failure.
+ ßD UI POST CANBus failure.
+
+
+
+ HD UI POST Touch failure.
+ ßD UI POST Touch failure.
+
+
+
+ HD UI POST SD-Card failure.
+ ßD UI POST SD-Card failure.
+
+
+
+ HD UI POST RTC failure.
+ ßD UI POST RTC failure.
+
+
+
+ HD UI POST WiFi failure.
+ ßD UI POST WiFi failure.
+
+
+
+ HD UI POST Bluetooth failure.
+ ßD UI POST Bluetooth failure.
+
+
+
+ HD UI POST Ethernet failure.
+ ßD UI POST Ethernet failure.
+
+
+
+ HD UI POST Sound failure.
+ ßD UI POST Sound failure.
+
+
+
+ HD POST Safety Shutdown failure.
+ ßD POST Safety Shutdown failure.
+
+
+
+ DG POST Safety Shutdown failure.
+ ßG POST Safety Shutdown failure.
+
+
+
+ HD Fan RPM out of range.
+ ßD Fan RPM out of range.
+
+
+
+ DG inactive reservoir weight out of range.
+ ßG inactive reservoir weight out of range.
+
+
+
+ HD arterial pressure sensor is reading out of range.
+ ßD arterial pressure sensor is reading out of range.
+
+
+
+ HD venous pressure sensor is reading out of range.
+ ßD venous pressure sensor is reading out of range.
+
+
+
+ HD BP occlusion sensor is reading out of range.
+ ßD BP occlusion sensor is reading out of range.
+
+
+
+ HD active reservoir weight out of range.
+ ßD active reservoir weight out of range.
+
+
+
+ DG dialysate drain time out.
+ ßG dialysate drain time out.
+
+
+
+ DG drain pump direction invalid.
+ ßG drain pump direction invalid.
+
+
+
+ Acid concentration bottle low volume alarm.
+ ßcid concentration bottle low volume alarm.
+
+
+
+ Bicarbonate concentration bottle low volume alarm.
+ ßicarbonate concentration bottle low volume alarm.
+
+
+
+ DG load cells weight out of range.
+ ßG load cells weight out of range.
+
+
+
+ DG load cells primary/back up drift out of range.
+ ßG load cells primary/back up drift out of range.
+
+
+
+ HD processor is in RO permeate sample mode.
+ ßD processor is in RO permeate sample mode.
+
+
+
+ DG concentrate cap not in proper position.
+ ßG concentrate cap not in proper position.
+
+
+
+ HD processor clock speed checks against FPGA clock failure.
+ ßD processor clock speed checks against FPGA clock failure.
+
+
+
+ HD load cells primary/back up drift out of range.
+ ßD load cells primary/back up drift out of range.
+
+
+
+ DG dialysate cap not closed.
+ ßG dialysate cap not closed.
+
+
+
+ HD venous pressure sensor FPGA fault.
+ ßD venous pressure sensor FPGA fault.
+
+
+
+ HD processor is in Disinfect Flush mode.
+ ßD processor is in Disinfect Flush mode.
+
+
+
+ HD processor is in Disinfect Heat mode.
+ ßD processor is in Disinfect Heat mode.
+
+
+
+ HD processor is in Disinfect Chemical mode.
+ ßD processor is in Disinfect Chemical mode.
+
+
+
+ HD processor is in Disinfect active cool mode.
+ ßD processor is in Disinfect active cool mode.
+
+
+
+ HD UI POST CloudSync failure.
+ ßD UI POST CloudSync failure.
+
+
+
+ DG TDi sensors FPGA fault.
+ ßG TDi sensors FPGA fault.
+
+
+
+ DG TRo sensors FPGA fault.
+ ßG TRo sensors FPGA fault.
+
+
+
+ DG baro sensor FPGA fault.
+ ßG baro sensor FPGA fault.
+
+
+
+ DG invalid serial number.
+ ßG invalid serial number.
+
+
+
+ HD invalid serial number.
+ ßD invalid serial number.
+
+
+
+ DG RO permeate sample remove the dialysate cap.
+ ßG RO permeate sample remove the dialysate cap.
+
+
+
+ DG processor RAM error.
+ ßG processor RAM error.
+
+
+
+ DG drain pump direction FPGA fault.
+ ßG drain pump direction FPGA fault.
+
+
+
+ HD invalid usage record.
+ ßD invalid usage record.
+
+
+
+ HD processor RAM error.
+ ßD processor RAM error.
+
+
+
+ DG turn off inlet water valves.
+ ßG turn off inlet water valves.
+
+
+
+ HD AC power lost second alarm.
+ ßD AC power lost second alarm.
+
+
+
+ DG CPi conductivity sensor invalid character received.
+ ßG CPi conductivity sensor invalid character received.
+
+
+
+ DG CPo conductivity sensor invalid character received.
+ ßG CPo conductivity sensor invalid character received.
+
+
+
+ DG CD1 conductivity sensor invalid character received.
+ ßG CD1 conductivity sensor invalid character received.
+
+
+
+ DG CD2 conductivity sensor invalid character received.
+ ßG CD2 conductivity sensor invalid character received.
+
+
+
+ HD Dialysate In flow rate to too low.
+ ßD Dialysate In flow rate to too low.
+
+
+
+ DG cleaning mode inlet water temperature too low.
+ ßG cleaning mode inlet water temperature too low.
+
+
+
+ DG cleaning mode inlet water pressure too high.
+ ßG cleaning mode inlet water pressure too high.
+
+
+
+ DG cleaning mode inlet water pressure too low.
+ ßG cleaning mode inlet water pressure too low.
+
+
+
+
+ Alarm available.
+ ßlarm available.
+
+
+
+ Alarm available for use.
+ ßlarm available for use.
+
+
+
+ DG chemical disinfect flush flush sample.
+ ßG chemical disinfect flush flush sample.
+
+
+
+ DG chemical disinfect flush sample timeout.
+ ßG chemical disinfect flush sample timeout.
+
+
+
+ DG outlet UV reactor not healthy.
+ ßG outlet UV reactor not healthy.
+
+
+
+ HD UI POST Year check failure.
+ ßD UI POST Year check failure.
+
+
+
+ HD UI POST Configuration check failure.
+ ßD UI POST Configuration check failure.
+
+
+
+ Total number of alarms.
+ ßotal number of alarms.
+
+
+
+ ALARM_ID_UNDEFINED [%1]
+ ßLARM_ID_UNDEFINED [%1]
+
+
+
+ SDCProgressItem
+
+
+ SD
+ ßD
+
+
+
+ SettingsBluetoothCuff
+
+
+ Devices
+ ßevices
+
+
+
+ SCAN
+ ßCAN
+
+
+
+ SettingsDGCleaning
+
+
+ Last Basic Flush Complete
+ ßast Basic Flush Complete
+
+
+
+ Last Chemical Disinfect Start
+ ßast Chemical Disinfect Start
+
+
+
+ Last Chemical Disinfect Complete
+ ßast Chemical Disinfect Complete
+
+
+
+ Last Chemical Disinfect Flush Complete
+ ßast Chemical Disinfect Flush Complete
+
+
+
+ Last Heat Disinfect Complete
+ ßast Heat Disinfect Complete
+
+
+
+ Proceed to Cleaning Mode
+ ßroceed to Cleaning Mode
+
+
+
+ SettingsDGScheduling
+
+
+ Water Flush
+ ßater Flush
+
+
+
+
+ Cycle (Days)
+ ßycle (Days)
+
+
+
+ Heat Disinfection
+ ßeat Disinfection
+
+
+
+ SettingsDateTime
+
+
+ Time (HH:MM)
+ ßime (HH:MM)
+
+
+
+ :
+ ß
+
+
+
+ Date (MM/DD/YYYY)
+ ßate (MM/DD/YYYY)
+
+
+
+
+ /
+ ß
+
+
+
+ SettingsDecommission
+
+
+ Do you want to perform the %1?
+ ßo you want to perform the %1?
+
+
+
+ Please wait ...
+ ßlease wait ...
+
+
+
+ SettingsDeviceRegistration
+
+
+ UI Version
+ ßI Version
+
+
+
+ HD Serial
+ ßD Serial
+
+
+
+ DG Serial
+ ßG Serial
+
+
+
+ Wireless
+ ßireless
+
+
+
+ Ethernet
+ ßthernet
+
+
+
+ Registration complete
+ ßegistration complete
+
+
+
+ Cloud Service is running
+ ßloud Service is running
+
+
+
+ Registering the device
+ ßegistering the device
+
+
+
+ START
+ ßTART
+
+
+
+ No Network Connection
+ ßo Network Connection
+
+
+
+ No device Serial
+ ßo device Serial
+
+
+
+ SettingsExportLogs
+
+
+ SD-Card
+ ßD-Card
+
+
+
+ USB Drive
+ ßSB Drive
+
+
+
+ Application
+ ßpplication
+
+
+
+ Service
+ ßervice
+
+
+
+ Treatment
+ ßreatment
+
+
+
+ log export to USB in progress ...
+ ßog export to USB in progress ...
+
+
+
+ log export to USB is complete
+ ßog export to USB is complete
+
+
+
+ SettingsFactoryReset
+
+
+ Do you want to perform the %1?
+ ßo you want to perform the %1?
+
+
+
+ Please wait ...
+ ßlease wait ...
+
+
+
+ SettingsHome
+
+
+ Clear Alarm Condition
+ ßlear Alarm Condition
+
+
+
+ SettingsInformation
+
+
+ Versions
+ ßersions
+
+
+
+ OS Version
+ ßS Version
+
+
+
+ UI Version
+ ßI Version
+
+
+
+ HD Version
+ ßD Version
+
+
+
+ HD FPGA Version
+ ßD FPGA Version
+
+
+
+ HD Serial Number
+ ßD Serial Number
+
+
+
+ DG Version
+ ßG Version
+
+
+
+ DG FPGA Version
+ ßG FPGA Version
+
+
+
+ DG Serial Number
+ ßG Serial Number
+
+
+
+ Service
+ ßervice
+
+
+
+ HD Last Service Date
+ ßD Last Service Date
+
+
+
+ HD Next Service Date
+ ßD Next Service Date
+
+
+
+ DG Last Service Date
+ ßG Last Service Date
+
+
+
+ DG Next Service Date
+ ßG Next Service Date
+
+
+
+ Treatment
+ ßreatment
+
+
+
+ Total Hours
+ ßotal Hours
+
+
+
+ Hours Since Last Service
+ ßours Since Last Service
+
+
+
+ Last Start
+ ßast Start
+
+
+
+ Last Reset
+ ßast Reset
+
+
+
+ SettingsLocalization
+
+
+ Language
+ ßanguage
+
+
+
+ SettingsManufacturingSetup
+
+
+ Do you want to perform the %1?
+ ßo you want to perform the %1?
+
+
+
+ Please wait ...
+ ßlease wait ...
+
+
+
+ SettingsROInput
+
+
+ Pure Water Mode
+ ßure Water Mode
+
+
+
+ ON
+ ßN
+
+
+
+ OFF
+ ßFF
+
+
+
+ SettingsRootSSHAccess
+
+
+ Enable SSH Login
+ ßnable SSH Login
+
+
+
+ Enable Root Login
+ ßnable Root Login
+
+
+
+ SettingsServicePassword
+
+
+ Set Service Password
+ ßet Service Password
+
+
+
+ Service Password
+ ßervice Password
+
+
+
+ Incorrect password
+ ßncorrect password
+
+
+
+ Mismatch Passwords
+ ßismatch Passwords
+
+
+
+ Invalid Password
+ ßnvalid Password
+
+
+
+ SettingsStack
+
+
+ Information
+ ßnformation
+
+
+
+ Volume And Brightness
+ ßolume And Brightness
+
+
+
+ Wi-Fi
+ ßi-Fi
+
+
+
+ Bluetooth Cuff
+ ßluetooth Cuff
+
+
+
+ DG Cleaning
+ ßG Cleaning
+
+
+
+ DG Scheduling
+ ßG Scheduling
+
+
+
+
+ Service
+ ßervice
+
+
+
+ Date and Time
+ ßate and Time
+
+
+
+ Export Logs
+ ßxport Logs
+
+
+
+ Language
+ ßanguage
+
+
+
+ Water Input Mode
+ ßater Input Mode
+
+
+
+ Calibration
+ ßalibration
+
+
+
+ Device Configuration
+ ßevice Configuration
+
+
+
+ Device Registration
+ ßevice Registration
+
+
+
+
+ Software Update
+ ßoftware Update
+
+
+
+ Enable Root SSH
+ ßnable Root SSH
+
+
+
+ Factory Reset
+ ßactory Reset
+
+
+
+ Decommissioning
+ ßecommissioning
+
+
+
+ Institutional Configurations
+ ßnstitutional Configurations
+
+
+
+ Manufacturing Setup
+ ßanufacturing Setup
+
+
+
+ Device Settings
+ ßevice Settings
+
+
+
+ COMPLETE
+ ßOMPLETE
+
+
+
+ SHUTDOWN
+ ßHUTDOWN
+
+
+
+
+ Application POST Failed, please shutdown and retry
+ ßpplication POST Failed, please shutdown and retry
+
+
+
+ SettingsVolumeBrightness
+
+
+ Brightness
+ ßrightness
+
+
+
+ Alarm Volume
+ ßlarm Volume
+
+
+
+ System Volume
+ ßystem Volume
+
+
+
+ %
+ ß
+
+
+
+ SettingsWiFi
+
+
+ IP Address
+ ßP Address
+
+
+
+ Gateway
+ ßateway
+
+
+
+ Subnet Mask
+ ßubnet Mask
+
+
+
+ DNS
+ ßNS
+
+
+
+ SSID
+ ßSID
+
+
+
+ SCAN
+ ßCAN
+
+
+
+ Not Supported
+ ßot Supported
+
+
+
+ Connected
+ ßonnected
+
+
+
+ Do you want to disconnect from `%1`?
+ ßo you want to disconnect from `%1`?
+
+
+
+ Join
+ ßoin
+
+
+
+ Password
+ ßassword
+
+
+
+ Disconnect
+ ßisconnect
+
+
+
+ Storage::Logger
+
+
+ The '%1' folder selected for the treatment reports
+ ßhe '%1' folder selected for the treatment reports
+
+
+
+ Initializing log clean up
+ ßnitializing log clean up
+
+
+
+ Remove Logs Ended: %1
+ ßemove Logs Ended: %1
+
+
+
+ Storage::TreatmentLog
+
+
+
+ NONE
+ ßONE
+
+
+
+
+
+
+ OFF
+ ßFF
+
+
+
+ mL/min
+ ßL/min
+
+
+
+ hour
+ ßour
+
+
+
+ min
+ ßin
+
+
+
+ mEq/L
+ ßEq/L
+
+
+
+ C
+ ß
+
+
+
+ L
+ ß
+
+
+
+ mL
+ ßL
+
+
+
+ IU/mL
+ ßU/mL
+
+
+
+ mL/hr
+ ßL/hr
+
+
+
+ mmHg
+ ßmHg
+
+
+
+ Patient ID
+ ßatient ID
+
+
+
+ Blood Flow Rate
+ ßlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ ßialysate Flow Rate
+
+
+
+ Treatment Duration
+ ßreatment Duration
+
+
+
+ Actual Treatment Duration
+ ßctual Treatment Duration
+
+
+
+ Acid ConcentrateType
+ ßcid ConcentrateType
+
+
+
+ Bicarbonate Concentrate Type
+ ßicarbonate Concentrate Type
+
+
+
+ Potassium Concentration
+ ßotassium Concentration
+
+
+
+ Calcium Concentration
+ ßalcium Concentration
+
+
+
+ Bicarbonate Concentration
+ ßicarbonate Concentration
+
+
+
+ Sodium Concentration
+ ßodium Concentration
+
+
+
+ Dialysate Temperature
+ ßialysate Temperature
+
+
+
+ Dialyzer Type
+ ßialyzer Type
+
+
+
+ Heparin Type
+ ßeparin Type
+
+
+
+ Heparin Concentration
+ ßeparin Concentration
+
+
+
+ Heparin Bolus Volume
+ ßeparin Bolus Volume
+
+
+
+ Heparin Dispense Rate
+ ßeparin Dispense Rate
+
+
+
+ Heparin Stop
+ ßeparin Stop
+
+
+
+ Heparin Delivered Volume
+ ßeparin Delivered Volume
+
+
+
+ Treatment Start DateTime
+ ßreatment Start DateTime
+
+
+
+ Treatment End DateTime
+ ßreatment End DateTime
+
+
+
+ Water Sample Test Result
+ ßater Sample Test Result
+
+
+
+ Dialysate Volume Used
+ ßialysate Volume Used
+
+
+
+ Prescribed UF Volume
+ ßrescribed UF Volume
+
+
+
+ Target UF Volume
+ ßarget UF Volume
+
+
+
+ Actual UF Volume
+ ßctual UF Volume
+
+
+
+ Prescribed UF Rate
+ ßrescribed UF Rate
+
+
+
+ Target UF Rate
+ ßarget UF Rate
+
+
+
+ Actual UF Rate
+ ßctual UF Rate
+
+
+
+ Saline Bolus Volume
+ ßaline Bolus Volume
+
+
+
+ TimeEntry
+
+
+ Time
+ ßime
+
+
+
+ :
+ ß
+
+
+
+ TreatmentAdjustmentDuration
+
+
+ TREATMENT DURATION
+ ßREATMENT DURATION
+
+
+
+ TreatmentAdjustmentFlow
+
+
+ FLOWS
+ ßLOWS
+
+
+
+ Blood Flow Rate
+ ßlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ ßialysate Flow Rate
+
+
+
+ TreatmentAdjustmentPressuresLimits
+
+
+ PRESSURES
+ ßRESSURES
+
+
+
+ Arterial Window
+ ßrterial Window
+
+
+
+ Venous Window
+ ßenous Window
+
+
+
+ Venous Asymmetric
+ ßenous Asymmetric
+
+
+
+ TreatmentAdjustmentUltrafiltrationConfirm
+
+
+ ULTRAFILTRATION VOLUME
+ ßLTRAFILTRATION VOLUME
+
+
+
+ To confirm new UF Volume (%1),
+select a treatment adjustment:
+ ßo confirm new UF Volume (%1),
+select a treatment adjustment:
+
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ %1 UF Rate
+ ß1 UF Rate
+
+
+
+ The rate %3 by %1 %2,
+the treatment duration remains the same.
+ ßhe rate %3 by %1 %2,
+the treatment duration remains the same.
+
+
+
+
+ UF Rate : %1 %2
+ ßF Rate : %1 %2
+
+
+
+ %1 Treatment Duration
+ ß1 Treatment Duration
+
+
+
+ The rate remains, the treatment
+duration %2 by %1 minutes.
+ ßhe rate remains, the treatment
+duration %2 by %1 minutes.
+
+
+
+ TreatmentAdjustmentUltrafiltrationEdit
+
+
+ ULTRAFILTRATION VOLUME
+ ßLTRAFILTRATION VOLUME
+
+
+
+ NEXT
+ ßEXT
+
+
+
+ TreatmentAdjustmentUltrafiltrationPaused
+
+
+ ULTRAFILTRATION VOLUME
+ ßLTRAFILTRATION VOLUME
+
+
+
+ EDIT ULTRAFILTRATION VOLUME
+ ßDIT ULTRAFILTRATION VOLUME
+
+
+
+ RESUME ULTRAFILTRATION
+ ßESUME ULTRAFILTRATION
+
+
+
+ TreatmentAdjustmentUltrafiltrationStart
+
+
+ ULTRAFILTRATION VOLUME
+ ßLTRAFILTRATION VOLUME
+
+
+
+ PAUSE ULTRAFILTRATION
+ ßAUSE ULTRAFILTRATION
+
+
+
+ Note: Ultrafiltration needs to be paused to edit the volume.
+ ßote: Ultrafiltration needs to be paused to edit the volume.
+
+
+
+ TreatmentBloodPrime
+
+
+ Blood Priming
+ ßlood Priming
+
+
+
+ TreatmentFlowBase
+
+
+ TreatmentFlowBase
+ ßreatmentFlowBase
+
+
+
+ TreatmentFlows
+
+
+ FLOWS
+ ßLOWS
+
+
+
+ Blood
+ ßlood
+
+
+
+ Dialysate
+ ßialysate
+
+
+
+ TreatmentFluid
+
+
+ FLUID MANAGEMENT
+ ßLUID MANAGEMENT
+
+
+
+ Volume Delivered
+ ßolume Delivered
+
+
+
+ (%1 %2)
+ ß%1 %2)
+
+
+
+ Cumulative Delivered
+ ßumulative Delivered
+
+
+
+ TreatmentHeparin
+
+
+ HEPARIN DELIVERY
+ ßEPARIN DELIVERY
+
+
+
+
+ OFF
+ ßFF
+
+
+
+ PAUSE HEPARIN
+ ßAUSE HEPARIN
+
+
+
+ RESUME DELIVERY
+ ßESUME DELIVERY
+
+
+
+ Maximum Cumulative Heparin Volume Delivered
+ ßaximum Cumulative Heparin Volume Delivered
+
+
+
+ Bolus Active
+ ßolus Active
+
+
+
+ Syringe Empty
+ ßyringe Empty
+
+
+
+
+ ßone
+
+
+
+ Delivery Stopped
+ ßelivery Stopped
+
+
+
+ Delivery Paused
+ ßelivery Paused
+
+
+
+ Dispensing Active
+ ßispensing Active
+
+
+
+ HEPARIN
+ ßEPARIN
+
+
+
+ TreatmentHome
+
+
+ Interval:
+ ßnterval:
+
+
+
+ min
+ ßin
+
+
+
+ OFF
+ ßFF
+
+
+
+ Last Read:
+ ßast Read:
+
+
+
+ TreatmentPressures
+
+
+ PRESSURE
+ ßRESSURE
+
+
+
+ (mmHg)
+ ßmmHg)
+
+
+
+ Arterial
+ ßrterial
+
+
+
+ Venous
+ ßenous
+
+
+
+ TreatmentSaline
+
+
+ START BOLUS
+ ßTART BOLUS
+
+
+
+ STOP BOLUS
+ ßTOP BOLUS
+
+
+
+ Maximum cumulative saline bolus volume delivered
+ ßaximum cumulative saline bolus volume delivered
+
+
+
+ SALINE BOLUS
+ ßALINE BOLUS
+
+
+
+ TreatmentStack
+
+
+ Ultrafiltration Paused
+ ßltrafiltration Paused
+
+
+
+ Treatment
+ ßreatment
+
+
+
+ Trending
+ ßrending
+
+
+
+ Settings
+ ßettings
+
+
+
+ VITALS
+ ßITALS
+
+
+
+ TreatmentTime
+
+
+ Time Remaining
+ ßime Remaining
+
+
+
+ Treatment Paused
+ ßreatment Paused
+
+
+
+ TreatmentUltrafiltration
+
+
+ ULTRAFILTRATION VOLUME
+ ßLTRAFILTRATION VOLUME
+
+
+
+ (%1 %2)
+ ß%1 %2)
+
+
+
+ TreatmentVitals
+
+
+ VITALS
+ ßITALS
+
+
+
+ USBProgressItem
+
+
+ USB
+ ßSB
+
+
+
+ UltrafiltrationButton
+
+
+ Invalid
+ ßnvalid
+
+
+
+ Increase
+ ßncrease
+
+
+
+ Decrease
+ ßecrease
+
+
+
+ Due to out of range adjustment, this option
+is disabled.
+ ßue to out of range adjustment, this option
+is disabled.
+
+
+
+ UserConfirmation
+
+
+ Current
+ ßurrent
+
+
+
+ New
+ ßew
+
+
+
+ Confirm
+ ßonfirm
+
+
+
+ VAlarmStatus
+
+
+ Suppressing HD communication timeout.
+ ßuppressing HD communication timeout.
+
+
+
+ Alarm
+ ßlarm
+
+
+
+ VDevice
+
+
+
+ Not enough secure information provided
+ ßot enough secure information provided
+
+
+
+ Variables
+
+
+ CREATE
+ ßREATE
+
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ PRIME
+ ßRIME
+
+
+
+ BEGIN
+ ßEGIN
+
+
+
+ min
+ ßin
+
+
+
+ mL/min
+ ßL/min
+
+
+
+ mL/hr
+ ßL/hr
+
+
+
+ mmHg
+ ßmHg
+
+
+
+ BPM
+ ßPM
+
+
+
+ (L)
+ ßL)
+
+
+
+ mL
+ ßL
+
+
+
+ °C
+ ßC
+
+
+
+ mEq/L
+ ßEq/L
+
+
+
+ IU/mL
+ ßU/mL
+
+
+
+ View::VAdjustmentAlarmVolume
+
+
+ The alarm volume change request has been rejected [%1]
+ ßhe alarm volume change request has been rejected [%1]
+
+
+
+ View::VAdjustmentInstitutionalRecord
+
+
+ Enabled
+ ßnabled
+
+
+
+ Disabled
+ ßisabled
+
+
+
+ Blood Flow Rate
+ ßlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ ßialysate Flow Rate
+
+
+
+ Treatment Duration
+ ßreatment Duration
+
+
+
+ Heparin Stop
+ ßeparin Stop
+
+
+
+ Saline Bolus Volume
+ ßaline Bolus Volume
+
+
+
+ Dialysate Temperature
+ ßialysate Temperature
+
+
+
+ Arterial Pressure Limit
+ ßrterial Pressure Limit
+
+
+
+ Venous Pressure Limit
+ ßenous Pressure Limit
+
+
+
+ Venous Asym Pressure Limit
+ ßenous Asym Pressure Limit
+
+
+
+ Prescribed UF Volume
+ ßrescribed UF Volume
+
+
+
+ Heparin Dispense Rate
+ ßeparin Dispense Rate
+
+
+
+ Heparin Bolus Volume
+ ßeparin Bolus Volume
+
+
+
+ Chemical Disinfect
+ ßhemical Disinfect
+
+
+
+
+ mL/min
+ ßL/min
+
+
+
+
+ min
+ ßin
+
+
+
+
+ mL
+ ßL
+
+
+
+ C
+ ß
+
+
+
+
+
+ mmHg
+ ßmHg
+
+
+
+ L
+ ß
+
+
+
+ mL/hr
+ ßL/hr
+
+
+
+ View::VAdjustmentResponseBase
+
+
+ [%1] Unknown Error
+ ß%1] Unknown Error
+
+
+
+ View::VAlarmActiveList
+
+
+ No Active Alarm List
+%1
+ ßo Active Alarm List
+%1
+
+
+
+ View::VBluetooth
+
+
+ Bluetooth reconnected.
+ ßluetooth reconnected.
+
+
+
+ Bluetooth paired and connected.
+ ßluetooth paired and connected.
+
+
+
+ Bluetooth paired and disconnected.
+ ßluetooth paired and disconnected.
+
+
+
+ BluetoothInterface Closed
+ ßluetoothInterface Closed
+
+
+
+ The Bluetooth Adapter Is Ready %1
+ ßhe Bluetooth Adapter Is Ready %1
+
+
+
+ The Bluetooth Adapter Connected
+ ßhe Bluetooth Adapter Connected
+
+
+
+ The Bluetooth Adapter Disconnected
+ ßhe Bluetooth Adapter Disconnected
+
+
+
+ No Valid Bluetooth Adapter
+ ßo Valid Bluetooth Adapter
+
+
+
+ The Bluetooth Adapter POST Failed
+ ßhe Bluetooth Adapter POST Failed
+
+
+
+ The Bluetooth Adapter Is Off
+ ßhe Bluetooth Adapter Is Off
+
+
+
+ The Bluetooth Adapter IO Error
+ ßhe Bluetooth Adapter IO Error
+
+
+
+ The Bluetooth Adapter Unknown Error
+ ßhe Bluetooth Adapter Unknown Error
+
+
+
+ No Valid device found
+ ßo Valid device found
+
+
+
+ Scanning ...
+ ßcanning ...
+
+
+
+ Scanning Rejected
+ ßcanning Rejected
+
+
+
+ Device Discovering ...
+ ßevice Discovering ...
+
+
+
+ Blood Pressure Device Found
+ ßlood Pressure Device Found
+
+
+
+ Scanning Stopped
+ ßcanning Stopped
+
+
+
+ Scanning Finished
+ ßcanning Finished
+
+
+
+ Device Initializing ...
+ ßevice Initializing ...
+
+
+
+ Device Initialization Error
+ ßevice Initialization Error
+
+
+
+ Device Connecting ...
+ ßevice Connecting ...
+
+
+
+ Device Waiting For Measurement ...
+ ßevice Waiting For Measurement ...
+
+
+
+ Device Connection Error
+ ßevice Connection Error
+
+
+
+ Device Connected
+ ßevice Connected
+
+
+
+ Device Clean Up
+ ßevice Clean Up
+
+
+
+ Device In Power Saving Mode
+ ßevice In Power Saving Mode
+
+
+
+ Service Scanning ...
+ ßervice Scanning ...
+
+
+
+ Service Error: %1
+ ßervice Error: %1
+
+
+
+ Service Invalid
+ ßervice Invalid
+
+
+
+ Service Discovered
+ ßervice Discovered
+
+
+
+ Service Detail Discovering ...
+ ßervice Detail Discovering ...
+
+
+
+ Service Detail Error
+ ßervice Detail Error
+
+
+
+ Service Detail Done
+ ßervice Detail Done
+
+
+
+ Service Clean Up
+ ßervice Clean Up
+
+
+
+ Service Characteristic Changed
+ ßervice Characteristic Changed
+
+
+
+ Service Characteristic Read
+ ßervice Characteristic Read
+
+
+
+ Service Characteristic Write
+ ßervice Characteristic Write
+
+
+
+ Service Descriptor Read
+ ßervice Descriptor Read
+
+
+
+ Service Descriptor Write
+ ßervice Descriptor Write
+
+
+
+ View::VConfirm
+
+
+ Shutdown
+ ßhutdown
+
+
+
+ Are you sure you want to Shutdown?
+ ßre you sure you want to Shutdown?
+
+
+
+ SHUTDOWN
+ ßHUTDOWN
+
+
+
+
+ CANCEL
+ ßANCEL
+
+
+
+ Confirm
+ ßonfirm
+
+
+
+ Are you sure?
+ ßre you sure?
+
+
+
+ CONFIRM
+ ßONFIRM
+
+
+
+ View::VDateTime
+
+
+ SetDateTime %1
+ ßetDateTime %1
+
+
+
+ Not Set
+ ßot Set
+
+
+
+ Succeed
+ ßucceed
+
+
+
+ Failed
+ ßailed
+
+
+
+ Good Morning
+ ßood Morning
+
+
+
+ Good Afternoon
+ ßood Afternoon
+
+
+
+ Good Evening
+ ßood Evening
+
+
+
+ View::VDuetRoWaterDG
+
+
+ The RO Water Mode change request has been rejected [%1]
+ ßhe RO Water Mode change request has been rejected [%1]
+
+
+
+ View::VNetworkModel
+
+
+ Scanning...
+ ßcanning...
+
+
+
+ Scan Finished
+ ßcan Finished
+
+
+
+ Connecting to %1...
+ ßonnecting to %1...
+
+
+
+ Disconnecting from %1...
+ ßisconnecting from %1...
+
+
+
+ Connected to %1.
+ ßonnected to %1.
+
+
+
+ Disconnected from %1.
+ ßisconnected from %1.
+
+
+
+ No Ethernet
+ ßo Ethernet
+
+
+
+ No WiFi
+ ßo WiFi
+
+
+
+ WiFi Disconnect
+ ßiFi Disconnect
+
+
+
+ Successfully set the IP address.
+ ßuccessfully set the IP address.
+
+
+
+ Successfully set the gateway.
+ ßuccessfully set the gateway.
+
+
+
+ Successfully set the subnet mask.
+ ßuccessfully set the subnet mask.
+
+
+
+ Successfully set the DNS.
+ ßuccessfully set the DNS.
+
+
+
+ View::VTreatmentCreate
+
+
+
+
+
+ OFF
+ ßFF
+
+
+
+
+
+
+ NONE
+ ßONE
+
+
+
+ View::VTreatmentVitals
+
+
+ Vital received,%1,%2,%3
+ ßital received,%1,%2,%3
+
+
+
+ Vital Confirmed,%1,%2,%3
+ ßital Confirmed,%1,%2,%3
+
+
+
+ Vital Skipped
+ ßital Skipped
+
+
+
+ WifiInterface
+
+
+ %1.Obtaining IP Address.%1
+ ß1.Obtaining IP Address.%1
+
+
+
+ Failed to disconnect from %1
+ ßailed to disconnect from %1
+
+
+
+ Failed to set static IP Address
+ ßailed to set static IP Address
+
+
+
+ Failed to set gateway.
+ ßailed to set gateway.
+
+
+
+ Failed to set subnet mask.
+ ßailed to set subnet mask.
+
+
+
+ Failed to set DNS.
+ ßailed to set DNS.
+
+
+
+ main
+
+
+ Treatment
+ ßreatment
+
+
+
+ Manager
+ ßanager
+
+
+
+ Settings
+ ßettings
+
+
+
+ Show the Can Frame Output
+ ßhow the Can Frame Output
+
+
+
+ Show the Message Output
+ ßhow the Message Output
+
+
+
+ Show the Logs Output
+ ßhow the Logs Output
+
+
+
+ Enable send low priority, empty message on the CANBus just to keep UI board CAN driver awake
+ ßnable send low priority, empty message on the CANBus just to keep UI board CAN driver awake
+
+
+
+ Test fake message interval(ms)
+ ßest fake message interval(ms)
+
+
+
+ interval
+ ßnterval
+
+
+
+ Test fake message data
+will use default sequenced long fake message if set to 00(default)
+will used only if correct integer value assigned for interval option
+ ßest fake message data
+will use default sequenced long fake message if set to 00(default)
+will used only if correct integer value assigned for interval option
+
+
+
+ data
+ ßata
+
+
+
+ Test fake message sequence at the beginning of the frame
+ ßest fake message sequence at the beginning of the frame
+
+
+
+ Disable unhandled messages report as an error in the log
+ ßisable unhandled messages report as an error in the log
+
+
+
+ Disable the Dialin messages logged as unhandled
+ ßisable the Dialin messages logged as unhandled
+
+
+
+ Disables HD communication timeout
+ ßisables HD communication timeout
+
+
+
+ Disables alarm no minimize
+ ßisables alarm no minimize
+
+
+
+ disable-sd-card-fail-log-stop
+ ßisable-sd-card-fail-log-stop
+
+
+
+ disable-cloudsync-fail-stop
+ ßisable-cloudsync-fail-stop
+
+
+
+ Disables Check-In Log
+ ßisables Check-In Log
+
+
+
+ Disables Acknowledgment Log
+ ßisables Acknowledgment Log
+
+
+
+ Enables Dry-Demo Mode
+ ßnables Dry-Demo Mode
+
+
+
+ Sets the Active CANBus [Shall start with 'can' or 'vcan]
+ ßets the Active CANBus [Shall start with 'can' or 'vcan]
+
+
+
+ CANBus
+ ßANBus
+
+
+
+ Enables the manufacturing mode to configure the system for the first time.
+ ßnables the manufacturing mode to configure the system for the first time.
+
+
+
+ In case the application is not in Manufacturing Setup but needs to use root home folder for configurations.
+ ßn case the application is not in Manufacturing Setup but needs to use root home folder for configurations.
+
+
+
+ Enables the update mode to update only necessary files during the update and keep the rest.
+ ßnables the update mode to update only necessary files during the update and keep the rest.
+
+
+
+ Use the log long file name format
+<date>_<time>_<serial>_<mode>
+ ßse the log long file name format
+<date>_<time>_<serial>_<mode>
+
+
+
+ Use the log cloud upload
+ ßse the log cloud upload
+
+
+
+ Use the log compression
+ ßse the log compression
+
+
+
+ tst_acknow
+
+
+ Connected
+ ßonnected
+
+
+
+ Disconnected
+ ßisconnected
+
+
+
+ tst_canbus
+
+
+ Connection
+ ßonnection
+
+
+
+ Connected
+ ßonnected
+
+
+
+ Disconnected
+ ßisconnected
+
+
+
+ tst_models
+
+
+ ALARM_ID_UNDEFINED [-1]
+ ßLARM_ID_UNDEFINED [-1]
+
+
+
+ ALARM_ID_UNDEFINED [599]
+ ßLARM_ID_UNDEFINED [599]
+
+
+
+ tst_views
+
+
+ REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE
+ ßEQUEST_REJECT_REASON_INVALID_TREATMENT_STATE
+
+
+
+ REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS
+ ßEQUEST_REJECT_REASON_UF_NOT_IN_PROGESS
+
+
+
+ REQUEST_REJECT_REASON_UF_NOT_PAUSED
+ ßEQUEST_REJECT_REASON_UF_NOT_PAUSED
+
+
+
\ No newline at end of file
Index: resources/translations/translation_es.qm
===================================================================
diff -u
Binary files differ
Index: resources/translations/translation_es.ts
===================================================================
diff -u
--- resources/translations/translation_es.ts (revision 0)
+++ resources/translations/translation_es.ts (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -0,0 +1,5386 @@
+
+
+ AlarmListDialog
+
+
+ Alarm list
+ Ñlarm list
+
+
+
+ ApplicationPost
+
+
+ The POST log file could not be read.
+ Ñhe POST log file could not be read.
+
+
+
+ BPHREntry
+
+
+ Blood Pressure
+ Ñlood Pressure
+
+
+
+ mmHg
+ ÑmHg
+
+
+
+ Heart Rate
+ Ñeart Rate
+
+
+
+ BPM
+ ÑPM
+
+
+
+ BackButton
+
+
+ BACK
+ ÑACK
+
+
+
+ Bluetooth::BluetoothInterface
+
+
+ BCUFF Battery: %1
+ ÑCUFF Battery: %1
+
+
+
+ Can::CanInterface
+
+
+ Connected
+ Ñonnected
+
+
+
+ Device Creation
+ Ñevice Creation
+
+
+
+ Connection
+ Ñonnection
+
+
+
+ Disconnected
+ Ñisconnected
+
+
+
+ Can::MessageDispatcher
+
+
+ Out of Sync : %1 , %2
+ Ñut of Sync : %1 , %2
+
+
+
+ Ack Req, Sq:%1, ID:%2
+ Ñck Req, Sq:%1, ID:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckReq : %1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ñ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckReq : %1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ ,%1,Ack Bak, Sq:%2
+ Ñ ,%1,Ack Bak, Sq:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ñ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ ,%1,Ack Req, Sq:%2, ID:%3
+ Ñ ,%1,Ack Req, Sq:%2, ID:%3
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ñ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HD AckReq : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Ack Bak, Sq:%1, Dst:%2
+ Ñck Bak, Sq:%1, Dst:%2
+
+
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ñ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UI AckBak : %1 %2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Can::MessageInterpreter
+
+
+ Unhandled Message ID (HD)
+ Ñnhandled Message ID (HD)
+
+
+
+ Unknown transmit Message with ID '%1'
+ Ñnknown transmit Message with ID '%1'
+
+
+
+ CheckListView
+
+
+ Complete!
+ Ñomplete!
+
+
+
+ CloudSyncController
+
+
+ CS Unknown Error
+ ÑS Unknown Error
+
+
+
+ CS The device registration failed
+ ÑS The device registration failed
+
+
+
+ CS Invalid Device State
+ ÑS Invalid Device State
+
+
+
+ CS The treatment report delivery failed
+ ÑS The treatment report delivery failed
+
+
+
+ CS The device check-in failed
+ ÑS The device check-in failed
+
+
+
+ CS The device decommissioning failed
+ ÑS The device decommissioning failed
+
+
+
+ CS Invalid UI Message CRC
+ ÑS Invalid UI Message CRC
+
+
+
+ CS DRT device registration failed
+ ÑS DRT device registration failed
+
+
+
+ CS Patient association failed
+ ÑS Patient association failed
+
+
+
+ CS New token certification failed
+ ÑS New token certification failed
+
+
+
+ CS Token verification failed
+ ÑS Token verification failed
+
+
+
+ CS Cloud device validation failed
+ ÑS Cloud device validation failed
+
+
+
+ CS Patient ID does not exists
+ ÑS Patient ID does not exists
+
+
+
+ CS Temporary patient ID creation failed
+ ÑS Temporary patient ID creation failed
+
+
+
+ CS Save credentials failed
+ ÑS Save credentials failed
+
+
+
+ CS Unknown device state
+ ÑS Unknown device state
+
+
+
+ CS Config file save failed
+ ÑS Config file save failed
+
+
+
+
+ CS Log upload failed
+ ÑS Log upload failed
+
+
+
+ CS The device factory reset failed
+ ÑS The device factory reset failed
+
+
+
+ CS The log retention failed
+ ÑS The log retention failed
+
+
+
+ CS Out buffer file does not exist
+ ÑS Out buffer file does not exist
+
+
+
+ CS Out buffer empty
+ ÑS Out buffer empty
+
+
+
+ CS Incorrect header
+ ÑS Incorrect header
+
+
+
+ CS Incorrect timestamp
+ ÑS Incorrect timestamp
+
+
+
+ CS Incorrect sequence
+ ÑS Incorrect sequence
+
+
+
+ CS Incorrect CRC
+ ÑS Incorrect CRC
+
+
+
+ CS Incorrect ID
+ ÑS Incorrect ID
+
+
+
+ CS Incorrect parameter count
+ ÑS Incorrect parameter count
+
+
+
+ CS Invalid ID
+ ÑS Invalid ID
+
+
+
+ CS Mismatch parameter count
+ ÑS Mismatch parameter count
+
+
+
+ CS Missing parameter
+ ÑS Missing parameter
+
+
+
+ CS No history available
+ ÑS No history available
+
+
+
+ CS Duplicate data
+ ÑS Duplicate data
+
+
+
+ CS The log folder cannot be created.
+ ÑS The log folder cannot be created.
+
+
+
+ CS Error writing to the input file.
+ ÑS Error writing to the input file.
+
+
+
+ CS The credentials file does not exist.
+ ÑS The credentials file does not exist.
+
+
+
+ CS The credentials folder is incorrect.
+ ÑS The credentials folder is incorrect.
+
+
+
+ CS No credential file name provided.
+ ÑS No credential file name provided.
+
+
+
+ CS The credentials folder is empty.
+ ÑS The credentials folder is empty.
+
+
+
+ CS No Treatment Code provided.
+ ÑS No Treatment Code provided.
+
+
+
+ CS The provided Treatment Code is empty.
+ ÑS The provided Treatment Code is empty.
+
+
+
+ CS No Log Name provided.
+ ÑS No Log Name provided.
+
+
+
+ CS The provided Log Name is empty.
+ ÑS The provided Log Name is empty.
+
+
+
+ CS Not Sent, Device not registered.
+ ÑS Not Sent, Device not registered.
+
+
+
+ CS No Log Retention summary provided.
+ ÑS No Log Retention summary provided.
+
+
+
+ ConfirmButton
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ ConfirmDialog
+
+
+ Are you sure?
+ Ñre you sure?
+
+
+
+ CANCEL
+ ÑANCEL
+
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ ID
+ ÑD
+
+
+
+ ConfirmTreatmentTable
+
+
+ New Treatment
+ Ñew Treatment
+
+
+
+ PRESCRIPTION
+ ÑRESCRIPTION
+
+
+
+ OPERATING PARAMETERS
+ ÑPERATING PARAMETERS
+
+
+
+ Blood Flow Rate
+ Ñlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ Ñialysate Flow Rate
+
+
+
+ Duration
+ Ñuration
+
+
+
+ Heparin Dispensing Rate
+ Ñeparin Dispensing Rate
+
+
+
+ Heparin Bolus Volume
+ Ñeparin Bolus Volume
+
+
+
+ Heparin Stop Time
+ Ñeparin Stop Time
+
+
+
+ Saline Bolus Volume
+ Ñaline Bolus Volume
+
+
+
+ Heparin Type
+ Ñeparin Type
+
+
+
+ Acid Concentrate
+ Ñcid Concentrate
+
+
+
+ Bicarbonate Concentrate
+ Ñicarbonate Concentrate
+
+
+
+ Dialyzer Type
+ Ñialyzer Type
+
+
+
+ Dialysate Temperature
+ Ñialysate Temperature
+
+
+
+ Blood Pressure Measure Interval
+ Ñlood Pressure Measure Interval
+
+
+
+ Device::DeviceController
+
+
+ %1 - Device or resource busy (%2)
+ Ñ1 - Device or resource busy (%2)
+
+
+
+ %1 - %2 (%3 , %4)
+ Ñ1 - %2 (%3 , %4)
+
+
+
+ Encrypted Partition %1 started.
+ Ñncrypted Partition %1 started.
+
+
+
+ Factory Reset started.
+ Ñactory Reset started.
+
+
+
+ Decommissioning started.
+ Ñecommissioning started.
+
+
+
+ USB unmount started.
+ ÑSB unmount started.
+
+
+
+ USB mount started
+ ÑSB mount started
+
+
+
+ Device::DeviceError
+
+
+ The device script abnormal exit.
+ Ñhe device script abnormal exit.
+
+
+
+ The device script file is not found.
+ Ñhe device script file is not found.
+
+
+
+ The device script file is not executable.
+ Ñhe device script file is not executable.
+
+
+
+ The request is already in progress.
+ Ñhe request is already in progress.
+
+
+
+ The requested value is out of range.
+ Ñhe requested value is out of range.
+
+
+
+ The requested value is incorrect.
+ Ñhe requested value is incorrect.
+
+
+
+ The response value is incorrect.
+ Ñhe response value is incorrect.
+
+
+
+ The watch file cannot be created.
+ Ñhe watch file cannot be created.
+
+
+
+ The watch file is not found.
+ Ñhe watch file is not found.
+
+
+
+ The watch file cannot be added.
+ Ñhe watch file cannot be added.
+
+
+
+ The Bluetooth cuff pair clear error.
+ Ñhe Bluetooth cuff pair clear error.
+
+
+
+ The Bluetooth cuff pair query error.
+ Ñhe Bluetooth cuff pair query error.
+
+
+
+ No paired Bluetooth cuff found.
+ Ño paired Bluetooth cuff found.
+
+
+
+ The Bluetooth cuff pair invalid address.
+ Ñhe Bluetooth cuff pair invalid address.
+
+
+
+ The Encrypted Partition error.
+ Ñhe Encrypted Partition error.
+
+
+
+ DiagnosticsDialog
+
+
+ ROP
+ ÑROP
+
+
+
+ DRP
+ ÑDRP
+
+
+
+ Prssr
+ ÑPrssr
+
+
+
+ Rsrvr
+ ÑRsrvr
+
+
+
+ Heatrs
+ ÑHeatrs
+
+
+
+ CANerr: %1
+ ÑANerr: %1
+
+
+
+ LoadCl
+ ÑLoadCl
+
+
+
+ Tmprtr
+ ÑTmprtr
+
+
+
+ Conduct
+ ÑConduct
+
+
+
+ Air Status
+ Ñir Status
+
+
+
+ DG Mode
+ ÑDG Mode
+
+
+
+ BP
+ ÑBP
+
+
+
+ DPi
+ ÑDPi
+
+
+
+ UF/DPo
+ ÑUF/DPo
+
+
+
+ Prsr Oc
+ ÑPrsr Oc
+
+
+
+ Syringe
+ ÑSyringe
+
+
+
+ HD Mode
+ ÑHD Mode
+
+
+
+ Vlv
+ Ñlv
+
+
+
+ BLD
+ ÑBLD
+
+
+
+ Alarms
+ ÑAlarms
+
+
+
+ PreTx States
+ ÑPreTx States
+
+
+
+ DisinfectStack
+
+
+ Disinfection
+ Ñisinfection
+
+
+
+ Water Flush
+ Ñater Flush
+
+
+
+ Heat Disinfect with Active Cool
+ Ñeat Disinfect with Active Cool
+
+
+
+ Chemical Disinfect
+ Ñhemical Disinfect
+
+
+
+ Chemical Flush
+ Ñhemical Flush
+
+
+
+ RO Permeate Sample
+ ÑO Permeate Sample
+
+
+
+ Heat Disinfect
+ Ñeat Disinfect
+
+
+
+ EndTreatmentAdditional
+
+
+ Saline Bolus
+ Ñaline Bolus
+
+
+
+ EndTreatmentEndStack
+
+
+ Treatment Complete
+ Ñreatment Complete
+
+
+
+ START RINSEBACK
+ ÑTART RINSEBACK
+
+
+
+ Treatment Complete Paused
+ Ñreatment Complete Paused
+
+
+
+ EndTreatmentRecirculateStack
+
+
+ BACK TO RECIRCULATE
+ ÑACK TO RECIRCULATE
+
+
+
+ END TREATMENT
+ ÑND TREATMENT
+
+
+
+ RESUME TREATMENT
+ ÑESUME TREATMENT
+
+
+
+ Recirculate Disconnect
+ Ñecirculate Disconnect
+
+
+
+ Recirculate
+ Ñecirculate
+
+
+
+ Recirculate Stopped
+ Ñecirculate Stopped
+
+
+
+ Recirculate Reconnect
+ Ñecirculate Reconnect
+
+
+
+ EndTreatmentRinseback
+
+
+ Rinseback
+ Ñinseback
+
+
+
+ End
+ Ñnd
+
+
+
+ Decelerate
+ Ñecelerate
+
+
+
+ Resume
+ Ñesume
+
+
+
+ Pause
+ Ñause
+
+
+
+ Accelerate
+ Ñccelerate
+
+
+
+ EndTreatmentRinsebackComplete
+
+
+ Rinseback Complete
+ Ñinseback Complete
+
+
+
+ END TREATMENT
+ ÑND TREATMENT
+
+
+
+ RECIRCULATE
+ ÑECIRCULATE
+
+
+
+ SALINE BOLUS
+ ÑALINE BOLUS
+
+
+
+ (50mL)
+ Ñ50mL)
+
+
+
+ EndTreatmentRinsebackInit
+
+
+ Rinseback Setup
+ Ñinseback Setup
+
+
+
+ END TREATMENT
+ ÑND TREATMENT
+
+
+
+ START RINSEBACK
+ ÑTART RINSEBACK
+
+
+
+ EndTreatmentRinsebackReconnect
+
+
+ Rinseback Reconnect
+ Ñinseback Reconnect
+
+
+
+ END TREATMENT
+ ÑND TREATMENT
+
+
+
+ ExportButton
+
+
+ Export
+ Ñxport
+
+
+
+ MainHome
+
+
+ CREATE TREATMENT
+ ÑREATE TREATMENT
+
+
+
+ MainStack
+
+
+ SERVICE MODE
+ ÑERVICE MODE
+
+
+
+ ManagerStack
+
+
+ Treatment Management
+ Ñreatment Management
+
+
+
+ NotificationBar
+
+
+ ID
+ ÑD
+
+
+
+ NotificationDialog
+
+
+ Notification
+ Ñotification
+
+
+
+ RESUME
+ ÑESUME
+
+
+
+ RINSEBACK
+ ÑINSEBACK
+
+
+
+ END TREATMENT
+ ÑND TREATMENT
+
+
+
+ OK
+ ÑK
+
+
+
+ ID
+ ÑD
+
+
+
+ PostTreatmentBase
+
+
+ Disconnection
+ Ñisconnection
+
+
+
+ Review
+ Ñeview
+
+
+
+ Disposables
+ Ñisposables
+
+
+
+ Disinfection
+ Ñisinfection
+
+
+
+ PostTreatmentReview
+
+
+ NEXT
+ ÑEXT
+
+
+
+ Code:
+ Ñode:
+
+
+
+ PostTreatmentStack
+
+
+ Patient Disconnection
+ Ñatient Disconnection
+
+
+
+ Treatment Review
+ Ñreatment Review
+
+
+
+ Disposables Removal
+ Ñisposables Removal
+
+
+
+ PowerItem
+
+
+ Cannot shutdown during 'Treatment'
+ Ñannot shutdown during 'Treatment'
+
+
+
+ System is shutting down
+ Ñystem is shutting down
+
+
+
+ PreTreatmentBase
+
+
+ Create
+ Ñreate
+
+
+
+ Sample
+ Ñample
+
+
+
+ Consumables
+ Ñonsumables
+
+
+
+ Disposables
+ Ñisposables
+
+
+
+ Prime
+ Ñrime
+
+
+
+ BP/HR
+ ÑP/HR
+
+
+
+ Ultrafiltration
+ Ñltrafiltration
+
+
+
+ Connection
+ Ñonnection
+
+
+
+ Start
+ Ñtart
+
+
+
+ PreTreatmentConfirm
+
+
+ Code:
+ Ñode:
+
+
+
+ PreTreatmentConnectionStack
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ BP/HR
+ ÑP/HR
+
+
+
+ CONNECTION
+ ÑONNECTION
+
+
+
+ Press CONNECTION to pair a Bluetooth Pressure Measurement Cuff.
+ Ñress CONNECTION to pair a Bluetooth Pressure Measurement Cuff.
+
+
+
+ Press START on Blood Pressure Measurement Cuff to display reading or enter vitals manually
+ Ñress START on Blood Pressure Measurement Cuff to display reading or enter vitals manually
+
+
+
+ Bluetooth Cuff
+ Ñluetooth Cuff
+
+
+
+ Ultrafiltration Setup
+ Ñltrafiltration Setup
+
+
+
+ Patient Connection
+ Ñatient Connection
+
+
+
+ CONTINUE
+ ÑONTINUE
+
+
+
+ Start Treatment
+ Ñtart Treatment
+
+
+
+ START
+ ÑTART
+
+
+
+ PreTreatmentConsumablesStack
+
+
+ Consumables Installation
+ Ñonsumables Installation
+
+
+
+ Consumables Self Test
+ Ñonsumables Self Test
+
+
+
+ Self Test Complete!
+ Ñelf Test Complete!
+
+
+
+ BiCarb Pump Check
+ ÑiCarb Pump Check
+
+
+
+ Acid Pump Check
+ Ñcid Pump Check
+
+
+
+ PreTreatmentCreate
+
+
+ RESET
+ ÑESET
+
+
+
+ PREPOPULATE
+ ÑREPOPULATE
+
+
+
+ PRESCRIPTION
+ ÑRESCRIPTION
+
+
+
+ Blood Flow Rate
+ Ñlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ Ñialysate Flow Rate
+
+
+
+ Duration
+ Ñuration
+
+
+
+ Heparin Dispensing Rate
+ Ñeparin Dispensing Rate
+
+
+
+
+
+
+
+
+ OFF
+ ÑFF
+
+
+
+
+
+ ON
+ ÑN
+
+
+
+ Heparin Bolus Volume
+ Ñeparin Bolus Volume
+
+
+
+ Heparin Stop Time
+ Ñeparin Stop Time
+
+
+
+ Saline Bolus
+ Ñaline Bolus
+
+
+
+ OPERATING PARAMETERS
+ ÑPERATING PARAMETERS
+
+
+
+ Heparin Type
+ Ñeparin Type
+
+
+
+ Acid Concentrate
+ Ñcid Concentrate
+
+
+
+ Bicarbonate Concentrate
+ Ñicarbonate Concentrate
+
+
+
+ Dialyzer Type
+ Ñialyzer Type
+
+
+
+ Dialysate Temperature
+ Ñialysate Temperature
+
+
+
+ Blood Pressure Measurement Interval
+ Ñlood Pressure Measurement Interval
+
+
+
+ PreTreatmentCreateStack
+
+
+ Patient ID
+ Ñatient ID
+
+
+
+
+ CONTINUE
+ ÑONTINUE
+
+
+
+ SKIP
+ ÑKIP
+
+
+
+ Create a Custom Treatment
+ Ñreate a Custom Treatment
+
+
+
+ Confirm Treatment
+ Ñonfirm Treatment
+
+
+
+ PreTreatmentDisposablesStack
+
+
+ System Self Test
+ Ñystem Self Test
+
+
+
+ Cartridge Installation
+ Ñartridge Installation
+
+
+
+
+
+ NEXT
+ ÑEXT
+
+
+
+ Cartridge Connection
+ Ñartridge Connection
+
+
+
+ Heparin Syringe
+ Ñeparin Syringe
+
+
+
+ Saline Bag
+ Ñaline Bag
+
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ PreTreatmentPrimeStack
+
+
+ Begin Prime
+ Ñegin Prime
+
+
+
+ Self Test Complete!
+ Ñelf Test Complete!
+
+
+
+ Occlusion Sensor Check
+ Ñcclusion Sensor Check
+
+
+
+ Cartridge Install Checks
+ Ñartridge Install Checks
+
+
+
+ Pressure Leak Check
+ Ñressure Leak Check
+
+
+
+ Priming Heparin Line
+ Ñriming Heparin Line
+
+
+
+ Syringe Pump Occlusion Check
+ Ñyringe Pump Occlusion Check
+
+
+
+ CONTINUE
+ ÑONTINUE
+
+
+
+ Priming
+ Ñriming
+
+
+
+ Priming Complete!
+ Ñriming Complete!
+
+
+
+ Start Prime
+ Ñtart Prime
+
+
+
+ Blood Circuit Priming
+ Ñlood Circuit Priming
+
+
+
+ Dialysate Circuit Priming
+ Ñialysate Circuit Priming
+
+
+
+ Wet Self Tests
+ Ñet Self Tests
+
+
+
+ PreTreatmentUltrafiltration
+
+
+ Ultrafiltration Volume
+ Ñltrafiltration Volume
+
+
+
+ PreTreatmentWaterSampleStack
+
+
+ Flushing Carbon Filters for Water Sample
+ Ñlushing Carbon Filters for Water Sample
+
+
+
+ NEXT
+ ÑEXT
+
+
+
+ Water Sample
+ Ñater Sample
+
+
+
+ WATER SAMPLE
+ ÑATER SAMPLE
+
+
+
+ Water Sample Result
+ Ñater Sample Result
+
+
+
+ FAIL
+ ÑAIL
+
+
+
+ PASS
+ ÑASS
+
+
+
+ Water Sample Result Failed
+ Ñater Sample Result Failed
+
+
+
+ OK
+ ÑK
+
+
+
+ PressureRangeSlider
+
+
+ LOW
+ ÑOW
+
+
+
+ HIGH
+ ÑIGH
+
+
+
+ QObject
+
+
+ Application terminated by SIGINT
+ Ñpplication terminated by SIGINT
+
+
+
+ Application terminated by SIGTERM
+ Ñpplication terminated by SIGTERM
+
+
+
+ Unknown device error %2 [%1]
+ Ñnknown device error %2 [%1]
+
+
+
+ Device error [%1]
+ Ñevice error [%1]
+
+
+
+ Removed previously paired device(s).
+ Ñemoved previously paired device(s).
+
+
+
+ The Encrypt Partition Command Complete.
+ Ñhe Encrypt Partition Command Complete.
+
+
+
+ Paired BCuff Query %1 %2
+ Ñaired BCuff Query %1 %2
+
+
+
+ The Factory Reset Command Complete.
+ Ñhe Factory Reset Command Complete.
+
+
+
+ The Decommissioning Command Complete.
+ Ñhe Decommissioning Command Complete.
+
+
+
+ The USB (un)mount Command Complete.
+ Ñhe USB (un)mount Command Complete.
+
+
+
+ Indication for when no alarms is a possible situation.
+ Ñndication for when no alarms is a possible situation.
+
+
+
+ HD stuck button POST failure.
+Stop or Off button detected to be pressed for at least 1 second during test shortly after power up.
+ ÑD stuck button POST failure.
+Stop or Off button detected to be pressed for at least 1 second during test shortly after power up.
+
+
+
+ HD FPGA POST failure.
+ ÑD FPGA POST failure.
+
+
+
+ DG FPGA POST failure.
+ ÑG FPGA POST failure.
+
+
+
+ HD Watchdog POST failure.
+ ÑD Watchdog POST failure.
+
+
+
+ DG Watchdog POST failure.
+ ÑG Watchdog POST failure.
+
+
+
+ HD UI communication POST failure.
+UI failed to communicate within a reasonable time after power up.
+ ÑD UI communication POST failure.
+UI failed to communicate within a reasonable time after power up.
+
+
+
+ HD RTC battery low.
+ ÑD RTC battery low.
+
+
+
+ HD accelerometer failed POST.
+ ÑD accelerometer failed POST.
+
+
+
+ DG accelerometer failed POST.
+ ÑG accelerometer failed POST.
+
+
+
+ HD blood leak sensor setting embedded mode failure.
+ ÑD blood leak sensor setting embedded mode failure.
+
+
+
+ HD dialysate temperature below target temperature or below safety temp.
+ ÑD dialysate temperature below target temperature or below safety temp.
+
+
+
+ HD firmware image integrity POST test failed.
+ ÑD firmware image integrity POST test failed.
+
+
+
+ DG firmware image integrity POST test failed.
+ ÑG firmware image integrity POST test failed.
+
+
+
+ DG invalid usage record CRC.
+ ÑG invalid usage record CRC.
+
+
+
+ HD dialysate temperature above high safety.
+ ÑD dialysate temperature above high safety.
+
+
+
+ HD alarm audio failed POST.
+ ÑD alarm audio failed POST.
+
+
+
+ HD UI POST failed.
+ ÑD UI POST failed.
+
+
+
+ HD didn't get ACK on message to DG that required acknowledgment.
+ ÑD didn't get ACK on message to DG that required acknowledgment.
+
+
+
+ HD dialysate temperature above target temperature.
+ ÑD dialysate temperature above target temperature.
+
+
+
+ DG conductivity sensors invalid calibration record.
+ ÑG conductivity sensors invalid calibration record.
+
+
+
+ DG drain line volume invalid calibration record.
+ ÑG drain line volume invalid calibration record.
+
+
+
+ DG reservoirs invalid calibration record.
+ ÑG reservoirs invalid calibration record.
+
+
+
+ DG acid concentrate calibration record.
+ ÑG acid concentrate calibration record.
+
+
+
+ DG bicarb concentrate calibration record.
+ ÑG bicarb concentrate calibration record.
+
+
+
+ DG accelerometer invalid calibration record.
+ ÑG accelerometer invalid calibration record.
+
+
+
+ HD accelerometer invalid calibration record.
+ ÑD accelerometer invalid calibration record.
+
+
+
+ HD blood leak sensor zero and self test sequence failed.
+ ÑD blood leak sensor zero and self test sequence failed.
+
+
+
+ DG two wire sensors FPGA fault.
+ ÑG two wire sensors FPGA fault.
+
+
+
+ HD heparin force sensor invalid calibration record.
+ ÑD heparin force sensor invalid calibration record.
+
+
+
+ HD Software fault.
+Software found itself in an unexpected state.
+ ÑD Software fault.
+Software found itself in an unexpected state.
+
+
+
+ HD blood pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ÑD blood pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD blood pump failed motor off check.
+Measured speed while commanded off.
+ ÑD blood pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD blood pump failed motor direction check.
+Measured vs commanded.
+ ÑD blood pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD blood pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ÑD blood pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ HD dialysis inlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ÑD dialysis inlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD dialysis inlet pump failed motor off check.
+Measured speed while commanded off.
+ ÑD dialysis inlet pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD dialysis inlet pump failed motor direction check.
+Measured vs commanded.
+ ÑD dialysis inlet pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD dialysis inlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ÑD dialysis inlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ HD dialysis outlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+ ÑD dialysis outlet pump failed motor controller current check.
+Too high when pump should be off or out of range when pump should be running.
+
+
+
+ HD dialysis outlet pump failed motor off check.
+Measured speed while commanded off.
+ ÑD dialysis outlet pump failed motor off check.
+Measured speed while commanded off.
+
+
+
+ HD dialysis outlet pump failed motor direction check.
+Measured vs commanded.
+ ÑD dialysis outlet pump failed motor direction check.
+Measured vs commanded.
+
+
+
+ HD dialysis outlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+ ÑD dialysis outlet pump failed rotor speed check.
+Mismatch with rotor and motor speeds.
+
+
+
+ DG main primary heater FPGA fault.
+ ÑG main primary heater FPGA fault.
+
+
+
+ HD UI communication timeout.
+ ÑD UI communication timeout.
+
+
+
+ HD too many bad communications CRC.
+ ÑD too many bad communications CRC.
+
+
+
+ HD didn't get ACK on message to UI that required acknowledgment.
+ ÑD didn't get ACK on message to UI that required acknowledgment.
+
+
+
+ DG maximum RO Pump PWM exceeded.
+ ÑG maximum RO Pump PWM exceeded.
+
+
+
+ HD ultrafiltration volume accuracy error during treatment.
+ ÑD ultrafiltration volume accuracy error during treatment.
+
+
+
+ HD FPGA communication down for too long.
+ ÑD FPGA communication down for too long.
+
+
+
+ DG FPGA not accepting commanded valve states.
+ ÑG FPGA not accepting commanded valve states.
+
+
+
+ HD blood pump failed motor speed check.
+Measured vs commanded.
+ ÑD blood pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD dialysate inlet pump failed motor speed check.
+Measured vs commanded.
+ ÑD dialysate inlet pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD dialysate outlet pump failed motor speed check.
+Measured vs commanded.
+ ÑD dialysate outlet pump failed motor speed check.
+Measured vs commanded.
+
+
+
+ HD critical data integrity check failed.
+ ÑD critical data integrity check failed.
+
+
+
+ DG critical data integrity check failed.
+ ÑG critical data integrity check failed.
+
+
+
+ HD accelerometer error (no readings or FPGA reports error).
+ ÑD accelerometer error (no readings or FPGA reports error).
+
+
+
+ DG accelerometer error (no readings or FPGA reports error).
+ ÑG accelerometer error (no readings or FPGA reports error).
+
+
+
+ HD valve homing failed.
+ ÑD valve homing failed.
+
+
+
+ HD valve transition time out.
+ ÑD valve transition time out.
+
+
+
+ HD valve not functional.
+ ÑD valve not functional.
+
+
+
+ HD valve current out of range.
+ ÑD valve current out of range.
+
+
+
+ HD valve position out of target.
+ ÑD valve position out of target.
+
+
+
+ HD syringe pump prime timeout.
+ ÑD syringe pump prime timeout.
+
+
+
+ DG barometric pressure sensor out of range.
+ ÑG barometric pressure sensor out of range.
+
+
+
+ HD DG requests DG command with invalid parameter fault.
+ ÑD DG requests DG command with invalid parameter fault.
+
+
+
+ HD blood leak sensor set point set failure.
+ ÑD blood leak sensor set point set failure.
+
+
+
+ HD blood pump occlusion self-test failure alarm.
+ ÑD blood pump occlusion self-test failure alarm.
+
+
+
+ HD active reservoir recirculation out of range.
+ ÑD active reservoir recirculation out of range.
+
+
+
+ HD blood leak sensor invalid calibration record.
+ ÑD blood leak sensor invalid calibration record.
+
+
+
+ HD arterial pressure self-test failure alarm.
+ ÑD arterial pressure self-test failure alarm.
+
+
+
+ HD venous pressure self-test failure alarm.
+ ÑD venous pressure self-test failure alarm.
+
+
+
+ HD No load cell data message receive at least once every 2 seconds.
+ ÑD No load cell data message receive at least once every 2 seconds.
+
+
+
+ HD No dialysate temperature data message receive at least once every 2 seconds.
+ ÑD No dialysate temperature data message receive at least once every 2 seconds.
+
+
+
+ DG inlet UV reactor is on with no flow.
+ ÑG inlet UV reactor is on with no flow.
+
+
+
+ HD syringe pump self-test failure alarm.
+ ÑD syringe pump self-test failure alarm.
+
+
+
+ HD monitored voltage is out of range.
+ ÑD monitored voltage is out of range.
+
+
+
+ DG monitored voltage is out of range.
+ ÑG monitored voltage is out of range.
+
+
+
+ HD syringe pump direction (from encoder) error.
+ ÑD syringe pump direction (from encoder) error.
+
+
+
+ HD syringe pump direction (from controller) error.
+ ÑD syringe pump direction (from controller) error.
+
+
+
+ HD syringe pump fault reported by FPGA.
+ ÑD syringe pump fault reported by FPGA.
+
+
+
+ HD syringe pump over travel error.
+ ÑD syringe pump over travel error.
+
+
+
+ HD syringe pump DAC write failure.
+ ÑD syringe pump DAC write failure.
+
+
+
+ HD syringe pump is running while the BP is off.
+ ÑD syringe pump is running while the BP is off.
+
+
+
+ DG set RTC year is invalid.
+ ÑG set RTC year is invalid.
+
+
+
+ HD pump track latch opened alarm.
+ ÑD pump track latch opened alarm.
+
+
+
+ HD set RTC year is invalid.
+ ÑD set RTC year is invalid.
+
+
+
+ DG heating invalid calibration record.
+ ÑG heating invalid calibration record.
+
+
+
+ DG concentrate pumps hall sensor out of range.
+ ÑG concentrate pumps hall sensor out of range.
+
+
+
+ DG outlet UV reactor on with no flow.
+ ÑG outlet UV reactor on with no flow.
+
+
+
+
+ DG load cells A1/B1 FPGA fault.
+ ÑG load cells A1/B1 FPGA fault.
+
+
+
+ HD No dialysate flow data receive in the last 3 seconds.
+ ÑD No dialysate flow data receive in the last 3 seconds.
+
+
+
+ DG temperature sensors invalid calibration record.
+ ÑG temperature sensors invalid calibration record.
+
+
+
+ DG outlet primary conductivity out of range.
+ ÑG outlet primary conductivity out of range.
+
+
+
+ DG pressure out of range.
+ ÑG pressure out of range.
+
+
+
+ DG watchdog expired.
+ ÑG watchdog expired.
+
+
+
+ DG inlet water temperature in high range.
+ ÑG inlet water temperature in high range.
+
+
+
+ DG fill conductivity out of range.
+ ÑG fill conductivity out of range.
+
+
+
+ HD battery communication fault.
+ ÑD battery communication fault.
+
+
+
+ HD syringe pump stall alarm.
+ ÑD syringe pump stall alarm.
+
+
+
+ DG conductivity sensors invalid temperature compensation calibration record.
+ ÑG conductivity sensors invalid temperature compensation calibration record.
+
+
+
+ UI POST HD communication failure.
+ ÑI POST HD communication failure.
+
+
+
+ DG heat disinfect temperature gradient out of range.
+ ÑG heat disinfect temperature gradient out of range.
+
+
+
+ HD invalid calibration CRC.
+ ÑD invalid calibration CRC.
+
+
+
+ HD air trap level sensors reporting illegal combination of air/fluid.
+ ÑD air trap level sensors reporting illegal combination of air/fluid.
+
+
+
+ DG invalid calibration CRC.
+ ÑG invalid calibration CRC.
+
+
+
+ DG dialysate flow sensor invalid calibration record.
+ ÑG dialysate flow sensor invalid calibration record.
+
+
+
+ HD reports DG restarted fault.
+ ÑD reports DG restarted fault.
+
+
+
+ HD syringe pump ADC FPGA fault.
+ ÑD syringe pump ADC FPGA fault.
+
+
+
+ HD syringe pump volume check error.
+ ÑD syringe pump volume check error.
+
+
+
+ HD syringe pump speed check error.
+ ÑD syringe pump speed check error.
+
+
+
+ HD syringe pump not stopped in off state error.
+ ÑD syringe pump not stopped in off state error.
+
+
+
+ DG Drain pump current out of range.
+ ÑG Drain pump current out of range.
+
+
+
+ HD venous air bubble detector self-test failure.
+ ÑD venous air bubble detector self-test failure.
+
+
+
+ DG temperature sensor out of range.
+ ÑG temperature sensor out of range.
+
+
+
+ HD UI SD card failure.
+ ÑD UI SD card failure.
+
+
+
+ DG CAN message not acked.
+ ÑG CAN message not acked.
+
+
+
+ DG RTC config error.
+ ÑG RTC config error.
+
+
+
+ DG RTC battery low error.
+ ÑG RTC battery low error.
+
+
+
+ HD pre-treatment mode wet self-test prime check failure.
+ ÑD pre-treatment mode wet self-test prime check failure.
+
+
+
+ DG main primary heater voltage out of range.
+ ÑG main primary heater voltage out of range.
+
+
+
+ DG small primary heater voltage out of range.
+ ÑG small primary heater voltage out of range.
+
+
+
+ DG trimmer heater voltage out of range.
+ ÑG trimmer heater voltage out of range.
+
+
+
+ HD end of treatment alarm (high priority).
+ ÑD end of treatment alarm (high priority).
+
+
+
+ HD blood sitting too long after treatment stopped by user alarm (>5 min).
+ ÑD blood sitting too long after treatment stopped by user alarm (>5 min).
+
+
+
+ HD blood leak detected alarm.
+ ÑD blood leak detected alarm.
+
+
+
+ HD venous pressure too low during treatment.
+ ÑD venous pressure too low during treatment.
+
+
+
+ HD venous air bubble detected alarm.
+ ÑD venous air bubble detected alarm.
+
+
+
+ HD blood leak recovering please wait.
+ ÑD blood leak recovering please wait.
+
+
+
+ HD venous pressure too high during treatment.
+ ÑD venous pressure too high during treatment.
+
+
+
+ HD arterial pressure too low during treatment.
+ ÑD arterial pressure too low during treatment.
+
+
+
+ HD arterial pressure too high during treatment.
+ ÑD arterial pressure too high during treatment.
+
+
+
+ DG fluid leak detected alarm.
+ ÑG fluid leak detected alarm.
+
+
+
+ HD fluid leak detected alarm.
+ ÑD fluid leak detected alarm.
+
+
+
+ HD experienced large acceleration.
+ ÑD experienced large acceleration.
+
+
+
+ DG experienced large acceleration.
+ ÑG experienced large acceleration.
+
+
+
+ HD tilt exceeds maximum.
+ ÑD tilt exceeds maximum.
+
+
+
+ DG tilt exceeds maximum.
+ ÑG tilt exceeds maximum.
+
+
+
+ HD AC power lost alarm.
+ ÑD AC power lost alarm.
+
+
+
+ HD DG communication timeout.
+ ÑD DG communication timeout.
+
+
+
+ HD air trap fill timeout during treatment.
+ ÑD air trap fill timeout during treatment.
+
+
+
+ HD blood pump occlusion detected.
+ ÑD blood pump occlusion detected.
+
+
+
+ DG dialysate temperature sensors out of range.
+ ÑG dialysate temperature sensors out of range.
+
+
+
+ DG cleaning mode inlet water conductivity out of high range.
+ ÑG cleaning mode inlet water conductivity out of high range.
+
+
+
+ DG concentrate conductivity after adding acid out of range alarm.
+ ÑG concentrate conductivity after adding acid out of range alarm.
+
+
+
+ DG RTC or timer accuracy failure.
+ ÑG RTC or timer accuracy failure.
+
+
+
+ DG wait for the DG to produce dialysate.
+ ÑG wait for the DG to produce dialysate.
+
+
+
+ DG Cleaning mode inlet water temperature too high.
+ ÑG Cleaning mode inlet water temperature too high.
+
+
+
+ HD watchdog expired.
+ ÑD watchdog expired.
+
+
+
+ DG inlet water conductivity in high range.
+ ÑG inlet water conductivity in high range.
+
+
+
+ DG inlet water conductivity in low range.
+ ÑG inlet water conductivity in low range.
+
+
+
+ DG inlet water pressure in low range.
+ ÑG inlet water pressure in low range.
+
+
+
+ HD prime completed high priority alarm.
+ ÑD prime completed high priority alarm.
+
+
+
+ DG cleaning mode inlet water conductivity out of low range.
+ ÑG cleaning mode inlet water conductivity out of low range.
+
+
+
+ HD No reservoirs data message receive at least once every 2 seconds.
+ ÑD No reservoirs data message receive at least once every 2 seconds.
+
+
+
+ HD No DG operation mode message receive at least once every 2 seconds.
+ ÑD No DG operation mode message receive at least once every 2 seconds.
+
+
+
+ DG chemical disinfect prime acid line timeout.
+ ÑG chemical disinfect prime acid line timeout.
+
+
+
+ DG inlet water temperature is in the low range.
+ ÑG inlet water temperature is in the low range.
+
+
+
+ DG chemical disinfect flush remove acid and close the concentrate cap.
+ ÑG chemical disinfect flush remove acid and close the concentrate cap.
+
+
+
+ HD blood pump rotor speed too high.
+ ÑD blood pump rotor speed too high.
+
+
+
+ DG comm too many bad CRCs.
+ ÑG comm too many bad CRCs.
+
+
+
+ DG FPGA clock speed check failure.
+ ÑG FPGA clock speed check failure.
+
+
+
+ HD sees primary load cell for reservoir 1 change too much too fast.
+ ÑD sees primary load cell for reservoir 1 change too much too fast.
+
+
+
+ HD sees primary load cell for reservoir 2 change too much too fast.
+ ÑD sees primary load cell for reservoir 2 change too much too fast.
+
+
+
+ HD in treatment rinseback operation timeout.
+ ÑD in treatment rinseback operation timeout.
+
+
+
+
+
+ Test alarm, clear top only.
+ Ñest alarm, clear top only.
+
+
+
+ HD cartridge door opened alarm.
+ ÑD cartridge door opened alarm.
+
+
+
+ DG Dialysate flow rate out of maximum range.
+ ÑG Dialysate flow rate out of maximum range.
+
+
+
+ HD syringe empty alarm.
+ ÑD syringe empty alarm.
+
+
+
+ HD syringe pump occlusion alarm.
+ ÑD syringe pump occlusion alarm.
+
+
+
+ HD syringe pump not enough Heparin alarm.
+ ÑD syringe pump not enough Heparin alarm.
+
+
+
+ HD RTC configuration error.
+ ÑD RTC configuration error.
+
+
+
+ HD RTC or timer accuracy failure.
+ ÑD RTC or timer accuracy failure.
+
+
+
+ HD pump direction status error.
+ ÑD pump direction status error.
+
+
+
+ DG software fault.
+Software found itself in an unexpected state.
+ ÑG software fault.
+Software found itself in an unexpected state.
+
+
+
+ HD communication timeout.
+ ÑD communication timeout.
+
+
+
+ DG FPGA communication down for too long.
+ ÑG FPGA communication down for too long.
+
+
+
+ DG RO flow out of maximum range.
+ ÑG RO flow out of maximum range.
+
+
+
+ DG load cells weight out of range for tare.
+ ÑG load cells weight out of range for tare.
+
+
+
+ DG load cells invalid calibration.
+ ÑG load cells invalid calibration.
+
+
+
+ DG invalid load cell value.
+ ÑG invalid load cell value.
+
+
+
+ DG inlet UV reactor not healthy.
+ ÑG inlet UV reactor not healthy.
+
+
+
+ DG fan RPM out of range.
+ ÑG fan RPM out of range.
+
+
+
+ DG concentrate pump fault.
+ ÑG concentrate pump fault.
+
+
+
+ DG concentrate pump CP1 speed control error.
+ ÑG concentrate pump CP1 speed control error.
+
+
+
+ DG concentrate pump CP2 speed control error.
+ ÑG concentrate pump CP2 speed control error.
+
+
+
+ DG drain pump RPM out of range.
+ ÑG drain pump RPM out of range.
+
+
+
+ DG drain pump off fault.
+ ÑG drain pump off fault.
+
+
+
+ DG flow rate out of upper range.
+ ÑG flow rate out of upper range.
+
+
+
+ DG flow rate out of lower range.
+ ÑG flow rate out of lower range.
+
+
+
+ HD blood pump partial occlusion detected.
+ ÑD blood pump partial occlusion detected.
+
+
+
+ DG RO pump duty cycle out of range.
+ ÑG RO pump duty cycle out of range.
+
+
+
+ DG RO pump pressure out of range.
+ ÑG RO pump pressure out of range.
+
+
+
+ DG CPi/CPo sensors FPGA fault.
+ ÑG CPi/CPo sensors FPGA fault.
+
+
+
+ DG CD1/CD2 sensors FPGA fault.
+ ÑG CD1/CD2 sensors FPGA fault.
+
+
+
+ DG RO flow too low while primary heater is on.
+ ÑG RO flow too low while primary heater is on.
+
+
+
+ DG Dialysate flow too low while trimmer heater is on.
+ ÑG Dialysate flow too low while trimmer heater is on.
+
+
+
+ DG thermistors/sensors temperature out of range.
+ ÑG thermistors/sensors temperature out of range.
+
+
+
+ HD pre-treatment mode wet self-test lc vs FMD failure.
+ ÑD pre-treatment mode wet self-test lc vs FMD failure.
+
+
+
+ HD pre-treatment mode dry pressure normal self-test failure.
+ ÑD pre-treatment mode dry pressure normal self-test failure.
+
+
+
+ DG fill conductivities acid/bicarb invalid calibration record.
+ ÑG fill conductivities acid/bicarb invalid calibration record.
+
+
+
+ DG RO rejection ratio out of range.
+ ÑG RO rejection ratio out of range.
+
+
+
+ DG conductivity sensor fault.
+ ÑG conductivity sensor fault.
+
+
+
+ DG dialysate fill runs out of time.
+ ÑG dialysate fill runs out of time.
+
+
+
+ DG flow meter check failure alarm.
+ ÑG flow meter check failure alarm.
+
+
+
+ HD venous pressure occlusion alarm.
+ ÑD venous pressure occlusion alarm.
+
+
+
+ DG drain circulation line timeout.
+ ÑG drain circulation line timeout.
+
+
+
+ HD battery pack detected an error.
+ ÑD battery pack detected an error.
+
+
+
+ HD blood sitting too long warning (>4 min).
+ ÑD blood sitting too long warning (>4 min).
+
+
+
+ HD end of treatment alarm (user not acting to end treatment).
+ ÑD end of treatment alarm (user not acting to end treatment).
+
+
+
+ HD prime completed medium priority alarm.
+ ÑD prime completed medium priority alarm.
+
+
+
+
+
+
+
+
+ Available for use.
+ Ñvailable for use.
+
+
+
+ HD end treatment sub-mode timeout alarm.
+ ÑD end treatment sub-mode timeout alarm.
+
+
+
+ HD syringe detected alarm.
+ ÑD syringe detected alarm.
+
+
+
+ HD syringe pump syringe removed alarm.
+ ÑD syringe pump syringe removed alarm.
+
+
+
+ DG THd sensors FPGA fault.
+ ÑG THd sensors FPGA fault.
+
+
+
+ HD Saline bag is empty.
+ ÑD Saline bag is empty.
+
+
+
+ HD occlusion sensor FPGA fault.
+ ÑD occlusion sensor FPGA fault.
+
+
+
+ HD arterial sensor FPGA fault.
+ ÑD arterial sensor FPGA fault.
+
+
+
+ HD treatment stopped by user action.
+ ÑD treatment stopped by user action.
+
+
+
+ HD end of treatment warning.
+ ÑD end of treatment warning.
+
+
+
+ HD prime completed low priority alarm.
+ ÑD prime completed low priority alarm.
+
+
+
+ HD time out on prime saline purge air state.
+ ÑD time out on prime saline purge air state.
+
+
+
+ HD prime dialysate dialyzer time out alarm.
+ ÑD prime dialysate dialyzer time out alarm.
+
+
+
+ HD prime dialysate bypass time out alarm.
+ ÑD prime dialysate bypass time out alarm.
+
+
+
+ HD pre-treatment mode dry pressure self-test failure.
+ ÑD pre-treatment mode dry pressure self-test failure.
+
+
+
+ HD pre-treatment mode wet self-test LC vs LC failure.
+ ÑD pre-treatment mode wet self-test LC vs LC failure.
+
+
+
+ DG barometric sensor coefficients bad CRC.
+ ÑG barometric sensor coefficients bad CRC.
+
+
+
+ DG inlet water pressure in high range.
+ ÑG inlet water pressure in high range.
+
+
+
+ HD in treatment stopped sub-mode after rinseback completed (no escalation).
+ ÑD in treatment stopped sub-mode after rinseback completed (no escalation).
+
+
+
+ HD needs new cartridge to be installed.
+ ÑD needs new cartridge to be installed.
+
+
+
+ HD no cartridge loaded or installed improperly alarm.
+ ÑD no cartridge loaded or installed improperly alarm.
+
+
+
+ HD fail to remove cartridge alarm.
+ ÑD fail to remove cartridge alarm.
+
+
+
+ DG bicarb conductivity out of range during bicarb pump check alarm.
+ ÑG bicarb conductivity out of range during bicarb pump check alarm.
+
+
+
+ DG reservoir drain time out.
+ ÑG reservoir drain time out.
+
+
+
+ DG reservoir fill time out.
+ ÑG reservoir fill time out.
+
+
+
+ DG reservoir leak time out.
+ ÑG reservoir leak time out.
+
+
+
+ DG cleaning mode temperature sensors difference out of range.
+ ÑG cleaning mode temperature sensors difference out of range.
+
+
+
+ DG heat disinfect target temperature time out (could not reach to temperature).
+ ÑG heat disinfect target temperature time out (could not reach to temperature).
+
+
+
+ DG cleaning mode conductivity sensors out of range.
+ ÑG cleaning mode conductivity sensors out of range.
+
+
+
+
+ Alarm Id available.
+ Ñlarm Id available.
+
+
+
+ DG chemical disinfect could not reach to target temperature out of range.
+ ÑG chemical disinfect could not reach to target temperature out of range.
+
+
+
+ DG chemical disinfect target conductivity out of range.
+ ÑG chemical disinfect target conductivity out of range.
+
+
+
+ DG chemical disinfect insert acid and remove the concentrate cap.
+ ÑG chemical disinfect insert acid and remove the concentrate cap.
+
+
+
+ HD invalid system record.
+ ÑD invalid system record.
+
+
+
+ HD invalid service record.
+ ÑD invalid service record.
+
+
+
+ DG invalid system record.
+ ÑG invalid system record.
+
+
+
+ DG invalid service record.
+ ÑG invalid service record.
+
+
+
+ HD and UI software builds are not compatible.
+ ÑD and UI software builds are not compatible.
+
+
+
+ HD processor is in Disinfect Chemical Flush mode.
+ ÑD processor is in Disinfect Chemical Flush mode.
+
+
+
+ HD invalid institutional record.
+ ÑD invalid institutional record.
+
+
+
+ HD UI POST OS version compatibility failure.
+ ÑD UI POST OS version compatibility failure.
+
+
+
+ HD temperatures out of range.
+ ÑD temperatures out of range.
+
+
+
+ HD UI POST Application Integrity (Sha256Sum) failure.
+ ÑD UI POST Application Integrity (Sha256Sum) failure.
+
+
+
+ HD UI POST CANBus failure.
+ ÑD UI POST CANBus failure.
+
+
+
+ HD UI POST Touch failure.
+ ÑD UI POST Touch failure.
+
+
+
+ HD UI POST SD-Card failure.
+ ÑD UI POST SD-Card failure.
+
+
+
+ HD UI POST RTC failure.
+ ÑD UI POST RTC failure.
+
+
+
+ HD UI POST WiFi failure.
+ ÑD UI POST WiFi failure.
+
+
+
+ HD UI POST Bluetooth failure.
+ ÑD UI POST Bluetooth failure.
+
+
+
+ HD UI POST Ethernet failure.
+ ÑD UI POST Ethernet failure.
+
+
+
+ HD UI POST Sound failure.
+ ÑD UI POST Sound failure.
+
+
+
+ HD POST Safety Shutdown failure.
+ ÑD POST Safety Shutdown failure.
+
+
+
+ DG POST Safety Shutdown failure.
+ ÑG POST Safety Shutdown failure.
+
+
+
+ HD Fan RPM out of range.
+ ÑD Fan RPM out of range.
+
+
+
+ DG inactive reservoir weight out of range.
+ ÑG inactive reservoir weight out of range.
+
+
+
+ HD arterial pressure sensor is reading out of range.
+ ÑD arterial pressure sensor is reading out of range.
+
+
+
+ HD venous pressure sensor is reading out of range.
+ ÑD venous pressure sensor is reading out of range.
+
+
+
+ HD BP occlusion sensor is reading out of range.
+ ÑD BP occlusion sensor is reading out of range.
+
+
+
+ HD active reservoir weight out of range.
+ ÑD active reservoir weight out of range.
+
+
+
+ DG dialysate drain time out.
+ ÑG dialysate drain time out.
+
+
+
+ DG drain pump direction invalid.
+ ÑG drain pump direction invalid.
+
+
+
+ Acid concentration bottle low volume alarm.
+ Ñcid concentration bottle low volume alarm.
+
+
+
+ Bicarbonate concentration bottle low volume alarm.
+ Ñicarbonate concentration bottle low volume alarm.
+
+
+
+ DG load cells weight out of range.
+ ÑG load cells weight out of range.
+
+
+
+ DG load cells primary/back up drift out of range.
+ ÑG load cells primary/back up drift out of range.
+
+
+
+ HD processor is in RO permeate sample mode.
+ ÑD processor is in RO permeate sample mode.
+
+
+
+ DG concentrate cap not in proper position.
+ ÑG concentrate cap not in proper position.
+
+
+
+ HD processor clock speed checks against FPGA clock failure.
+ ÑD processor clock speed checks against FPGA clock failure.
+
+
+
+ HD load cells primary/back up drift out of range.
+ ÑD load cells primary/back up drift out of range.
+
+
+
+ DG dialysate cap not closed.
+ ÑG dialysate cap not closed.
+
+
+
+ HD venous pressure sensor FPGA fault.
+ ÑD venous pressure sensor FPGA fault.
+
+
+
+ HD processor is in Disinfect Flush mode.
+ ÑD processor is in Disinfect Flush mode.
+
+
+
+ HD processor is in Disinfect Heat mode.
+ ÑD processor is in Disinfect Heat mode.
+
+
+
+ HD processor is in Disinfect Chemical mode.
+ ÑD processor is in Disinfect Chemical mode.
+
+
+
+ HD processor is in Disinfect active cool mode.
+ ÑD processor is in Disinfect active cool mode.
+
+
+
+ HD UI POST CloudSync failure.
+ ÑD UI POST CloudSync failure.
+
+
+
+ DG TDi sensors FPGA fault.
+ ÑG TDi sensors FPGA fault.
+
+
+
+ DG TRo sensors FPGA fault.
+ ÑG TRo sensors FPGA fault.
+
+
+
+ DG baro sensor FPGA fault.
+ ÑG baro sensor FPGA fault.
+
+
+
+ DG invalid serial number.
+ ÑG invalid serial number.
+
+
+
+ HD invalid serial number.
+ ÑD invalid serial number.
+
+
+
+ DG RO permeate sample remove the dialysate cap.
+ ÑG RO permeate sample remove the dialysate cap.
+
+
+
+ DG processor RAM error.
+ ÑG processor RAM error.
+
+
+
+ DG drain pump direction FPGA fault.
+ ÑG drain pump direction FPGA fault.
+
+
+
+ HD invalid usage record.
+ ÑD invalid usage record.
+
+
+
+ HD processor RAM error.
+ ÑD processor RAM error.
+
+
+
+ DG turn off inlet water valves.
+ ÑG turn off inlet water valves.
+
+
+
+ HD AC power lost second alarm.
+ ÑD AC power lost second alarm.
+
+
+
+ DG CPi conductivity sensor invalid character received.
+ ÑG CPi conductivity sensor invalid character received.
+
+
+
+ DG CPo conductivity sensor invalid character received.
+ ÑG CPo conductivity sensor invalid character received.
+
+
+
+ DG CD1 conductivity sensor invalid character received.
+ ÑG CD1 conductivity sensor invalid character received.
+
+
+
+ DG CD2 conductivity sensor invalid character received.
+ ÑG CD2 conductivity sensor invalid character received.
+
+
+
+ HD Dialysate In flow rate to too low.
+ ÑD Dialysate In flow rate to too low.
+
+
+
+ DG cleaning mode inlet water temperature too low.
+ ÑG cleaning mode inlet water temperature too low.
+
+
+
+ DG cleaning mode inlet water pressure too high.
+ ÑG cleaning mode inlet water pressure too high.
+
+
+
+ DG cleaning mode inlet water pressure too low.
+ ÑG cleaning mode inlet water pressure too low.
+
+
+
+
+ Alarm available.
+ Ñlarm available.
+
+
+
+ Alarm available for use.
+ Ñlarm available for use.
+
+
+
+ DG chemical disinfect flush flush sample.
+ ÑG chemical disinfect flush flush sample.
+
+
+
+ DG chemical disinfect flush sample timeout.
+ ÑG chemical disinfect flush sample timeout.
+
+
+
+ DG outlet UV reactor not healthy.
+ ÑG outlet UV reactor not healthy.
+
+
+
+ HD UI POST Year check failure.
+ ÑD UI POST Year check failure.
+
+
+
+ HD UI POST Configuration check failure.
+ ÑD UI POST Configuration check failure.
+
+
+
+ Total number of alarms.
+ Ñotal number of alarms.
+
+
+
+ ALARM_ID_UNDEFINED [%1]
+ ÑLARM_ID_UNDEFINED [%1]
+
+
+
+ SDCProgressItem
+
+
+ SD
+ ÑD
+
+
+
+ SettingsBluetoothCuff
+
+
+ Devices
+ Ñevices
+
+
+
+ SCAN
+ ÑCAN
+
+
+
+ SettingsDGCleaning
+
+
+ Last Basic Flush Complete
+ Ñast Basic Flush Complete
+
+
+
+ Last Chemical Disinfect Start
+ Ñast Chemical Disinfect Start
+
+
+
+ Last Chemical Disinfect Complete
+ Ñast Chemical Disinfect Complete
+
+
+
+ Last Chemical Disinfect Flush Complete
+ Ñast Chemical Disinfect Flush Complete
+
+
+
+ Last Heat Disinfect Complete
+ Ñast Heat Disinfect Complete
+
+
+
+ Proceed to Cleaning Mode
+ Ñroceed to Cleaning Mode
+
+
+
+ SettingsDGScheduling
+
+
+ Water Flush
+ Ñater Flush
+
+
+
+
+ Cycle (Days)
+ Ñycle (Days)
+
+
+
+ Heat Disinfection
+ Ñeat Disinfection
+
+
+
+ SettingsDateTime
+
+
+ Time (HH:MM)
+ Ñime (HH:MM)
+
+
+
+ :
+ Ñ
+
+
+
+ Date (MM/DD/YYYY)
+ Ñate (MM/DD/YYYY)
+
+
+
+
+ /
+ Ñ
+
+
+
+ SettingsDecommission
+
+
+ Do you want to perform the %1?
+ Ño you want to perform the %1?
+
+
+
+ Please wait ...
+ Ñlease wait ...
+
+
+
+ SettingsDeviceRegistration
+
+
+ UI Version
+ ÑI Version
+
+
+
+ HD Serial
+ ÑD Serial
+
+
+
+ DG Serial
+ ÑG Serial
+
+
+
+ Wireless
+ Ñireless
+
+
+
+ Ethernet
+ Ñthernet
+
+
+
+ Registration complete
+ Ñegistration complete
+
+
+
+ Cloud Service is running
+ Ñloud Service is running
+
+
+
+ Registering the device
+ Ñegistering the device
+
+
+
+ START
+ ÑTART
+
+
+
+ No Network Connection
+ Ño Network Connection
+
+
+
+ No device Serial
+ Ño device Serial
+
+
+
+ SettingsExportLogs
+
+
+ SD-Card
+ ÑD-Card
+
+
+
+ USB Drive
+ ÑSB Drive
+
+
+
+ Application
+ Ñpplication
+
+
+
+ Service
+ Ñervice
+
+
+
+ Treatment
+ Ñreatment
+
+
+
+ log export to USB in progress ...
+ Ñog export to USB in progress ...
+
+
+
+ log export to USB is complete
+ Ñog export to USB is complete
+
+
+
+ SettingsFactoryReset
+
+
+ Do you want to perform the %1?
+ Ño you want to perform the %1?
+
+
+
+ Please wait ...
+ Ñlease wait ...
+
+
+
+ SettingsHome
+
+
+ Clear Alarm Condition
+ Ñlear Alarm Condition
+
+
+
+ SettingsInformation
+
+
+ Versions
+ Ñersions
+
+
+
+ OS Version
+ ÑS Version
+
+
+
+ UI Version
+ ÑI Version
+
+
+
+ HD Version
+ ÑD Version
+
+
+
+ HD FPGA Version
+ ÑD FPGA Version
+
+
+
+ HD Serial Number
+ ÑD Serial Number
+
+
+
+ DG Version
+ ÑG Version
+
+
+
+ DG FPGA Version
+ ÑG FPGA Version
+
+
+
+ DG Serial Number
+ ÑG Serial Number
+
+
+
+ Service
+ Ñervice
+
+
+
+ HD Last Service Date
+ ÑD Last Service Date
+
+
+
+ HD Next Service Date
+ ÑD Next Service Date
+
+
+
+ DG Last Service Date
+ ÑG Last Service Date
+
+
+
+ DG Next Service Date
+ ÑG Next Service Date
+
+
+
+ Treatment
+ Ñreatment
+
+
+
+ Total Hours
+ Ñotal Hours
+
+
+
+ Hours Since Last Service
+ Ñours Since Last Service
+
+
+
+ Last Start
+ Ñast Start
+
+
+
+ Last Reset
+ Ñast Reset
+
+
+
+ SettingsLocalization
+
+
+ Language
+ Ñanguage
+
+
+
+ SettingsManufacturingSetup
+
+
+ Do you want to perform the %1?
+ Ño you want to perform the %1?
+
+
+
+ Please wait ...
+ Ñlease wait ...
+
+
+
+ SettingsROInput
+
+
+ Pure Water Mode
+ Ñure Water Mode
+
+
+
+ ON
+ ÑN
+
+
+
+ OFF
+ ÑFF
+
+
+
+ SettingsRootSSHAccess
+
+
+ Enable SSH Login
+ Ñnable SSH Login
+
+
+
+ Enable Root Login
+ Ñnable Root Login
+
+
+
+ SettingsServicePassword
+
+
+ Set Service Password
+ Ñet Service Password
+
+
+
+ Service Password
+ Ñervice Password
+
+
+
+ Incorrect password
+ Ñncorrect password
+
+
+
+ Mismatch Passwords
+ Ñismatch Passwords
+
+
+
+ Invalid Password
+ Ñnvalid Password
+
+
+
+ SettingsStack
+
+
+ Information
+ Ñnformation
+
+
+
+ Volume And Brightness
+ Ñolume And Brightness
+
+
+
+ Wi-Fi
+ Ñi-Fi
+
+
+
+ Bluetooth Cuff
+ Ñluetooth Cuff
+
+
+
+ DG Cleaning
+ ÑG Cleaning
+
+
+
+ DG Scheduling
+ ÑG Scheduling
+
+
+
+
+ Service
+ Ñervice
+
+
+
+ Date and Time
+ Ñate and Time
+
+
+
+ Export Logs
+ Ñxport Logs
+
+
+
+ Language
+ Ñanguage
+
+
+
+ Water Input Mode
+ Ñater Input Mode
+
+
+
+ Calibration
+ Ñalibration
+
+
+
+ Device Configuration
+ Ñevice Configuration
+
+
+
+ Device Registration
+ Ñevice Registration
+
+
+
+
+ Software Update
+ Ñoftware Update
+
+
+
+ Enable Root SSH
+ Ñnable Root SSH
+
+
+
+ Factory Reset
+ Ñactory Reset
+
+
+
+ Decommissioning
+ Ñecommissioning
+
+
+
+ Institutional Configurations
+ Ñnstitutional Configurations
+
+
+
+ Manufacturing Setup
+ Ñanufacturing Setup
+
+
+
+ Device Settings
+ Ñevice Settings
+
+
+
+ COMPLETE
+ ÑOMPLETE
+
+
+
+ SHUTDOWN
+ ÑHUTDOWN
+
+
+
+
+ Application POST Failed, please shutdown and retry
+ Ñpplication POST Failed, please shutdown and retry
+
+
+
+ SettingsVolumeBrightness
+
+
+ Brightness
+ Ñrightness
+
+
+
+ Alarm Volume
+ Ñlarm Volume
+
+
+
+ System Volume
+ Ñystem Volume
+
+
+
+ %
+ Ñ
+
+
+
+ SettingsWiFi
+
+
+ IP Address
+ ÑP Address
+
+
+
+ Gateway
+ Ñateway
+
+
+
+ Subnet Mask
+ Ñubnet Mask
+
+
+
+ DNS
+ ÑNS
+
+
+
+ SSID
+ ÑSID
+
+
+
+ SCAN
+ ÑCAN
+
+
+
+ Not Supported
+ Ñot Supported
+
+
+
+ Connected
+ Ñonnected
+
+
+
+ Do you want to disconnect from `%1`?
+ Ño you want to disconnect from `%1`?
+
+
+
+ Join
+ Ñoin
+
+
+
+ Password
+ Ñassword
+
+
+
+ Disconnect
+ Ñisconnect
+
+
+
+ Storage::Logger
+
+
+ The '%1' folder selected for the treatment reports
+ Ñhe '%1' folder selected for the treatment reports
+
+
+
+ Initializing log clean up
+ Ñnitializing log clean up
+
+
+
+ Remove Logs Ended: %1
+ Ñemove Logs Ended: %1
+
+
+
+ Storage::TreatmentLog
+
+
+
+ NONE
+ ÑONE
+
+
+
+
+
+
+ OFF
+ ÑFF
+
+
+
+ mL/min
+ ÑL/min
+
+
+
+ hour
+ Ñour
+
+
+
+ min
+ Ñin
+
+
+
+ mEq/L
+ ÑEq/L
+
+
+
+ C
+ Ñ
+
+
+
+ L
+ Ñ
+
+
+
+ mL
+ ÑL
+
+
+
+ IU/mL
+ ÑU/mL
+
+
+
+ mL/hr
+ ÑL/hr
+
+
+
+ mmHg
+ ÑmHg
+
+
+
+ Patient ID
+ Ñatient ID
+
+
+
+ Blood Flow Rate
+ Ñlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ Ñialysate Flow Rate
+
+
+
+ Treatment Duration
+ Ñreatment Duration
+
+
+
+ Actual Treatment Duration
+ Ñctual Treatment Duration
+
+
+
+ Acid ConcentrateType
+ Ñcid ConcentrateType
+
+
+
+ Bicarbonate Concentrate Type
+ Ñicarbonate Concentrate Type
+
+
+
+ Potassium Concentration
+ Ñotassium Concentration
+
+
+
+ Calcium Concentration
+ Ñalcium Concentration
+
+
+
+ Bicarbonate Concentration
+ Ñicarbonate Concentration
+
+
+
+ Sodium Concentration
+ Ñodium Concentration
+
+
+
+ Dialysate Temperature
+ Ñialysate Temperature
+
+
+
+ Dialyzer Type
+ Ñialyzer Type
+
+
+
+ Heparin Type
+ Ñeparin Type
+
+
+
+ Heparin Concentration
+ Ñeparin Concentration
+
+
+
+ Heparin Bolus Volume
+ Ñeparin Bolus Volume
+
+
+
+ Heparin Dispense Rate
+ Ñeparin Dispense Rate
+
+
+
+ Heparin Stop
+ Ñeparin Stop
+
+
+
+ Heparin Delivered Volume
+ Ñeparin Delivered Volume
+
+
+
+ Treatment Start DateTime
+ Ñreatment Start DateTime
+
+
+
+ Treatment End DateTime
+ Ñreatment End DateTime
+
+
+
+ Water Sample Test Result
+ Ñater Sample Test Result
+
+
+
+ Dialysate Volume Used
+ Ñialysate Volume Used
+
+
+
+ Prescribed UF Volume
+ Ñrescribed UF Volume
+
+
+
+ Target UF Volume
+ Ñarget UF Volume
+
+
+
+ Actual UF Volume
+ Ñctual UF Volume
+
+
+
+ Prescribed UF Rate
+ Ñrescribed UF Rate
+
+
+
+ Target UF Rate
+ Ñarget UF Rate
+
+
+
+ Actual UF Rate
+ Ñctual UF Rate
+
+
+
+ Saline Bolus Volume
+ Ñaline Bolus Volume
+
+
+
+ TimeEntry
+
+
+ Time
+ Ñime
+
+
+
+ :
+ Ñ
+
+
+
+ TreatmentAdjustmentDuration
+
+
+ TREATMENT DURATION
+ ÑREATMENT DURATION
+
+
+
+ TreatmentAdjustmentFlow
+
+
+ FLOWS
+ ÑLOWS
+
+
+
+ Blood Flow Rate
+ Ñlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ Ñialysate Flow Rate
+
+
+
+ TreatmentAdjustmentPressuresLimits
+
+
+ PRESSURES
+ ÑRESSURES
+
+
+
+ Arterial Window
+ Ñrterial Window
+
+
+
+ Venous Window
+ Ñenous Window
+
+
+
+ Venous Asymmetric
+ Ñenous Asymmetric
+
+
+
+ TreatmentAdjustmentUltrafiltrationConfirm
+
+
+ ULTRAFILTRATION VOLUME
+ ÑLTRAFILTRATION VOLUME
+
+
+
+ To confirm new UF Volume (%1),
+select a treatment adjustment:
+ Ño confirm new UF Volume (%1),
+select a treatment adjustment:
+
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ %1 UF Rate
+ Ñ1 UF Rate
+
+
+
+ The rate %3 by %1 %2,
+the treatment duration remains the same.
+ Ñhe rate %3 by %1 %2,
+the treatment duration remains the same.
+
+
+
+
+ UF Rate : %1 %2
+ ÑF Rate : %1 %2
+
+
+
+ %1 Treatment Duration
+ Ñ1 Treatment Duration
+
+
+
+ The rate remains, the treatment
+duration %2 by %1 minutes.
+ Ñhe rate remains, the treatment
+duration %2 by %1 minutes.
+
+
+
+ TreatmentAdjustmentUltrafiltrationEdit
+
+
+ ULTRAFILTRATION VOLUME
+ ÑLTRAFILTRATION VOLUME
+
+
+
+ NEXT
+ ÑEXT
+
+
+
+ TreatmentAdjustmentUltrafiltrationPaused
+
+
+ ULTRAFILTRATION VOLUME
+ ÑLTRAFILTRATION VOLUME
+
+
+
+ EDIT ULTRAFILTRATION VOLUME
+ ÑDIT ULTRAFILTRATION VOLUME
+
+
+
+ RESUME ULTRAFILTRATION
+ ÑESUME ULTRAFILTRATION
+
+
+
+ TreatmentAdjustmentUltrafiltrationStart
+
+
+ ULTRAFILTRATION VOLUME
+ ÑLTRAFILTRATION VOLUME
+
+
+
+ PAUSE ULTRAFILTRATION
+ ÑAUSE ULTRAFILTRATION
+
+
+
+ Note: Ultrafiltration needs to be paused to edit the volume.
+ Ñote: Ultrafiltration needs to be paused to edit the volume.
+
+
+
+ TreatmentBloodPrime
+
+
+ Blood Priming
+ Ñlood Priming
+
+
+
+ TreatmentFlowBase
+
+
+ TreatmentFlowBase
+ ÑreatmentFlowBase
+
+
+
+ TreatmentFlows
+
+
+ FLOWS
+ ÑLOWS
+
+
+
+ Blood
+ Ñlood
+
+
+
+ Dialysate
+ Ñialysate
+
+
+
+ TreatmentFluid
+
+
+ FLUID MANAGEMENT
+ ÑLUID MANAGEMENT
+
+
+
+ Volume Delivered
+ Ñolume Delivered
+
+
+
+ (%1 %2)
+ Ñ%1 %2)
+
+
+
+ Cumulative Delivered
+ Ñumulative Delivered
+
+
+
+ TreatmentHeparin
+
+
+ HEPARIN DELIVERY
+ ÑEPARIN DELIVERY
+
+
+
+
+ OFF
+ ÑFF
+
+
+
+ PAUSE HEPARIN
+ ÑAUSE HEPARIN
+
+
+
+ RESUME DELIVERY
+ ÑESUME DELIVERY
+
+
+
+ Maximum Cumulative Heparin Volume Delivered
+ Ñaximum Cumulative Heparin Volume Delivered
+
+
+
+ Bolus Active
+ Ñolus Active
+
+
+
+ Syringe Empty
+ Ñyringe Empty
+
+
+
+
+ Ñone
+
+
+
+ Delivery Stopped
+ Ñelivery Stopped
+
+
+
+ Delivery Paused
+ Ñelivery Paused
+
+
+
+ Dispensing Active
+ Ñispensing Active
+
+
+
+ HEPARIN
+ ÑEPARIN
+
+
+
+ TreatmentHome
+
+
+ Interval:
+ Ñnterval:
+
+
+
+ min
+ Ñin
+
+
+
+ OFF
+ ÑFF
+
+
+
+ Last Read:
+ Ñast Read:
+
+
+
+ TreatmentPressures
+
+
+ PRESSURE
+ ÑRESSURE
+
+
+
+ (mmHg)
+ ÑmmHg)
+
+
+
+ Arterial
+ Ñrterial
+
+
+
+ Venous
+ Ñenous
+
+
+
+ TreatmentSaline
+
+
+ START BOLUS
+ ÑTART BOLUS
+
+
+
+ STOP BOLUS
+ ÑTOP BOLUS
+
+
+
+ Maximum cumulative saline bolus volume delivered
+ Ñaximum cumulative saline bolus volume delivered
+
+
+
+ SALINE BOLUS
+ ÑALINE BOLUS
+
+
+
+ TreatmentStack
+
+
+ Ultrafiltration Paused
+ Ñltrafiltration Paused
+
+
+
+ Treatment
+ Ñreatment
+
+
+
+ Trending
+ Ñrending
+
+
+
+ Settings
+ Ñettings
+
+
+
+ VITALS
+ ÑITALS
+
+
+
+ TreatmentTime
+
+
+ Time Remaining
+ Ñime Remaining
+
+
+
+ Treatment Paused
+ Ñreatment Paused
+
+
+
+ TreatmentUltrafiltration
+
+
+ ULTRAFILTRATION VOLUME
+ ÑLTRAFILTRATION VOLUME
+
+
+
+ (%1 %2)
+ Ñ%1 %2)
+
+
+
+ TreatmentVitals
+
+
+ VITALS
+ ÑITALS
+
+
+
+ USBProgressItem
+
+
+ USB
+ ÑSB
+
+
+
+ UltrafiltrationButton
+
+
+ Invalid
+ Ñnvalid
+
+
+
+ Increase
+ Ñncrease
+
+
+
+ Decrease
+ Ñecrease
+
+
+
+ Due to out of range adjustment, this option
+is disabled.
+ Ñue to out of range adjustment, this option
+is disabled.
+
+
+
+ UserConfirmation
+
+
+ Current
+ Ñurrent
+
+
+
+ New
+ Ñew
+
+
+
+ Confirm
+ Ñonfirm
+
+
+
+ VAlarmStatus
+
+
+ Suppressing HD communication timeout.
+ Ñuppressing HD communication timeout.
+
+
+
+ Alarm
+ Ñlarm
+
+
+
+ VDevice
+
+
+
+ Not enough secure information provided
+ Ñot enough secure information provided
+
+
+
+ Variables
+
+
+ CREATE
+ ÑREATE
+
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ PRIME
+ ÑRIME
+
+
+
+ BEGIN
+ ÑEGIN
+
+
+
+ min
+ Ñin
+
+
+
+ mL/min
+ ÑL/min
+
+
+
+ mL/hr
+ ÑL/hr
+
+
+
+ mmHg
+ ÑmHg
+
+
+
+ BPM
+ ÑPM
+
+
+
+ (L)
+ ÑL)
+
+
+
+ mL
+ ÑL
+
+
+
+ °C
+ ÑC
+
+
+
+ mEq/L
+ ÑEq/L
+
+
+
+ IU/mL
+ ÑU/mL
+
+
+
+ View::VAdjustmentAlarmVolume
+
+
+ The alarm volume change request has been rejected [%1]
+ Ñhe alarm volume change request has been rejected [%1]
+
+
+
+ View::VAdjustmentInstitutionalRecord
+
+
+ Enabled
+ Ñnabled
+
+
+
+ Disabled
+ Ñisabled
+
+
+
+ Blood Flow Rate
+ Ñlood Flow Rate
+
+
+
+ Dialysate Flow Rate
+ Ñialysate Flow Rate
+
+
+
+ Treatment Duration
+ Ñreatment Duration
+
+
+
+ Heparin Stop
+ Ñeparin Stop
+
+
+
+ Saline Bolus Volume
+ Ñaline Bolus Volume
+
+
+
+ Dialysate Temperature
+ Ñialysate Temperature
+
+
+
+ Arterial Pressure Limit
+ Ñrterial Pressure Limit
+
+
+
+ Venous Pressure Limit
+ Ñenous Pressure Limit
+
+
+
+ Venous Asym Pressure Limit
+ Ñenous Asym Pressure Limit
+
+
+
+ Prescribed UF Volume
+ Ñrescribed UF Volume
+
+
+
+ Heparin Dispense Rate
+ Ñeparin Dispense Rate
+
+
+
+ Heparin Bolus Volume
+ Ñeparin Bolus Volume
+
+
+
+ Chemical Disinfect
+ Ñhemical Disinfect
+
+
+
+
+ mL/min
+ ÑL/min
+
+
+
+
+ min
+ Ñin
+
+
+
+
+ mL
+ ÑL
+
+
+
+ C
+ Ñ
+
+
+
+
+
+ mmHg
+ ÑmHg
+
+
+
+ L
+ Ñ
+
+
+
+ mL/hr
+ ÑL/hr
+
+
+
+ View::VAdjustmentResponseBase
+
+
+ [%1] Unknown Error
+ Ñ%1] Unknown Error
+
+
+
+ View::VAlarmActiveList
+
+
+ No Active Alarm List
+%1
+ Ño Active Alarm List
+%1
+
+
+
+ View::VBluetooth
+
+
+ Bluetooth reconnected.
+ Ñluetooth reconnected.
+
+
+
+ Bluetooth paired and connected.
+ Ñluetooth paired and connected.
+
+
+
+ Bluetooth paired and disconnected.
+ Ñluetooth paired and disconnected.
+
+
+
+ BluetoothInterface Closed
+ ÑluetoothInterface Closed
+
+
+
+ The Bluetooth Adapter Is Ready %1
+ Ñhe Bluetooth Adapter Is Ready %1
+
+
+
+ The Bluetooth Adapter Connected
+ Ñhe Bluetooth Adapter Connected
+
+
+
+ The Bluetooth Adapter Disconnected
+ Ñhe Bluetooth Adapter Disconnected
+
+
+
+ No Valid Bluetooth Adapter
+ Ño Valid Bluetooth Adapter
+
+
+
+ The Bluetooth Adapter POST Failed
+ Ñhe Bluetooth Adapter POST Failed
+
+
+
+ The Bluetooth Adapter Is Off
+ Ñhe Bluetooth Adapter Is Off
+
+
+
+ The Bluetooth Adapter IO Error
+ Ñhe Bluetooth Adapter IO Error
+
+
+
+ The Bluetooth Adapter Unknown Error
+ Ñhe Bluetooth Adapter Unknown Error
+
+
+
+ No Valid device found
+ Ño Valid device found
+
+
+
+ Scanning ...
+ Ñcanning ...
+
+
+
+ Scanning Rejected
+ Ñcanning Rejected
+
+
+
+ Device Discovering ...
+ Ñevice Discovering ...
+
+
+
+ Blood Pressure Device Found
+ Ñlood Pressure Device Found
+
+
+
+ Scanning Stopped
+ Ñcanning Stopped
+
+
+
+ Scanning Finished
+ Ñcanning Finished
+
+
+
+ Device Initializing ...
+ Ñevice Initializing ...
+
+
+
+ Device Initialization Error
+ Ñevice Initialization Error
+
+
+
+ Device Connecting ...
+ Ñevice Connecting ...
+
+
+
+ Device Waiting For Measurement ...
+ Ñevice Waiting For Measurement ...
+
+
+
+ Device Connection Error
+ Ñevice Connection Error
+
+
+
+ Device Connected
+ Ñevice Connected
+
+
+
+ Device Clean Up
+ Ñevice Clean Up
+
+
+
+ Device In Power Saving Mode
+ Ñevice In Power Saving Mode
+
+
+
+ Service Scanning ...
+ Ñervice Scanning ...
+
+
+
+ Service Error: %1
+ Ñervice Error: %1
+
+
+
+ Service Invalid
+ Ñervice Invalid
+
+
+
+ Service Discovered
+ Ñervice Discovered
+
+
+
+ Service Detail Discovering ...
+ Ñervice Detail Discovering ...
+
+
+
+ Service Detail Error
+ Ñervice Detail Error
+
+
+
+ Service Detail Done
+ Ñervice Detail Done
+
+
+
+ Service Clean Up
+ Ñervice Clean Up
+
+
+
+ Service Characteristic Changed
+ Ñervice Characteristic Changed
+
+
+
+ Service Characteristic Read
+ Ñervice Characteristic Read
+
+
+
+ Service Characteristic Write
+ Ñervice Characteristic Write
+
+
+
+ Service Descriptor Read
+ Ñervice Descriptor Read
+
+
+
+ Service Descriptor Write
+ Ñervice Descriptor Write
+
+
+
+ View::VConfirm
+
+
+ Shutdown
+ Ñhutdown
+
+
+
+ Are you sure you want to Shutdown?
+ Ñre you sure you want to Shutdown?
+
+
+
+ SHUTDOWN
+ ÑHUTDOWN
+
+
+
+
+ CANCEL
+ ÑANCEL
+
+
+
+ Confirm
+ Ñonfirm
+
+
+
+ Are you sure?
+ Ñre you sure?
+
+
+
+ CONFIRM
+ ÑONFIRM
+
+
+
+ View::VDateTime
+
+
+ SetDateTime %1
+ ÑetDateTime %1
+
+
+
+ Not Set
+ Ñot Set
+
+
+
+ Succeed
+ Ñucceed
+
+
+
+ Failed
+ Ñailed
+
+
+
+ Good Morning
+ Ñood Morning
+
+
+
+ Good Afternoon
+ Ñood Afternoon
+
+
+
+ Good Evening
+ Ñood Evening
+
+
+
+ View::VDuetRoWaterDG
+
+
+ The RO Water Mode change request has been rejected [%1]
+ Ñhe RO Water Mode change request has been rejected [%1]
+
+
+
+ View::VNetworkModel
+
+
+ Scanning...
+ Ñcanning...
+
+
+
+ Scan Finished
+ Ñcan Finished
+
+
+
+ Connecting to %1...
+ Ñonnecting to %1...
+
+
+
+ Disconnecting from %1...
+ Ñisconnecting from %1...
+
+
+
+ Connected to %1.
+ Ñonnected to %1.
+
+
+
+ Disconnected from %1.
+ Ñisconnected from %1.
+
+
+
+ No Ethernet
+ Ño Ethernet
+
+
+
+ No WiFi
+ Ño WiFi
+
+
+
+ WiFi Disconnect
+ ÑiFi Disconnect
+
+
+
+ Successfully set the IP address.
+ Ñuccessfully set the IP address.
+
+
+
+ Successfully set the gateway.
+ Ñuccessfully set the gateway.
+
+
+
+ Successfully set the subnet mask.
+ Ñuccessfully set the subnet mask.
+
+
+
+ Successfully set the DNS.
+ Ñuccessfully set the DNS.
+
+
+
+ View::VTreatmentCreate
+
+
+
+
+
+ OFF
+ ÑFF
+
+
+
+
+
+
+ NONE
+ ÑONE
+
+
+
+ View::VTreatmentVitals
+
+
+ Vital received,%1,%2,%3
+ Ñital received,%1,%2,%3
+
+
+
+ Vital Confirmed,%1,%2,%3
+ Ñital Confirmed,%1,%2,%3
+
+
+
+ Vital Skipped
+ Ñital Skipped
+
+
+
+ WifiInterface
+
+
+ %1.Obtaining IP Address.%1
+ Ñ1.Obtaining IP Address.%1
+
+
+
+ Failed to disconnect from %1
+ Ñailed to disconnect from %1
+
+
+
+ Failed to set static IP Address
+ Ñailed to set static IP Address
+
+
+
+ Failed to set gateway.
+ Ñailed to set gateway.
+
+
+
+ Failed to set subnet mask.
+ Ñailed to set subnet mask.
+
+
+
+ Failed to set DNS.
+ Ñailed to set DNS.
+
+
+
+ main
+
+
+ Treatment
+ Ñreatment
+
+
+
+ Manager
+ Ñanager
+
+
+
+ Settings
+ Ñettings
+
+
+
+ Show the Can Frame Output
+ Ñhow the Can Frame Output
+
+
+
+ Show the Message Output
+ Ñhow the Message Output
+
+
+
+ Show the Logs Output
+ Ñhow the Logs Output
+
+
+
+ Enable send low priority, empty message on the CANBus just to keep UI board CAN driver awake
+ Ñnable send low priority, empty message on the CANBus just to keep UI board CAN driver awake
+
+
+
+ Test fake message interval(ms)
+ Ñest fake message interval(ms)
+
+
+
+ interval
+ Ñnterval
+
+
+
+ Test fake message data
+will use default sequenced long fake message if set to 00(default)
+will used only if correct integer value assigned for interval option
+ Ñest fake message data
+will use default sequenced long fake message if set to 00(default)
+will used only if correct integer value assigned for interval option
+
+
+
+ data
+ Ñata
+
+
+
+ Test fake message sequence at the beginning of the frame
+ Ñest fake message sequence at the beginning of the frame
+
+
+
+ Disable unhandled messages report as an error in the log
+ Ñisable unhandled messages report as an error in the log
+
+
+
+ Disable the Dialin messages logged as unhandled
+ Ñisable the Dialin messages logged as unhandled
+
+
+
+ Disables HD communication timeout
+ Ñisables HD communication timeout
+
+
+
+ Disables alarm no minimize
+ Ñisables alarm no minimize
+
+
+
+ disable-sd-card-fail-log-stop
+ Ñisable-sd-card-fail-log-stop
+
+
+
+ disable-cloudsync-fail-stop
+ Ñisable-cloudsync-fail-stop
+
+
+
+ Disables Check-In Log
+ Ñisables Check-In Log
+
+
+
+ Disables Acknowledgment Log
+ Ñisables Acknowledgment Log
+
+
+
+ Enables Dry-Demo Mode
+ Ñnables Dry-Demo Mode
+
+
+
+ Sets the Active CANBus [Shall start with 'can' or 'vcan]
+ Ñets the Active CANBus [Shall start with 'can' or 'vcan]
+
+
+
+ CANBus
+ ÑANBus
+
+
+
+ Enables the manufacturing mode to configure the system for the first time.
+ Ñnables the manufacturing mode to configure the system for the first time.
+
+
+
+ In case the application is not in Manufacturing Setup but needs to use root home folder for configurations.
+ Ñn case the application is not in Manufacturing Setup but needs to use root home folder for configurations.
+
+
+
+ Enables the update mode to update only necessary files during the update and keep the rest.
+ Ñnables the update mode to update only necessary files during the update and keep the rest.
+
+
+
+ Use the log long file name format
+<date>_<time>_<serial>_<mode>
+ Ñse the log long file name format
+<date>_<time>_<serial>_<mode>
+
+
+
+ Use the log cloud upload
+ Ñse the log cloud upload
+
+
+
+ Use the log compression
+ Ñse the log compression
+
+
+
+ tst_acknow
+
+
+ Connected
+ Ñonnected
+
+
+
+ Disconnected
+ Ñisconnected
+
+
+
+ tst_canbus
+
+
+ Connection
+ Ñonnection
+
+
+
+ Connected
+ Ñonnected
+
+
+
+ Disconnected
+ Ñisconnected
+
+
+
+ tst_models
+
+
+ ALARM_ID_UNDEFINED [-1]
+ ÑLARM_ID_UNDEFINED [-1]
+
+
+
+ ALARM_ID_UNDEFINED [599]
+ ÑLARM_ID_UNDEFINED [599]
+
+
+
+ tst_views
+
+
+ REQUEST_REJECT_REASON_INVALID_TREATMENT_STATE
+ ÑEQUEST_REJECT_REASON_INVALID_TREATMENT_STATE
+
+
+
+ REQUEST_REJECT_REASON_UF_NOT_IN_PROGESS
+ ÑEQUEST_REJECT_REASON_UF_NOT_IN_PROGESS
+
+
+
+ REQUEST_REJECT_REASON_UF_NOT_PAUSED
+ ÑEQUEST_REJECT_REASON_UF_NOT_PAUSED
+
+
+
\ No newline at end of file
Index: sources/ApplicationController.cpp
===================================================================
diff -u -r4947841e8cdd7e72d4fe26e604f7e5061fb86d64 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/ApplicationController.cpp (.../ApplicationController.cpp) (revision 4947841e8cdd7e72d4fe26e604f7e5061fb86d64)
+++ sources/ApplicationController.cpp (.../ApplicationController.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -162,12 +162,6 @@
connect(&_settingsWatcher, SIGNAL(finished ()),
this , SLOT(onSettingsUpdate()));
-// connect(&_settingsWatcher, SIGNAL(finished ()),
-// this , SLOT(onLoadTranslation()));
-
-
-
-
// Device Signal/Slots
DEVICE_APP_INIT_CONNECTIONS_LIST
@@ -532,14 +526,10 @@
*/
void ApplicationController::initSettings()
{
- // That is enough to call to the I function here to create the object in the thread that Settings is leaving in,
- // which currently is Application_Thread, since the Settings is created in that thread.
- _Settings;
-
QFuture mFuture = QtConcurrent::run( [=]() -> int { // made the call a lambda to make sure there is no function to accidentally being called, out of thread [developer safety].
//TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
Storage::Settings settings;
- return settings.read();
+ return settings.readConfigurations();
});
_settingsWatcher.setFuture(mFuture);
}
@@ -778,10 +768,3 @@
institutionalRequest (); // send HD the institutional record request
emit didPOSTPass (_post.isDone( )); // GuiController -> GuiView : didPOSTPass(bool)
}
-
-void ApplicationController::onLoadTranslation()
-{
- Storage::Settings settings;
- settings.loadTranslation();
-}
-
Index: sources/ApplicationController.h
===================================================================
diff -u -ra522e6aa7a36ac696a9a956200e89d838f319e25 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/ApplicationController.h (.../ApplicationController.h) (revision a522e6aa7a36ac696a9a956200e89d838f319e25)
+++ sources/ApplicationController.h (.../ApplicationController.h) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -128,7 +128,6 @@
void onLogIOFail();
void onTreatmentRangesDone(bool vPass);
- void onLoadTranslation ();
signals:
void didPOSTOSVersion (bool vPass);
Index: sources/device/DeviceController.cpp
===================================================================
diff -u -r5687815256ae070a9a207107088e3f72dd464da0 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/device/DeviceController.cpp (.../DeviceController.cpp) (revision 5687815256ae070a9a207107088e3f72dd464da0)
+++ sources/device/DeviceController.cpp (.../DeviceController.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -12,1305 +12,1304 @@
* \date (original) 03-Jun-2021
*
*/
-#include "DeviceController.h"
-
-// Linux
-#include
-#include
-
-// Qt
-#include
-#include
-#include
-
-// Project
-#include "Threads.h"
-#include "StorageGlobals.h"
-#include "Logger.h"
-#include "CloudSyncController.h"
-#include "ApplicationController.h"
-#include "FileHandler.h"
-#include "DeviceModels.h"
-#include "Settings.h"
-#include "encryption.h"
-
-// namespace
-using namespace Model;
-using namespace Device;
-using namespace Storage;
-
-/*!
- * \brief DeviceController::DeviceController
- * \details Constructor
- * \param parent - QObject parent owner object.
- * Qt handles the children destruction by their parent objects life-cycle.
- */
-DeviceController::DeviceController(QObject *parent) : QObject(parent) {
- _fileSystemWatcher.setParent(this);
- DEVICE_DEV_PARENT_LIST
-}
-
-/*!
- * \brief DeviceController::init
- * \details Initializes the class by setting the connections and starting the timer
- * \return False if it has been called before.
- */
-bool DeviceController::init()
-{
- if ( _init ) return false;
- _init = true;
-
- // runs in DeviceController thread
- initConnections();
- startTimer(_interval);
-
- return true;
-}
-
-/*!
- * \brief DeviceController::init
- * \details Initialized the Class by calling the init() method first
- * And initializes the thread vThread by calling initThread
- * on success init().
- * \param vThread - the thread
- * \return returns the return value of the init() method
- */
-bool DeviceController::init(QThread &vThread)
-{
- if ( ! init() ) return false;
- initThread(vThread);
- return true;
-}
-
-/*!
- * \brief DeviceController::quit
- * \details quits the class
- * Calls quitThread
- */
-void DeviceController::quit()
-{
- quitThread();
-}
-
-
-/*!
- * \brief DeviceController::initConnections
- * \details Initializes the required signal/slot connection between this class and other objects
- * to be able to communicate.
- */
-void DeviceController::initConnections()
-{
- connect(&_ApplicationController , SIGNAL(didUSBDriveUmount()),
- this , SLOT( onUSBDriveUmount()));
-
- connect(this , SIGNAL(didScreenshot(const QImage &, const QString &)),
- this , SLOT( onScreenshot(const QImage &, const QString &)));
-
- connect(&_fileSystemWatcher , SIGNAL( fileChanged(const QString &)),
- this , SLOT( onWatchFileChanged(const QString &)));
-
- connect(&_ApplicationController , SIGNAL(didPOSTOSVersionData (const QString &)),
- this , SLOT( onPOSTOSVersionData (const QString &)));
- connect(&_ApplicationController , SIGNAL(didPOSTEthernetData (const QString &)),
- this , SLOT( onPOSTEthernetData (const QString &)));
- connect(&_ApplicationController , SIGNAL(didPOSTWirelessData (const QString &)),
- this , SLOT( onPOSTWirelessData (const QString &)));
- connect(&_ApplicationController , SIGNAL(didPOSTBluetoothData (const QString &)),
- this , SLOT( onPOSTBluetoothData (const QString &)));
- connect(&_ApplicationController , SIGNAL(didPOSTCloudSyncData (const QString &)),
- this , SLOT( onPOSTCloudSyncData (const QString &)));
-
- connect(&_Logger , SIGNAL(didLogBackup (const QString &)),
- this , SLOT( onLogBackup (const QString &)));
- connect(&_CloudSyncController , SIGNAL(didLogUpload (const QString &)),
- this , SLOT( onLogUpload (const QString &)));
-
- DEVICE_DEV_INIT_CONNECTIONS_LIST
-
- connect(this, SIGNAL(didEventThreadChange()),
- this, SLOT( onEventThreadChange()));
-
-}
-
-/*!
- * \brief ApplicationController::initThread
- * \details Moves this object into the thread vThread.
- * And checks that this method is called from main thread.
- * Also connects quitThread to application aboutToQuit.
- * \param vThread - the thread
- */
-void DeviceController::initThread(QThread &vThread)
-{
- // runs in main thread
- Q_ASSERT_X(QThread::currentThread() == qApp->thread() , __func__, "The Class initialization must be done in Main Thread" );
- _thread = &vThread;
- _thread->setObjectName(QString("%1_Thread").arg(metaObject()->className()));
- connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(quit()));
- _thread->start();
- moveToThread(_thread);
-
- emit didEventThreadChange( QPrivateSignal() );
-}
-
-/*!
- * \brief DeviceController::quitThread
- * \details Moves this object to main thread to be handled by QApplication
- * And to be destroyed there.
- */
-void DeviceController::quitThread()
-{
- // disabled coco begin validated: Application termination is not correctly done in coco!!!
- // it has been tested and works perfectly fine in normal run.
-
- if ( ! _thread ) return;
-
- // runs in thread
- moveToThread(qApp->thread()); // validated
-}
-// disabled coco end
-
-/*!
- * \brief DeviceController::usbSeek
- * \details Tries to look for the available USB devices
- * Starts from sda1 to sdz1.
- * \note will only look for the first partition if there is any
- * \param vDevice - Found device (/dev/sda1)
- * \return true if a device found
- */
-bool DeviceController::usbSeek(QString &vDevice)
-{
- // disabled coco begin validated: Needed User Interaction so tested manually
- // This function cannot be tested on any device other than target
- // because only on device the usb is /dev/sdX# and others are mmcblk___
- // but on VM and normal Linuxes all drives are /dev/sdX# and cannot be identified as USB.
- // And the difference between how USB is detected and sd-card is that
- // for the USB we need to look into /dev/sdX#
- // but for the sd-card we look for the mounted path which is much easier.
- // That's why indication of the sd-card is more accurate than USB at least on VM.
- QString dev = "/dev/sd";
- QString device = "";
- for (char a = 'a'; a <= 'z'; a++) {
- device = dev + a + '1';
- if (QFileInfo::exists(device)) {
- vDevice = device;
- return true; // application is deciding on the first existing drive
- }
- }
- vDevice = device;
- return false;
- // disabled coco end
-}
-
-/*!
- * \brief DeviceController::driveSpaceCheck
- * \param vPath - Device mount point
- * \param vTotalBytes - Total volume size in bytes
- * \param vAvailableBytes - Size (in bytes) available for the current user
- * \param vPercent - The percentage of available space
- * \return - The drive mounted and ready
- * \note if device ejected manually system assumes it's still ready.
- */
-bool DeviceController::driveSpaceCheck(const QString &vPath, qint64 &vTotalBytes, qint64 &vAvailableBytes, bool *vIsReadOnly)
-{
- QStorageInfo storage(vPath);
- bool isReady = storage.isReady ();
- bool isReadOnly = storage.isReadOnly();
- bool isMounted = FileHandler::isMounted(vPath);
-
- if ( vIsReadOnly ) *vIsReadOnly = isReadOnly;
-
- if ( isReady ) {
- vTotalBytes = storage.bytesTotal();
- vAvailableBytes = storage.bytesAvailable();
- }
-
- if ( ! isMounted || ! isReady ) {
- isReady = false;
- vTotalBytes = 0;
- vAvailableBytes = 0;
- }
- return isReady;
-}
-
-/*!
- * \brief DeviceController::timerEvent
- * \details This event handler has been re-implemented in here
- * to receive timer events for the object
- * for the timer which has been set to _checkInterval
- * Runs the usbCheck on interval
- */
-void DeviceController::timerEvent(QTimerEvent *)
-{
-#ifdef BUILD_FOR_TARGET
- usbCheck();
- sdcardSpaceCheck();
-
- // The treatment logs are held in a separate partition from the unencrypted
- // logs and need a separate disk space usage check
- settingsPartitionSpaceCheck();
-#endif
- findPendingLogs();
-}
-
-/*!
- * \brief DeviceController::usbCheck
- * \details Runs usbSeek to mount or umount or remove it
- * regarding the state it's in.
- */
-void DeviceController::usbCheck()
-{
- QString device = "";
- usbSpaceCheck();
- if (usbSeek(device)) {
- if (! _umounted ) { // avoid to mount the USB which has just been unmounted
- if (! _mounted ) { // avoid to mount the USB which has just been mounted
- usbMount(device);
- }
- } else { // the umount is requested?
- usbUmount(USB_Mount_Point);
- }
- } else {
- if ( ! _removed ) {
- usbRemove();
- }
- }
-}
-
-/*!
- * \brief DeviceController::sdcardSpaceCheck
- * \details Checks for the SD-Card drive space.
- */
-void DeviceController::sdcardSpaceCheck()
-{
- static bool mInitialized = false;
- // Old Info ; // Current info
- static bool mOIsReady = false; bool mCIsReady = false;
- static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
- static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
- static quint8 mOPercent = 0; quint8 mCPercent = 0;
-
- qint64 mCTotal = 0;
-
- bool isMounted = FileHandler::isMounted(Storage::SDCard_Base_Path_Name);
- QString pathToCheckSpace = isMounted ? Storage::SDCard_Base_Path_Name : gStandard_tmp;
- mCIsReady = driveSpaceCheck(pathToCheckSpace, mCTotal, mCAvailable, &mCIsReadOnly);
-
- //DEBUG: qDebug()<< "Checking space for path of : " << pathToCheckSpace << " mCTotal " << mCTotal << " available " << mCAvailable;
-
- if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
- mOIsReadOnly = mCIsReadOnly;
- mOIsReady = mCIsReady;
- mInitialized = true;
- //DEBUG:0: qDebug() << " ~~~~~~~~~~ " << __FUNCTION__ << mInitialized << mCIsReady << mOIsReady << mCIsReadOnly << mOIsReadOnly;
- emit didSDCardStateChange(mCIsReady, mCIsReadOnly);
- }
- //NOTE: this if block has to be independent of the mOIsReady != mCIsReady
- // because current and old may be the same all the time and then this if block will not execute
- // and reaches to the log and fills the log unnecessarily.
- if (! mCIsReady ) {
- mOPercent = 0;
- mOAvailable = 0;
- emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- return;
- }
-
- mCPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
- if (mCPercent < _minRequiredAvailableSpacePercent) {
- LOG_DEBUG(QString("SD-CARD space lower than %1%").arg(_minRequiredAvailableSpacePercent));
- emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- emit didSDCardSpaceTooLow(_minRequiredAvailableSpacePercent);
- }
-
- //DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mOAvailable << mCAvailable << (mOAvailable == mCAvailable) << mOPercent << mCPercent << mCIsReadOnly;
- if (mOPercent != mCPercent || mOAvailable != mCAvailable ) {
- mOPercent = mCPercent ;
- mOAvailable = mCAvailable ;
- emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mCAvailable << mPercent ;
- }
-}
-
-/*!
- * \brief DeviceController::usbSpaceCheck
- * \details Checks for the USB drive space.
- */
-void DeviceController::usbSpaceCheck()
-{
- static bool mInitialized = false;
- // Old Info ; // Current info
- static bool mOIsReady = false; bool mCIsReady = false;
- static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
- static qint64 mOTotal = 0; qint64 mCTotal = 0;
- static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
-
- quint8 mPercent = 0;
-
- mCIsReady = driveSpaceCheck(Storage::USB_Mount_Point, mCTotal, mCAvailable, &mCIsReadOnly);
-#if BUILD_FOR_DESKTOP
- mCIsReady = true; // it is set to always true since on desktop a local folder is used for the USB folder which doesn't need (un)mount.
-#endif
- if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
- mOIsReadOnly = mCIsReadOnly;
- mOIsReady = mCIsReady;
- mInitialized = true;
- emit didUSBStateChange(mCIsReady, mCIsReadOnly);
-
- if (! mCIsReady ) {
- mOTotal = 0;
- mOAvailable = 0;
- emit didUSBSpaceChange(mCIsReady, mCTotal, mCAvailable, mPercent);
- return;
- }
- }
-
- mPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
- if (mOTotal != mCTotal || mOAvailable != mCAvailable) {
- mOTotal = mCTotal ;
- mOAvailable = mCAvailable ;
- emit didUSBSpaceChange(mCIsReady, mCTotal, mCAvailable, mPercent);
- }
-
- // DEBUG: qDebug() << "DeviceController::usbSpaceCheck"
- // << mCIsReady
- // << mCIsReadOnly
- // << mCTotal
- // << mCAvailable ;
-}
-
-/*!
- * \brief DeviceController::settingsPartitionSpaceCheck
- * \details Checks the disk space of the encrypted partition
- */
-void DeviceController::settingsPartitionSpaceCheck()
-{
- static bool mInitialized = false;
- // Old Info ; // Current info
- static bool mOIsReady = false; bool mCIsReady = false;
- static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
- static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
- static quint8 mOPercent = 0; quint8 mCPercent = 0;
-
- qint64 mCTotal = 0;
- mCIsReady = driveSpaceCheck(Storage::Settings_Path(), mCTotal, mCAvailable, &mCIsReadOnly);
-
- //DEBUG: qDebug()<< "Checking space for path of : " << Storage::Settings_Path() << " mCTotal " << mCTotal << " available " << mCAvailable;
-
- if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
- mOIsReadOnly = mCIsReadOnly;
- mOIsReady = mCIsReady;
- mInitialized = true;
- //DEBUG:0: qDebug() << " ~~~~~~~~~~ " << __FUNCTION__ << mInitialized << mCIsReady << mOIsReady << mCIsReadOnly << mOIsReadOnly;
- emit didSettingsPartitionStateChange(mCIsReady, mCIsReadOnly);
- }
- //NOTE: this if block has to be independent of the mOIsReady != mCIsReady
- // because current and old may be the same all the time and then this if block will not execute
- // and reaches to the log and fills the log unnecessarily.
- if (! mCIsReady ) {
- mOPercent = 0;
- mOAvailable = 0;
- emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- return;
- }
-
- mCPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
- if (mCPercent < _minRequiredAvailableSpacePercent) {
- LOG_DEBUG(QString("Settings partition space lower than %1%").arg(_minRequiredAvailableSpacePercent));
- emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- emit didSDCardSpaceTooLow(_minRequiredAvailableSpacePercent);
- }
-
- /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mOTotal << mCTotal << (mOTotal == mCTotal) << mOAvailable << mCAvailable << (mOAvailable == mCAvailable) << mPercent << mCIsReadOnly;
- if (mOPercent != mCPercent && mOAvailable != mCAvailable ) {
- mOPercent = mCPercent ;
- mOAvailable = mCAvailable ;
- emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
- /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mCAvailable << mPercent ;
- }
-}
-
-
-/*!
- * \brief DeviceController::usbError
- * \details Logs any error which has been happened
- * On USB device vDevice
- * \note When this method has been called error number will be read from errno variable,
- * Which has been set by umount or mount.
- * \param vDevice
- */
-void DeviceController::usbError(const QString &vDevice)
-{
- // disabled coco begin validated: This needs user interaction to plug-in/out the USB device
- // has been tested manually
- QString error;
- static QString lastError;
- switch (errno) {
- case EBUSY:
- error = tr("%1 - Device or resource busy (%2)").arg(errno).arg(vDevice);
- _mounted = true;
- break;
-
- default:
- error = tr("%1 - %2 (%3 , %4)").arg(errno).arg(strerror(errno)).arg(vDevice).arg(USB_Mount_Point);
- break;
-
- }
- if (error != lastError) {
- LOG_DEBUG("USB: " + error);
- lastError = error;
- }
-}
-// disabled coco end
-
-/*!
- * \brief DeviceController::onUSBDriveUmount
- * \details This is the slot connected to the _ApplicationController's didUSBDriveUmount SIGNAL,
- * To notify the USB drive detach.
- */
-void DeviceController::onUSBDriveUmount()
-{
- // disabled coco begin validated: This needs user interaction to plug-in/out the USB device
- // has been tested manually
- _umounted = true;
-}
-// disabled coco end
-
-/*!
- * \brief DeviceController::usbMount
- * \details Mounts the USB device vDevice
- * \note Emits didUSBDriveMount signal
- * \param vDevice - USB device to be mounted (e.g. /dev/sda1)
- * \return true on successful mount
- */
-void DeviceController::usbMount(const QString &vDevice)
-{
- usbMountReq(vDevice);
-}
-
-/*!
- * \brief DeviceController::usbUmount
- * \details Unmounts the USB device vDevice
- * \note Emits didUSBDriveUmount signal
- * \param vDevice - USB device to be unmounted (e.g. /dev/sda1)
- * \return true on successful unmount
- */
-void DeviceController::usbUmount(const QString &vDevice)
-{
- usbMountReq(vDevice, false);
-}
-
-/*!
- * \brief DeviceController::usbRemove
- * \details Removed the USB mount point
- * So next time it is not mounted as next device.
- * \note Emits didUSBDriveRemove signal
- */
-void DeviceController::usbRemove()
-{
- // disabled coco begin validated: This needs user interaction to plug-out the USB device
- // has been tested manually
- usbUmount(USB_Mount_Point);
- _umounted = false;
- _removed = true;
- LOG_DEBUG("USB drive removed");
- emit didUSBDriveRemove();
-}
-// disabled coco end
-
-/*!
- * \brief DeviceController::checkError
- * \details check if has error, then sets the base model accept to false and the reason to the error.
- * in that case logs the error message and emit the didAttributeResponse to notify the GUI.
- * \param vError - the error code, this can be the Gui enum or system number
- * \param vExtraLogInfo - any extra information to be logged. Not display to user.
- * \return
- */
-template
-bool DeviceController::checkError(DeviceError::Scripts_Error_Enum vError, TModel &vModel, QString vExtraLogInfo)
-{
- if ( vError ) {
- QString src = (vError > DeviceError::eDevice_Scripts_Error_Start ? MAbstract::unitText(MAbstract::Unit_Enum::eUI) : MAbstract::unitText(MAbstract::Unit_Enum::eDV)) + ",";
- vModel._data.mAccepted = false ;
- vModel._data.mReason = vError ;
- vModel._data.mMessage = DeviceError::deviceErrorText(vError, vError);
- LOG_APPED(" ," + src + vModel._data.mMessage + " " + vExtraLogInfo);
- emit didAttributeResponse(vModel._data);
- return true;
- }
- return false;
-}
-
-///////////////////////////////////////////// DeviceBrightness
-/*!
- * \brief DeviceController::onAttributeRequest
- * \details Sets the brightness level
- * \param vBrightness
- */
-void DeviceController::onAttributeRequest(const DeviceBrightnessRequestData &vData)
-{
- // ----- initializing the member variable models
- _deviceBrightnessRequest ._data = vData;
-
-
- // ----- extract the required data
- _deviceBrightnessRequest.setBrightnessSysVal();
- LOG_APPED( _deviceBrightnessRequest.toString());
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, vData.mRead ? Brightness_Get : Brightness_Set), _deviceBrightnessResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processBrightness.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBrightnessResponse);
- return;
- }
-
- // ----- run the process
- int timeout_ms = 10000;
- QStringList params;
- params << QString::number(_deviceBrightnessRequest._data.mBrightness_val);
- TimedProcess *timedProcess = new TimedProcess(&_processBrightness, script, timeout_ms, params);
- timedProcess->start();
-
-}
-
-/*!
- * \brief DeviceController::onProcessBrightnessFinished
- * \details Called when the process to set the brightness has finished
- * \param vExitCode (int) the exit code
- * \note exit code -> 0 : set Accept [MBase] -> Log -> emit
- * !0 : set Attrib [MBrgh] -> Log -> emit
- * 1 - get an error when in onAttributeRequest : scriptErrorText([Gui Enum ])
- * 2 - get an error when in onProcessBrightnessExitCode : scriptErrorText([vExitCode])
- * 3 - get no error when in onProcessBrightnessExitCode : MDeviceResponse.toString()
- * - in case 3 the specific model _data has to be filled prior to the toString to have it in the log.
- */
-void DeviceController::onProcessBrightnessExitCode(int vExitCode, QProcess::ExitStatus)
-{
- if ( ! checkError(static_cast(vExitCode), _deviceBrightnessResponse, _deviceBrightnessResponse.toString()) ) { // has no error
- if (_deviceBrightnessRequest._data.mRead) {
- bool ok = false;
- int brightness = _processBrightness.readLine().toInt(&ok);
- if (ok) {
- _deviceBrightnessResponse.setBrightnessPercent(brightness);
- }
- else {
- checkError(DeviceError::eDevice_Scripts_Error_Incorrect_Rsp,_deviceBrightnessResponse, _deviceBrightnessResponse.toString());
- return;
- }
- }
- else {
- _deviceBrightnessResponse.setBrightnessPercent(_deviceBrightnessRequest._data.mBrightness_val);
- _deviceBrightnessResponse._data.mMessage = _deviceBrightnessResponse.toString();
- }
- LOG_APPED(_deviceBrightnessResponse._data.mMessage);
- emit didAttributeResponse(_deviceBrightnessResponse._data);
- }
-}
-
-
-///////////////////////////////////////////// DeviceRootSSHAccess
-/*!
- * \brief DeviceController::onAttributeRequest
- * \details Sets the RootSSHAccess
- * \param vRootSSHAccess
- */
-void DeviceController::onAttributeRequest(const DeviceRootSSHAccessRequestData &vData)
-{
- // ----- initializing the member variable models
- _deviceRootSSHAccessRequest._data = vData;
- LOG_APPED( _deviceRootSSHAccessRequest.toString());
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, RootSSHAccess), _deviceRootSSHAccessResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processRootSSHAccess.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceRootSSHAccessResponse);
- return;
- }
-
- // ----- run the process
- int timeout_ms = 10000;
- QStringList params;
- if ( ! _deviceRootSSHAccessRequest._data.mIsGet ) params << FSN(_deviceRootSSHAccessRequest._data.mRootSSHAccess);
- TimedProcess *timedProcess = new TimedProcess(&_processRootSSHAccess, script, timeout_ms, params);
- timedProcess->start();
-}
-
-/*!
- * \brief DeviceController::onProcessRootSSHAccessExitCode
- * \details Called when the process to set the RootSSHAccess has finished
- * \param vExitCode (int) the exit code
- * \note exit code -> 0 : set Accept [MBase] -> Log -> emit
- * !0 : set Attrib [MBrgh] -> Log -> emit
- * 1 - get an error when in onAttributeRequest : scriptErrorText([Gui Enum ])
- * 2 - get an error when in onProcessRootSSHAccessExitCode : scriptErrorText([vExitCode])
- * 3 - get no error when in onProcessRootSSHAccessExitCode : MDeviceResponse.toString()
- * - in case 3 the specific model _data has to be filled prior to the toString to have it in the log.
- */
-void DeviceController::onProcessRootSSHAccessExitCode(int vExitCode, QProcess::ExitStatus)
-{
- if ( ! checkError(static_cast(vExitCode), _deviceRootSSHAccessResponse, _deviceRootSSHAccessResponse.toString()) ) { // has no error
- if (_deviceRootSSHAccessRequest._data.mIsGet) {
- bool ok = true;
- Qt::CheckState rootSSHAccess = Qt:: Unchecked;
- uint value = _processRootSSHAccess.readLine().toUInt(&ok);
- if ( ! ok ) goto lError;
-
- switch (value) {
- case 0 : rootSSHAccess = Qt:: Unchecked; break;
- case 1 : rootSSHAccess = Qt::PartiallyChecked; break;
- case 2 : rootSSHAccess = Qt:: Checked; break;
- default : ok = false;
- }
-
- if ( ! ok ) goto lError;
-
- _deviceRootSSHAccessResponse._data.mMessage = _deviceRootSSHAccessResponse.toString();
- _deviceRootSSHAccessResponse._data.mRootSSHAccess = rootSSHAccess;
- }
- else {
- _deviceRootSSHAccessResponse._data.mMessage = _deviceRootSSHAccessResponse.toString();
- _deviceRootSSHAccessResponse._data.mRootSSHAccess = _deviceRootSSHAccessRequest._data.mRootSSHAccess;
- }
-
- LOG_APPED(_deviceRootSSHAccessResponse._data.mMessage);
- emit didAttributeResponse(_deviceRootSSHAccessResponse._data);
- }
- else {
- // the error in this case is handled in the checkError
- }
- return;
-
-lError:
- checkError(DeviceError::eDevice_Scripts_Error_Incorrect_Rsp, _deviceRootSSHAccessResponse, _deviceRootSSHAccessResponse.toString());
-}
-
-///////////////////////////////////////////// DeviceCryptSetup
-/*!
- * \brief DeviceController::onAttributeRequest
- * \details Calls the CryptSetup script with the model data DeviceCryptSetupRequestData
- * \param vData - the model data
- */
-void DeviceController::onAttributeRequest(const DeviceCryptSetupRequestData &vData)
-{
- //DEBUG qDebug() << " ---------- " << vData.mCommand << vData.mPassword;
-
- _deviceCryptSetupRequest._data = vData;
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, Crypt_Setup), _deviceCryptSetupResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processCryptSetup.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceCryptSetupResponse);
- return;
- }
-
-
- // ----- run the process
- int timeout = 10000;
- TimedProcess *timedProcess = new TimedProcess(&_processCryptSetup, script, timeout, { _deviceCryptSetupRequest._data.mCommand });
- _processCryptSetup.setEnvironment(QProcess::systemEnvironment() << QString("PASSWORD=%1").arg(_deviceCryptSetupRequest._data.mPassword));
- timedProcess->start();
-
- // Update UI with a response
- MDeviceCryptSetupResponse model;
- model._data.mAccepted = false;
- model._data.mMessage = tr("Encrypted Partition %1 started.").arg(_deviceCryptSetupRequest._data.mCommand);
- emit didAttributeResponse(model.data());
-}
-
-/*!
- * \brief DeviceController::onProcessCryptSetupExitCode
- * \param vExitCode
- * \param vStatus
- */
-void DeviceController::onProcessCryptSetupExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- const int ERR_CRYPTSETUP_MOUNT_ISMOUNT=134; // is used in crypt_setup.sh do not modify
-
- // The Exit code in this script is not used.
- // any other checking is done by UI Software at the moment this script is called.
- // The only thing matters is the pared device info in text and it will be empty string if error happens.
- MDeviceCryptSetupResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processCryptSetup.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- // DEBUG: qDebug() << model._data.mEchoInfo;
- emit didAttributeResponse(model.data());
- LOG_APPED_UI(model.data().mMessage);
-
- bool isSetup = _deviceCryptSetupRequest._data.mCommand == "setup";
- bool isMount = _deviceCryptSetupRequest._data.mCommand == "mount";
- bool isMounted = isMount && (
- vExitCode == ERR_CRYPTSETUP_MOUNT_ISMOUNT || // is already mounted
- vExitCode == 0 // successful mount
- );
- bool isUpdate = gEnableUpdating && isMounted;
-
- if ( isMount ) emit didCryptSetupMount(model._data.mAccepted);
-
- QString msg = "";
- int err = 0 ;
- //TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
- Storage::Settings settings;
- // moving the configuration files if the encrypted partition creation was successful.
- if ( isUpdate ) goto lMove; // if it is gEnableUpdating, bypass the mAccepted for already mounted.
- if ( ! model._data.mAccepted ) goto lErr ; // any other case goto error
- if ( ! isSetup ) goto lOut ; // if not setup do NOT continue to move configurations
-
-lMove:
- err = settings.configurationsMove(&msg, isUpdate);
- if ( err ) {
- model._data.mAccepted = false ;
- model._data.mReason = err ;
- model._data.mMessage = msg ;
- emit didAttributeResponse(model.data());
- LOG_APPED_UI(model.data().mMessage);
- }
-
-lOut:
- return;
-
-lErr:
- LOG_DEBUG(QString("Encrypted Partition %1 failed").arg(_deviceCryptSetupRequest._data.mCommand));
-}
-
-///////////////////////////////////////////// DeviceBluetoothPaired
-void DeviceController::onAttributeRequest(const DeviceBluetoothPairedResetRequestData &)
-{
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, Bluetooth_Paired_Reset), _deviceBluetoothPairedResetResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processBluetoothPairedReset.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBluetoothPairedResetResponse);
- return;
- }
-
- // ----- run the process
- int timeout_ms = 10000;
- TimedProcess *timedProcess = new TimedProcess(&_processBluetoothPairedReset, script, timeout_ms);
- timedProcess->start();
-}
-
-void DeviceController::onProcessBluetoothPairedResetExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- // TODO: review the usage and definition of this object _deviceBluetoothPairedResetResponse. do we need it any more?
- MDeviceBluetoothPairedResetResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processBluetoothPairedReset.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- LOG_APPED_UI(model.data().mMessage);
- emit didAttributeResponse(model.data());
-}
-
-///////////////////////////////////////////// DeviceBluetoothPairedQuery
-void DeviceController::onAttributeRequest(const DeviceBluetoothPairedQueryRequestData &)
-{
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, Bluetooth_Paired_Query), _deviceBluetoothPairedQueryResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processBluetoothPairedQuery.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBluetoothPairedQueryResponse);
- return;
- }
-
- // ----- run the process
- int timeout_ms = 10000;
- TimedProcess *timedProcess = new TimedProcess(&_processBluetoothPairedQuery, script, timeout_ms);
- timedProcess->start();
-}
-
-void DeviceController::onProcessBluetoothPairedQueryExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- // The Exit code in this script is not used.
- // any other checking is done by UI Software at the moment this script is called.
- // The only thing matters is the pared device info in text and it will be empty string if error happens.
- MDeviceBluetoothPairedQueryResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processBluetoothPairedQuery.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- emit didAttributeResponse(model.data());
- LOG_APPED_UI(model.data().mMessage);
-}
-
-/*!
- * \brief DeviceController::doScreenshot
- * \details emit the screenshot signal to run that in Device controller thread
- * \param vCurrentDateTime
- */
-void DeviceController::doScreenshot(const QImage &vImage, const QString &vFileName) {
- emit didScreenshot(vImage, vFileName);
-}
-
-/*!
- * \brief DeviceController::onScreenshot
- * \details The function to save the image vImage in the file vFileName
- * \param vImage - The image source object
- * \param vFileName - The filename to same the image to
- */
-void DeviceController::onScreenshot(const QImage &vImage, const QString &vFileName) {
- vImage.save(vFileName);
- LOG_DEBUG("Screenshot saved in " + vFileName);
-}
-
-/*!
- * \brief DeviceController::ondoAddWatch
- * \details The thread safe add file watch method
- * \param vFile - The file to add to watch.
- */
-void DeviceController::ondoAddWatch(const QString &vFile, bool vCreate)
-{
- DeviceError::Scripts_Error_Enum err = DeviceError::eDevice_OK;
- if ( vCreate ) {
- if ( ! FileHandler::write ( vFile, "", false) ) { err = DeviceError::eDevice_Watch_Error_NotCreate; goto lErr; }}
- else {
- if ( ! QFileInfo::exists ( vFile ) ) { err = DeviceError::eDevice_Watch_Error_NotFound ; goto lErr; }}
- if ( ! _fileSystemWatcher.removePath ( vFile ) ) { LOG_APPED_UI(QString("Device NOT watching %1").arg(vFile)); }
- else { LOG_APPED_UI(QString("Device watch removed %1").arg(vFile)); }
- if ( ! _fileSystemWatcher.addPath ( vFile ) ) { err = DeviceError::eDevice_Watch_Error_NotAdded ; goto lErr; }
-
- LOG_APPED_UI(QString("Device watch %1").arg(vFile));
- return;
-lErr:
- LOG_DEBUG(DeviceError::deviceErrorText(err, 0));
-}
-
-/*!
- * \brief DeviceController::onWatchFileChanged
- * \details This slot is called once the files being watched is updated.
- * \param vFile - the file name.
- */
-void DeviceController::onWatchFileChanged(const QString &vFile)
-{
- emit didWatchFileChange(vFile);
-}
-
-/*!
- * \brief DeviceController::onEventThreadChange
- * \details The signal handler for the DeviceController(this)::didEventThreadChange
- * to start checking for the Encrypted partition readiness.
- */
-void DeviceController::onEventThreadChange()
-{
- //DEBUG qDebug() << " ---------- " << __FUNCTION__ << QThread::currentThread()->objectName() << QThread::currentThread() << qApp->thread();
- if ( QThread::currentThread() != &Threads::_DeviceController_Thread ) {
- qCritical() << " ***** Device controller thread not initialized correctly ***** ";
- return;
- }
- _hasThread = true;
- checkConfugurationMountReady();
-}
-
-/*!
- * \brief DeviceController::onPOSTOSVersionData
- * \details Collects the OS Version
- * when it is ready after the POST is done reading OS Version
- * \param vMacAddress - The Ethernet MAC address
- */
-void DeviceController::onPOSTOSVersionData(const QString &vOSVersion) {
- _osVersion = vOSVersion;
- emit didPOSTOSVersionData (vOSVersion);
-}
-
-/*!
- * \brief DeviceController::onPOSTEthernetData
- * \details Collects the ethernet mac address
- * when it is ready after the POST is done for the Ethernet
- * \param vMacAddress - The Ethernet MAC address
- */
-void DeviceController::onPOSTEthernetData(const QString &vMacAddress) {
- _macEthernet = vMacAddress;
- emit didPOSTEthernetData (vMacAddress);
-}
-
-/*!
- * \brief DeviceController::onPOSTWirelessData
- * \details Collects the wireless mac address
- * when it is ready after the POST is done for the Wireless connection
- * \param vMacAddress - The Wireless MAC address
- */
-void DeviceController::onPOSTWirelessData(const QString &vMacAddress) {
- _macWireless = vMacAddress;
-
- encryption::varSalt(vMacAddress);
- _hasSalt = ! vMacAddress.trimmed().isEmpty();
- checkConfugurationMountReady();
-
- emit didPOSTWirelessData (vMacAddress);
-}
-
-/*!
- * \brief DeviceController::onPOSTBluetoothData
- * \details Collects the bluetooth mac address
- * when it is ready after the POST is done for the Bluetooth
- * \param vMacAddress - The Bluetooth MAC address
- */
-void DeviceController::onPOSTBluetoothData(const QString &vMacAddress) {
- _macBluetooth = vMacAddress;
- emit didPOSTBluetoothData (vMacAddress);
-}
-
-/*!
- * \brief DeviceController::onPOSTCloudSyncData
- * \details Collects the CloudSync Network Address
- * when it is ready after the POST is done for the CloudSync
- * \param vNetAddress - *** Not defined yet and is a placeholder for later use ***
- */
-void DeviceController::onPOSTCloudSyncData(const QString &vNetAddress) {
- _netCloudSync = vNetAddress;
- emit didPOSTCloudSyncData (vNetAddress);
-}
-
-bool DeviceController::logBackup(const QString &vFileName)
-{
- if ( ! gLogUpload ) return false; // no log backup
-
- bool ok = true;
- QString fileSrc = vFileName;
- QFileInfo fileInfo(vFileName);
- QString filePath(fileInfo.absolutePath());
- QString fileBase(fileInfo.baseName());
- QString fileSufx(fileInfo.completeSuffix().prepend(_Logger.logFileNamePendingSubExt()));
- QString fileDest(QString("%1/%2.%3").arg(filePath, fileBase, fileSufx));
- // DEBUG qDebug() << __FUNCTION__ << "\n" << vFileName << "\n" << fileDest;
- if ( gLogCompress ) {
- fileSrc += _Logger.logFileNameCompressExt();
- fileDest += _Logger.logFileNameCompressExt();
- ok = FileHandler::backupFile(vFileName);
- }
- ok = QFile::rename(fileSrc, fileDest);
- return ok;
-}
-
-void DeviceController::onLogBackup(const QString &vFileName)
-{
- if ( ! gLogUpload ) return; // no log backup ( slot )
-
- bool ok = true;
- ok = logBackup( vFileName);
- emit didLogBackup(ok, vFileName);
-}
-
-bool DeviceController::logUpload(const QString &vFileName)
-{
- if ( ! gLogUpload ) return false; // no log Uploaded rename
-
- bool ok = true;
- QFileInfo fileInfo(vFileName);
- QString filePath;
- QString fileBase(fileInfo.baseName());
- QString ext = _Logger.logFileNamePendingSubExt();
- QString fileSufx(fileInfo.completeSuffix().remove(ext));
- QString fileDest = QString("%1.%2").arg(fileBase, fileSufx);
-
- Logger::LogType logType = _Logger.logFileLogType(vFileName, filePath);
- ok = logType != Logger::eLogNone;
- if ( ! ok ) { LOG_APPED_UI(QString("CS Incorrect log upload type [%1]").arg(fileSufx)); goto lOut; }
- // DEBUG qDebug() << __FUNCTION__ << "\n" << vFileName << "\n" << fileDest;
-
- ok = QFile::rename(filePath + vFileName, filePath + fileDest);
-lOut:
- return ok;
-}
-
-void DeviceController::onLogUpload(const QString &vFileName)
-{
- if ( ! gLogUpload ) return; // no log uploaded rename ( slot )
-
- bool ok = true;
- ok = logUpload( vFileName);
- emit didLogUpload(ok, vFileName);
-}
-
-/*!
- * \brief DeviceController::checkConfugurationMountReady
- * \details Cheks if the system is ready to mount the encrypted partition.
- * The object has to be on its own thread and the salt for the decryption has to be ready.
- */
-void DeviceController::checkConfugurationMountReady()
-{
- /// in manufacturing or updating the system is logged with root and configurations are in /home/root
- /// therefore no need to mount the cononfiguraiton partition.
- /// also for manufacturing the partition is being set up
- /// and is less steps for setup if the partition is not mounted.
- if ( gEnableManufacturing ) return; // it should do the mount when gEnableUpdating, therefore here should not add gEnableUpdating.
- if ( ! ( _hasThread && _hasSalt ) ) return;
-
- DeviceCryptSetupRequestData data;
- data.mCommand = "mount";
- bool ok = false;
- data.mPassword = encryption::configurationsPassword( ok );
- if ( ! ok ) { // not enough infromation to create a secure passowrd
- // status(tr("Not enough secure information provided"));
- }
- else {
- onAttributeRequest(data);
- }
-
- // I_AM_HERE
- // HERE move the settings read from ApplicationController to here
- // here is when the DeviceController is moved to its thread
- // and now can start mounting the encrypted partition
- // and then read the settings.
- // TODO don't forget to check for the required configurations files and parameters in the settings class.
- // and take care of the security flag in the Storage class.
-}
-
-/*!
- * \brief DeviceController::findPendingLogs
- * \details this function counts downs for the _pendingInterval
- * when the _pendingCounter reaches 0 will search for the files
- * and if there is any will get the recent file in the list
- */
-void DeviceController::findPendingLogs()
-{
- if ( ! gLogUpload ) return; // no log upload pending detection
-
- static QString pendingLog = "";
- if( _pendingCounter ) {
- _pendingCounter -- ;
- return;
- }
- else {
- _pendingCounter = _pendingInterval; // every minute
- }
-
- QFileInfoList pendingFiles;
- QString logLoc = Log_Folder_Base;
- QString logExt = QString("*.%1*").arg(_Logger.logFileNamePendingSubExt()); // "*.u.*";
- for( auto logFolder : { Log_Folder_Application, Log_Folder_Service/*, Log_Folder_CloudSync*/ } ) {
- pendingFiles = Storage::FileHandler::find( logLoc + logFolder, { logExt } );
- // look into the list.
- // if there are pending files,
- // send a request only for the top on the list
- /// Note I thought it makes sense to send the oldest on the application and service logs
- /// but there are some conversation about the situation if something happens on the device,
- /// and it would be a critical situation to get the recent/top log and won't wait for the old ones to upload.
- // * When gets uploaded, moves from pending then next one comes to top
- // the process repeats until there is no file in pending
-
- bool uploadOldestFirst = true; //TODO: make if configurable(cfg, or cli)
-
- if ( pendingFiles.count() ) {
- // the most recent/first log file, to first ask for the current log which has just been saved as pending
- if ( uploadOldestFirst ) {
- _pendingLog = pendingFiles.last().absoluteFilePath();
- } else {
- _pendingLog = pendingFiles.first().absoluteFilePath();
- }
- QString message = pendingLog;
- LOG_DEBUG(message);
- emit didPendingLog( _pendingLog, FileHandler::sha256sum( _pendingLog ) );
- // when a pending file found in the first log folder stop
- // until there is none in first one (log)
- // then continue to the next log folder (service) ...
- goto lOut;
- }
- }
-lOut:
- return;
-}
-
-///////////////////////////////////////////// DeviceFactoryReset
-void DeviceController::onAttributeRequest(const DeviceFactoryResetRequestData &vData)
-{
- _deviceFactoryResetRequest._data = vData;
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, Factory_Reset), _deviceFactoryResetResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processFactoryReset.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceFactoryResetResponse);
- return;
- }
-
-
- // ----- run the process
- int timeout_ms = 10000;
- TimedProcess *timedProcess = new TimedProcess(&_processFactoryReset, script, timeout_ms);
- timedProcess->start();
-
- MDeviceFactoryResetResponse model;
- model._data.mAccepted = false; // will indirectly set the property factoryResetEnabled
- model._data.mMessage = tr("Factory Reset started.");
- emit didAttributeResponse(model.data());
-}
-
-/*!
- * \brief DeviceController::onProcessFactoryResetExitCode
- * \param vExitCode - the script exit code.
- * \param vStatus - the script echoed message.
- */
-void DeviceController::onProcessFactoryResetExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- // The Exit code in this script is not used.
- // any other checking is done by UI Software at the moment this script is called.
- // The only thing matters is the paired device info in text and it will be empty string if error happens.
- MDeviceFactoryResetResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processFactoryReset.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- // DEBUG: qDebug() << model._data.mMessage << deviceInfo;
- emit didAttributeResponse (model.data());
- emit didFactoryReset (model._data.mAccepted);
-
- LOG_APPED_UI(model.data().mMessage);
-}
-
-///////////////////////////////////////////// DeviceDecommission
-void DeviceController::onAttributeRequest(const DeviceDecommissionRequestData &vData)
-{
- _deviceDecommissionRequest._data = vData;
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, Device_Decommission), _deviceDecommissionResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processDecommission.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceDecommissionResponse);
- return;
- }
-
-
- // ----- run the process
- int timeout_ms = 10000;
- TimedProcess *timedProcess = new TimedProcess(&_processDecommission, script, timeout_ms, { CloudSyncPath });
- _processDecommission.setEnvironment(QProcess::systemEnvironment() << QString("PASSWORD=%1").arg(_deviceDecommissionRequest._data.mPassword));
- timedProcess->start();
-
- MDeviceDecommissionResponse model;
- model._data.mAccepted = false; // will indirectly set the property decommissionEnabled
- model._data.mMessage = tr("Decommissioning started.");
- emit didAttributeResponse(model.data());
-}
-
-/*!
- * \brief DeviceController::onProcessDecommissionExitCode
- * \param vExitCode
- * \param vStatus
- */
-void DeviceController::onProcessDecommissionExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- // The Exit code in this script is not used.
- // any other checking is done by UI Software at the moment this script is called.
- // The only thing matters is the paired device info in text and it will be empty string if error happens.
- MDeviceDecommissionResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processDecommission.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- // DEBUG: qDebug() << model._data.mMessage << deviceInfo;
- emit didAttributeResponse (model.data());
- emit didDecommissioning (model._data.mAccepted);
-
- LOG_APPED_UI(model.data().mMessage);
-}
-
-///////////////////////////////////////////// DeviceUSBMounting
-void DeviceController::onAttributeRequest(const DeviceUSBMountRequestData &vData)
-{
- Q_UNUSED(vData)
- usbMountReq(vData.usbDevice, vData.isMountRequest);
-}
-
-/*!
- * \brief DeviceController::usbMountReq
- * \details Calls the Usb unmount/mount script
- * \param vIsMount - indicate if the request is for mounting or unmounting
- * \param vDevice - the path to the USB device
- */
-void DeviceController::usbMountReq(const QString &vDevice, bool vIsMount)
-{
- qDebug() << __FUNCTION__ << vDevice << vIsMount;
- _deviceUSBMountRequest._data.isMountRequest = vIsMount ;
- _deviceUSBMountRequest._data.usbDevice = vDevice ; // not necessary, but to be consistent
-
- // ----- check that script exists.
- QString script;
- if ( checkError( DeviceError::checkScript(script, (vIsMount ? USB_Mount : USB_Unmount )), _deviceUSBMountResponse, script) )
- return;
-
- // ----- check if the process is not running
- if ( _processUSBMount.state() != QProcess::NotRunning ) {
- checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceUSBMountResponse);
- return;
- }
-
- // ----- run the process
- int timeout_ms = 5000;
- TimedProcess *timedProcess = new TimedProcess(&_processUSBMount, script, timeout_ms, {vDevice, USB_Mount_Point, USB_File_System});
- timedProcess->start();
-
- MDeviceUSBMountResponse model;
- model._data.mAccepted = false;
- model._data.mMessage = vIsMount ? tr("USB unmount started.") : tr("USB mount started");
- emit didAttributeResponse(model.data());
-}
-
-/*!
- * \brief DeviceController::onProcessUSBMountExitCode
- * \param vExitCode
- * \param vStatus
- */
-void DeviceController::onProcessUSBMountExitCode(int vExitCode, QProcess::ExitStatus vStatus)
-{
- MDeviceUSBMountResponse model;
- QByteArray deviceInfo;
- if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
- else deviceInfo = _processUSBMount.readAll();
- model.fromByteArray( deviceInfo, &vExitCode );
- emit didAttributeResponse(model.data());
-
- // Re-evaluate the USB space available - need to call this here to avoid
- // visual lag caused by waiting to call this function on the timer timeout
- usbSpaceCheck();
-
- bool ok = ! vStatus;
- QString usbDevice = _deviceUSBMountRequest._data.usbDevice;
- if(_deviceUSBMountRequest._data.isMountRequest) { // *** USB Mount
- if ( ok && ! _mounted ) {
- _mounted = true;
- _removed = false;
- LOG_DEBUG(QString("USB flash drive %1 has been mounted on %2").arg(usbDevice).arg(USB_Mount_Point));
- emit didUSBDriveMount();
- } else {
- usbError(usbDevice);
- }
- } else { // *** USB Unmount
- if ( ok && _mounted ) {
- _mounted = false;
- // _umounted = true; // I think it might be needed, but needs more testing.
- LOG_DEBUG(QString("USB drive %2 unmounted").arg(usbDevice));
- emit didUSBDriveUmount();
- } else {
- // the error is irrelevant, commented out for now
- // usbError(usbDrive);
- }
- }
-
- // log error and exit
- return;
-}
+#include "DeviceController.h"
+
+// Linux
+#include
+#include
+
+// Qt
+#include
+#include
+#include
+
+// Project
+#include "Threads.h"
+#include "StorageGlobals.h"
+#include "Logger.h"
+#include "CloudSyncController.h"
+#include "ApplicationController.h"
+#include "FileHandler.h"
+#include "DeviceModels.h"
+#include "Settings.h"
+#include "encryption.h"
+
+// namespace
+using namespace Model;
+using namespace Device;
+using namespace Storage;
+
+/*!
+ * \brief DeviceController::DeviceController
+ * \details Constructor
+ * \param parent - QObject parent owner object.
+ * Qt handles the children destruction by their parent objects life-cycle.
+ */
+DeviceController::DeviceController(QObject *parent) : QObject(parent) {
+ _fileSystemWatcher.setParent(this);
+ DEVICE_DEV_PARENT_LIST
+}
+
+/*!
+ * \brief DeviceController::init
+ * \details Initializes the class by setting the connections and starting the timer
+ * \return False if it has been called before.
+ */
+bool DeviceController::init()
+{
+ if ( _init ) return false;
+ _init = true;
+
+ // runs in DeviceController thread
+ initConnections();
+ startTimer(_interval);
+
+ return true;
+}
+
+/*!
+ * \brief DeviceController::init
+ * \details Initialized the Class by calling the init() method first
+ * And initializes the thread vThread by calling initThread
+ * on success init().
+ * \param vThread - the thread
+ * \return returns the return value of the init() method
+ */
+bool DeviceController::init(QThread &vThread)
+{
+ if ( ! init() ) return false;
+ initThread(vThread);
+ return true;
+}
+
+/*!
+ * \brief DeviceController::quit
+ * \details quits the class
+ * Calls quitThread
+ */
+void DeviceController::quit()
+{
+ quitThread();
+}
+
+
+/*!
+ * \brief DeviceController::initConnections
+ * \details Initializes the required signal/slot connection between this class and other objects
+ * to be able to communicate.
+ */
+void DeviceController::initConnections()
+{
+ connect(&_ApplicationController , SIGNAL(didUSBDriveUmount()),
+ this , SLOT( onUSBDriveUmount()));
+
+ connect(this , SIGNAL(didScreenshot(const QImage &, const QString &)),
+ this , SLOT( onScreenshot(const QImage &, const QString &)));
+
+ connect(&_fileSystemWatcher , SIGNAL( fileChanged(const QString &)),
+ this , SLOT( onWatchFileChanged(const QString &)));
+
+ connect(&_ApplicationController , SIGNAL(didPOSTOSVersionData (const QString &)),
+ this , SLOT( onPOSTOSVersionData (const QString &)));
+ connect(&_ApplicationController , SIGNAL(didPOSTEthernetData (const QString &)),
+ this , SLOT( onPOSTEthernetData (const QString &)));
+ connect(&_ApplicationController , SIGNAL(didPOSTWirelessData (const QString &)),
+ this , SLOT( onPOSTWirelessData (const QString &)));
+ connect(&_ApplicationController , SIGNAL(didPOSTBluetoothData (const QString &)),
+ this , SLOT( onPOSTBluetoothData (const QString &)));
+ connect(&_ApplicationController , SIGNAL(didPOSTCloudSyncData (const QString &)),
+ this , SLOT( onPOSTCloudSyncData (const QString &)));
+
+ connect(&_Logger , SIGNAL(didLogBackup (const QString &)),
+ this , SLOT( onLogBackup (const QString &)));
+ connect(&_CloudSyncController , SIGNAL(didLogUpload (const QString &)),
+ this , SLOT( onLogUpload (const QString &)));
+
+ DEVICE_DEV_INIT_CONNECTIONS_LIST
+
+ connect(this, SIGNAL(didEventThreadChange()),
+ this, SLOT( onEventThreadChange()));
+
+}
+
+/*!
+ * \brief ApplicationController::initThread
+ * \details Moves this object into the thread vThread.
+ * And checks that this method is called from main thread.
+ * Also connects quitThread to application aboutToQuit.
+ * \param vThread - the thread
+ */
+void DeviceController::initThread(QThread &vThread)
+{
+ // runs in main thread
+ Q_ASSERT_X(QThread::currentThread() == qApp->thread() , __func__, "The Class initialization must be done in Main Thread" );
+ _thread = &vThread;
+ _thread->setObjectName(QString("%1_Thread").arg(metaObject()->className()));
+ connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(quit()));
+ _thread->start();
+ moveToThread(_thread);
+
+ emit didEventThreadChange( QPrivateSignal() );
+}
+
+/*!
+ * \brief DeviceController::quitThread
+ * \details Moves this object to main thread to be handled by QApplication
+ * And to be destroyed there.
+ */
+void DeviceController::quitThread()
+{
+ // disabled coco begin validated: Application termination is not correctly done in coco!!!
+ // it has been tested and works perfectly fine in normal run.
+
+ if ( ! _thread ) return;
+
+ // runs in thread
+ moveToThread(qApp->thread()); // validated
+}
+// disabled coco end
+
+/*!
+ * \brief DeviceController::usbSeek
+ * \details Tries to look for the available USB devices
+ * Starts from sda1 to sdz1.
+ * \note will only look for the first partition if there is any
+ * \param vDevice - Found device (/dev/sda1)
+ * \return true if a device found
+ */
+bool DeviceController::usbSeek(QString &vDevice)
+{
+ // disabled coco begin validated: Needed User Interaction so tested manually
+ // This function cannot be tested on any device other than target
+ // because only on device the usb is /dev/sdX# and others are mmcblk___
+ // but on VM and normal Linuxes all drives are /dev/sdX# and cannot be identified as USB.
+ // And the difference between how USB is detected and sd-card is that
+ // for the USB we need to look into /dev/sdX#
+ // but for the sd-card we look for the mounted path which is much easier.
+ // That's why indication of the sd-card is more accurate than USB at least on VM.
+ QString dev = "/dev/sd";
+ QString device = "";
+ for (char a = 'a'; a <= 'z'; a++) {
+ device = dev + a + '1';
+ if (QFileInfo::exists(device)) {
+ vDevice = device;
+ return true; // application is deciding on the first existing drive
+ }
+ }
+ vDevice = device;
+ return false;
+ // disabled coco end
+}
+
+/*!
+ * \brief DeviceController::driveSpaceCheck
+ * \param vPath - Device mount point
+ * \param vTotalBytes - Total volume size in bytes
+ * \param vAvailableBytes - Size (in bytes) available for the current user
+ * \param vPercent - The percentage of available space
+ * \return - The drive mounted and ready
+ * \note if device ejected manually system assumes it's still ready.
+ */
+bool DeviceController::driveSpaceCheck(const QString &vPath, qint64 &vTotalBytes, qint64 &vAvailableBytes, bool *vIsReadOnly)
+{
+ QStorageInfo storage(vPath);
+ bool isReady = storage.isReady ();
+ bool isReadOnly = storage.isReadOnly();
+ bool isMounted = FileHandler::isMounted(vPath);
+
+ if ( vIsReadOnly ) *vIsReadOnly = isReadOnly;
+
+ if ( isReady ) {
+ vTotalBytes = storage.bytesTotal();
+ vAvailableBytes = storage.bytesAvailable();
+ }
+
+ if ( ! isMounted || ! isReady ) {
+ isReady = false;
+ vTotalBytes = 0;
+ vAvailableBytes = 0;
+ }
+ return isReady;
+}
+
+/*!
+ * \brief DeviceController::timerEvent
+ * \details This event handler has been re-implemented in here
+ * to receive timer events for the object
+ * for the timer which has been set to _checkInterval
+ * Runs the usbCheck on interval
+ */
+void DeviceController::timerEvent(QTimerEvent *)
+{
+#ifdef BUILD_FOR_TARGET
+ usbCheck();
+ sdcardSpaceCheck();
+
+ // The treatment logs are held in a separate partition from the unencrypted
+ // logs and need a separate disk space usage check
+ settingsPartitionSpaceCheck();
+#endif
+ findPendingLogs();
+}
+
+/*!
+ * \brief DeviceController::usbCheck
+ * \details Runs usbSeek to mount or umount or remove it
+ * regarding the state it's in.
+ */
+void DeviceController::usbCheck()
+{
+ QString device = "";
+ usbSpaceCheck();
+ if (usbSeek(device)) {
+ if (! _umounted ) { // avoid to mount the USB which has just been unmounted
+ if (! _mounted ) { // avoid to mount the USB which has just been mounted
+ usbMount(device);
+ }
+ } else { // the umount is requested?
+ usbUmount(USB_Mount_Point);
+ }
+ } else {
+ if ( ! _removed ) {
+ usbRemove();
+ }
+ }
+}
+
+/*!
+ * \brief DeviceController::sdcardSpaceCheck
+ * \details Checks for the SD-Card drive space.
+ */
+void DeviceController::sdcardSpaceCheck()
+{
+ static bool mInitialized = false;
+ // Old Info ; // Current info
+ static bool mOIsReady = false; bool mCIsReady = false;
+ static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
+ static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
+ static quint8 mOPercent = 0; quint8 mCPercent = 0;
+
+ qint64 mCTotal = 0;
+
+ bool isMounted = FileHandler::isMounted(Storage::SDCard_Base_Path_Name);
+ QString pathToCheckSpace = isMounted ? Storage::SDCard_Base_Path_Name : gStandard_tmp;
+ mCIsReady = driveSpaceCheck(pathToCheckSpace, mCTotal, mCAvailable, &mCIsReadOnly);
+
+ //DEBUG: qDebug()<< "Checking space for path of : " << pathToCheckSpace << " mCTotal " << mCTotal << " available " << mCAvailable;
+
+ if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
+ mOIsReadOnly = mCIsReadOnly;
+ mOIsReady = mCIsReady;
+ mInitialized = true;
+ //DEBUG:0: qDebug() << " ~~~~~~~~~~ " << __FUNCTION__ << mInitialized << mCIsReady << mOIsReady << mCIsReadOnly << mOIsReadOnly;
+ emit didSDCardStateChange(mCIsReady, mCIsReadOnly);
+ }
+ //NOTE: this if block has to be independent of the mOIsReady != mCIsReady
+ // because current and old may be the same all the time and then this if block will not execute
+ // and reaches to the log and fills the log unnecessarily.
+ if (! mCIsReady ) {
+ mOPercent = 0;
+ mOAvailable = 0;
+ emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ return;
+ }
+
+ mCPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
+ if (mCPercent < _minRequiredAvailableSpacePercent) {
+ LOG_DEBUG(QString("SD-CARD space lower than %1%").arg(_minRequiredAvailableSpacePercent));
+ emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ emit didSDCardSpaceTooLow(_minRequiredAvailableSpacePercent);
+ }
+
+ //DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mOAvailable << mCAvailable << (mOAvailable == mCAvailable) << mOPercent << mCPercent << mCIsReadOnly;
+ if (mOPercent != mCPercent || mOAvailable != mCAvailable ) {
+ mOPercent = mCPercent ;
+ mOAvailable = mCAvailable ;
+ emit didSDCardSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mCAvailable << mPercent ;
+ }
+}
+
+/*!
+ * \brief DeviceController::usbSpaceCheck
+ * \details Checks for the USB drive space.
+ */
+void DeviceController::usbSpaceCheck()
+{
+ static bool mInitialized = false;
+ // Old Info ; // Current info
+ static bool mOIsReady = false; bool mCIsReady = false;
+ static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
+ static qint64 mOTotal = 0; qint64 mCTotal = 0;
+ static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
+
+ quint8 mPercent = 0;
+
+ mCIsReady = driveSpaceCheck(Storage::USB_Mount_Point, mCTotal, mCAvailable, &mCIsReadOnly);
+#if BUILD_FOR_DESKTOP
+ mCIsReady = true; // it is set to always true since on desktop a local folder is used for the USB folder which doesn't need (un)mount.
+#endif
+ if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
+ mOIsReadOnly = mCIsReadOnly;
+ mOIsReady = mCIsReady;
+ mInitialized = true;
+ emit didUSBStateChange(mCIsReady, mCIsReadOnly);
+
+ if (! mCIsReady ) {
+ mOTotal = 0;
+ mOAvailable = 0;
+ emit didUSBSpaceChange(mCIsReady, mCTotal, mCAvailable, mPercent);
+ return;
+ }
+ }
+
+ mPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
+ if (mOTotal != mCTotal || mOAvailable != mCAvailable) {
+ mOTotal = mCTotal ;
+ mOAvailable = mCAvailable ;
+ emit didUSBSpaceChange(mCIsReady, mCTotal, mCAvailable, mPercent);
+ }
+
+ // DEBUG: qDebug() << "DeviceController::usbSpaceCheck"
+ // << mCIsReady
+ // << mCIsReadOnly
+ // << mCTotal
+ // << mCAvailable ;
+}
+
+/*!
+ * \brief DeviceController::settingsPartitionSpaceCheck
+ * \details Checks the disk space of the encrypted partition
+ */
+void DeviceController::settingsPartitionSpaceCheck()
+{
+ static bool mInitialized = false;
+ // Old Info ; // Current info
+ static bool mOIsReady = false; bool mCIsReady = false;
+ static bool mOIsReadOnly = false; bool mCIsReadOnly = false;
+ static qint64 mOAvailable = 0; qint64 mCAvailable = 0;
+ static quint8 mOPercent = 0; quint8 mCPercent = 0;
+
+ qint64 mCTotal = 0;
+ mCIsReady = driveSpaceCheck(Storage::Settings_Path(), mCTotal, mCAvailable, &mCIsReadOnly);
+
+ //DEBUG: qDebug()<< "Checking space for path of : " << Storage::Settings_Path() << " mCTotal " << mCTotal << " available " << mCAvailable;
+
+ if (mOIsReadOnly != mCIsReadOnly || mOIsReady != mCIsReady || ! mInitialized ) {
+ mOIsReadOnly = mCIsReadOnly;
+ mOIsReady = mCIsReady;
+ mInitialized = true;
+ //DEBUG:0: qDebug() << " ~~~~~~~~~~ " << __FUNCTION__ << mInitialized << mCIsReady << mOIsReady << mCIsReadOnly << mOIsReadOnly;
+ emit didSettingsPartitionStateChange(mCIsReady, mCIsReadOnly);
+ }
+ //NOTE: this if block has to be independent of the mOIsReady != mCIsReady
+ // because current and old may be the same all the time and then this if block will not execute
+ // and reaches to the log and fills the log unnecessarily.
+ if (! mCIsReady ) {
+ mOPercent = 0;
+ mOAvailable = 0;
+ emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ return;
+ }
+
+ mCPercent = mCTotal ? ((100 * mCAvailable) / mCTotal) : 0;
+ if (mCPercent < _minRequiredAvailableSpacePercent) {
+ LOG_DEBUG(QString("Settings partition space lower than %1%").arg(_minRequiredAvailableSpacePercent));
+ emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ emit didSDCardSpaceTooLow(_minRequiredAvailableSpacePercent);
+ }
+
+ /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mOTotal << mCTotal << (mOTotal == mCTotal) << mOAvailable << mCAvailable << (mOAvailable == mCAvailable) << mPercent << mCIsReadOnly;
+ if (mOPercent != mCPercent && mOAvailable != mCAvailable ) {
+ mOPercent = mCPercent ;
+ mOAvailable = mCAvailable ;
+ emit didSettingsPartitionSpaceChange(mCIsReady, mCTotal, mCAvailable, mCPercent);
+ /// DEBUG: qDebug() << Storage::SDCard_Base_Path_Name << mCIsReady << mCTotal << mCAvailable << mPercent ;
+ }
+}
+
+
+/*!
+ * \brief DeviceController::usbError
+ * \details Logs any error which has been happened
+ * On USB device vDevice
+ * \note When this method has been called error number will be read from errno variable,
+ * Which has been set by umount or mount.
+ * \param vDevice
+ */
+void DeviceController::usbError(const QString &vDevice)
+{
+ // disabled coco begin validated: This needs user interaction to plug-in/out the USB device
+ // has been tested manually
+ QString error;
+ static QString lastError;
+ switch (errno) {
+ case EBUSY:
+ error = tr("%1 - Device or resource busy (%2)").arg(errno).arg(vDevice);
+ _mounted = true;
+ break;
+
+ default:
+ error = tr("%1 - %2 (%3 , %4)").arg(errno).arg(strerror(errno)).arg(vDevice).arg(USB_Mount_Point);
+ break;
+
+ }
+ if (error != lastError) {
+ LOG_DEBUG("USB: " + error);
+ lastError = error;
+ }
+}
+// disabled coco end
+
+/*!
+ * \brief DeviceController::onUSBDriveUmount
+ * \details This is the slot connected to the _ApplicationController's didUSBDriveUmount SIGNAL,
+ * To notify the USB drive detach.
+ */
+void DeviceController::onUSBDriveUmount()
+{
+ // disabled coco begin validated: This needs user interaction to plug-in/out the USB device
+ // has been tested manually
+ _umounted = true;
+}
+// disabled coco end
+
+/*!
+ * \brief DeviceController::usbMount
+ * \details Mounts the USB device vDevice
+ * \note Emits didUSBDriveMount signal
+ * \param vDevice - USB device to be mounted (e.g. /dev/sda1)
+ * \return true on successful mount
+ */
+void DeviceController::usbMount(const QString &vDevice)
+{
+ usbMountReq(vDevice);
+}
+
+/*!
+ * \brief DeviceController::usbUmount
+ * \details Unmounts the USB device vDevice
+ * \note Emits didUSBDriveUmount signal
+ * \param vDevice - USB device to be unmounted (e.g. /dev/sda1)
+ * \return true on successful unmount
+ */
+void DeviceController::usbUmount(const QString &vDevice)
+{
+ usbMountReq(vDevice, false);
+}
+
+/*!
+ * \brief DeviceController::usbRemove
+ * \details Removed the USB mount point
+ * So next time it is not mounted as next device.
+ * \note Emits didUSBDriveRemove signal
+ */
+void DeviceController::usbRemove()
+{
+ // disabled coco begin validated: This needs user interaction to plug-out the USB device
+ // has been tested manually
+ usbUmount(USB_Mount_Point);
+ _umounted = false;
+ _removed = true;
+ LOG_DEBUG("USB drive removed");
+ emit didUSBDriveRemove();
+}
+// disabled coco end
+
+/*!
+ * \brief DeviceController::checkError
+ * \details check if has error, then sets the base model accept to false and the reason to the error.
+ * in that case logs the error message and emit the didAttributeResponse to notify the GUI.
+ * \param vError - the error code, this can be the Gui enum or system number
+ * \param vExtraLogInfo - any extra information to be logged. Not display to user.
+ * \return
+ */
+template
+bool DeviceController::checkError(DeviceError::Scripts_Error_Enum vError, TModel &vModel, QString vExtraLogInfo)
+{
+ if ( vError ) {
+ QString src = (vError > DeviceError::eDevice_Scripts_Error_Start ? MAbstract::unitText(MAbstract::Unit_Enum::eUI) : MAbstract::unitText(MAbstract::Unit_Enum::eDV)) + ",";
+ vModel._data.mAccepted = false ;
+ vModel._data.mReason = vError ;
+ vModel._data.mMessage = DeviceError::deviceErrorText(vError, vError);
+ LOG_APPED(" ," + src + vModel._data.mMessage + " " + vExtraLogInfo);
+ emit didAttributeResponse(vModel._data);
+ return true;
+ }
+ return false;
+}
+
+///////////////////////////////////////////// DeviceBrightness
+/*!
+ * \brief DeviceController::onAttributeRequest
+ * \details Sets the brightness level
+ * \param vBrightness
+ */
+void DeviceController::onAttributeRequest(const DeviceBrightnessRequestData &vData)
+{
+ // ----- initializing the member variable models
+ _deviceBrightnessRequest ._data = vData;
+
+
+ // ----- extract the required data
+ _deviceBrightnessRequest.setBrightnessSysVal();
+ LOG_APPED( _deviceBrightnessRequest.toString());
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, vData.mRead ? Brightness_Get : Brightness_Set), _deviceBrightnessResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processBrightness.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBrightnessResponse);
+ return;
+ }
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ QStringList params;
+ params << QString::number(_deviceBrightnessRequest._data.mBrightness_val);
+ TimedProcess *timedProcess = new TimedProcess(&_processBrightness, script, timeout_ms, params);
+ timedProcess->start();
+
+}
+
+/*!
+ * \brief DeviceController::onProcessBrightnessFinished
+ * \details Called when the process to set the brightness has finished
+ * \param vExitCode (int) the exit code
+ * \note exit code -> 0 : set Accept [MBase] -> Log -> emit
+ * !0 : set Attrib [MBrgh] -> Log -> emit
+ * 1 - get an error when in onAttributeRequest : scriptErrorText([Gui Enum ])
+ * 2 - get an error when in onProcessBrightnessExitCode : scriptErrorText([vExitCode])
+ * 3 - get no error when in onProcessBrightnessExitCode : MDeviceResponse.toString()
+ * - in case 3 the specific model _data has to be filled prior to the toString to have it in the log.
+ */
+void DeviceController::onProcessBrightnessExitCode(int vExitCode, QProcess::ExitStatus)
+{
+ if ( ! checkError(static_cast(vExitCode), _deviceBrightnessResponse, _deviceBrightnessResponse.toString()) ) { // has no error
+ if (_deviceBrightnessRequest._data.mRead) {
+ bool ok = false;
+ int brightness = _processBrightness.readLine().toInt(&ok);
+ if (ok) {
+ _deviceBrightnessResponse.setBrightnessPercent(brightness);
+ }
+ else {
+ checkError(DeviceError::eDevice_Scripts_Error_Incorrect_Rsp,_deviceBrightnessResponse, _deviceBrightnessResponse.toString());
+ return;
+ }
+ }
+ else {
+ _deviceBrightnessResponse.setBrightnessPercent(_deviceBrightnessRequest._data.mBrightness_val);
+ _deviceBrightnessResponse._data.mMessage = _deviceBrightnessResponse.toString();
+ }
+ LOG_APPED(_deviceBrightnessResponse._data.mMessage);
+ emit didAttributeResponse(_deviceBrightnessResponse._data);
+ }
+}
+
+
+///////////////////////////////////////////// DeviceRootSSHAccess
+/*!
+ * \brief DeviceController::onAttributeRequest
+ * \details Sets the RootSSHAccess
+ * \param vRootSSHAccess
+ */
+void DeviceController::onAttributeRequest(const DeviceRootSSHAccessRequestData &vData)
+{
+ // ----- initializing the member variable models
+ _deviceRootSSHAccessRequest._data = vData;
+ LOG_APPED( _deviceRootSSHAccessRequest.toString());
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, RootSSHAccess), _deviceRootSSHAccessResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processRootSSHAccess.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceRootSSHAccessResponse);
+ return;
+ }
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ QStringList params;
+ if ( ! _deviceRootSSHAccessRequest._data.mIsGet ) params << FSN(_deviceRootSSHAccessRequest._data.mRootSSHAccess);
+ TimedProcess *timedProcess = new TimedProcess(&_processRootSSHAccess, script, timeout_ms, params);
+ timedProcess->start();
+}
+
+/*!
+ * \brief DeviceController::onProcessRootSSHAccessExitCode
+ * \details Called when the process to set the RootSSHAccess has finished
+ * \param vExitCode (int) the exit code
+ * \note exit code -> 0 : set Accept [MBase] -> Log -> emit
+ * !0 : set Attrib [MBrgh] -> Log -> emit
+ * 1 - get an error when in onAttributeRequest : scriptErrorText([Gui Enum ])
+ * 2 - get an error when in onProcessRootSSHAccessExitCode : scriptErrorText([vExitCode])
+ * 3 - get no error when in onProcessRootSSHAccessExitCode : MDeviceResponse.toString()
+ * - in case 3 the specific model _data has to be filled prior to the toString to have it in the log.
+ */
+void DeviceController::onProcessRootSSHAccessExitCode(int vExitCode, QProcess::ExitStatus)
+{
+ if ( ! checkError(static_cast(vExitCode), _deviceRootSSHAccessResponse, _deviceRootSSHAccessResponse.toString()) ) { // has no error
+ if (_deviceRootSSHAccessRequest._data.mIsGet) {
+ bool ok = true;
+ Qt::CheckState rootSSHAccess = Qt:: Unchecked;
+ uint value = _processRootSSHAccess.readLine().toUInt(&ok);
+ if ( ! ok ) goto lError;
+
+ switch (value) {
+ case 0 : rootSSHAccess = Qt:: Unchecked; break;
+ case 1 : rootSSHAccess = Qt::PartiallyChecked; break;
+ case 2 : rootSSHAccess = Qt:: Checked; break;
+ default : ok = false;
+ }
+
+ if ( ! ok ) goto lError;
+
+ _deviceRootSSHAccessResponse._data.mMessage = _deviceRootSSHAccessResponse.toString();
+ _deviceRootSSHAccessResponse._data.mRootSSHAccess = rootSSHAccess;
+ }
+ else {
+ _deviceRootSSHAccessResponse._data.mMessage = _deviceRootSSHAccessResponse.toString();
+ _deviceRootSSHAccessResponse._data.mRootSSHAccess = _deviceRootSSHAccessRequest._data.mRootSSHAccess;
+ }
+
+ LOG_APPED(_deviceRootSSHAccessResponse._data.mMessage);
+ emit didAttributeResponse(_deviceRootSSHAccessResponse._data);
+ }
+ else {
+ // the error in this case is handled in the checkError
+ }
+ return;
+
+lError:
+ checkError(DeviceError::eDevice_Scripts_Error_Incorrect_Rsp, _deviceRootSSHAccessResponse, _deviceRootSSHAccessResponse.toString());
+}
+
+///////////////////////////////////////////// DeviceCryptSetup
+/*!
+ * \brief DeviceController::onAttributeRequest
+ * \details Calls the CryptSetup script with the model data DeviceCryptSetupRequestData
+ * \param vData - the model data
+ */
+void DeviceController::onAttributeRequest(const DeviceCryptSetupRequestData &vData)
+{
+ //DEBUG qDebug() << " ---------- " << vData.mCommand << vData.mPassword;
+
+ _deviceCryptSetupRequest._data = vData;
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, Crypt_Setup), _deviceCryptSetupResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processCryptSetup.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceCryptSetupResponse);
+ return;
+ }
+
+
+ // ----- run the process
+ int timeout = 10000;
+ TimedProcess *timedProcess = new TimedProcess(&_processCryptSetup, script, timeout, { _deviceCryptSetupRequest._data.mCommand });
+ _processCryptSetup.setEnvironment(QProcess::systemEnvironment() << QString("PASSWORD=%1").arg(_deviceCryptSetupRequest._data.mPassword));
+ timedProcess->start();
+
+ // Update UI with a response
+ MDeviceCryptSetupResponse model;
+ model._data.mAccepted = false;
+ model._data.mMessage = tr("Encrypted Partition %1 started.").arg(_deviceCryptSetupRequest._data.mCommand);
+ emit didAttributeResponse(model.data());
+}
+
+/*!
+ * \brief DeviceController::onProcessCryptSetupExitCode
+ * \param vExitCode
+ * \param vStatus
+ */
+void DeviceController::onProcessCryptSetupExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ const int ERR_CRYPTSETUP_MOUNT_ISMOUNT=134; // is used in crypt_setup.sh do not modify
+
+ // The Exit code in this script is not used.
+ // any other checking is done by UI Software at the moment this script is called.
+ // The only thing matters is the pared device info in text and it will be empty string if error happens.
+ MDeviceCryptSetupResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processCryptSetup.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ // DEBUG: qDebug() << model._data.mEchoInfo;
+ emit didAttributeResponse(model.data());
+ LOG_APPED_UI(model.data().mMessage);
+
+ bool isSetup = _deviceCryptSetupRequest._data.mCommand == "setup";
+ bool isMount = _deviceCryptSetupRequest._data.mCommand == "mount";
+ bool isMounted = isMount && (
+ vExitCode == ERR_CRYPTSETUP_MOUNT_ISMOUNT || // is already mounted
+ vExitCode == 0 // successful mount
+ );
+ bool isUpdate = gEnableUpdating && isMounted;
+
+ if ( isMount ) emit didCryptSetupMount(model._data.mAccepted);
+
+ QString msg = "";
+ int err = 0 ;
+ //TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
+ // moving the configuration files if the encrypted partition creation was successful.
+ if ( isUpdate ) goto lMove; // if it is gEnableUpdating, bypass the mAccepted for already mounted.
+ if ( ! model._data.mAccepted ) goto lErr ; // any other case goto error
+ if ( ! isSetup ) goto lOut ; // if not setup do NOT continue to move configurations
+
+lMove:
+ err = Storage::Settings::configurationsMove(&msg, isUpdate);
+ if ( err ) {
+ model._data.mAccepted = false ;
+ model._data.mReason = err ;
+ model._data.mMessage = msg ;
+ emit didAttributeResponse(model.data());
+ LOG_APPED_UI(model.data().mMessage);
+ }
+
+lOut:
+ return;
+
+lErr:
+ LOG_DEBUG(QString("Encrypted Partition %1 failed").arg(_deviceCryptSetupRequest._data.mCommand));
+}
+
+///////////////////////////////////////////// DeviceBluetoothPaired
+void DeviceController::onAttributeRequest(const DeviceBluetoothPairedResetRequestData &)
+{
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, Bluetooth_Paired_Reset), _deviceBluetoothPairedResetResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processBluetoothPairedReset.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBluetoothPairedResetResponse);
+ return;
+ }
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ TimedProcess *timedProcess = new TimedProcess(&_processBluetoothPairedReset, script, timeout_ms);
+ timedProcess->start();
+}
+
+void DeviceController::onProcessBluetoothPairedResetExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ // TODO: review the usage and definition of this object _deviceBluetoothPairedResetResponse. do we need it any more?
+ MDeviceBluetoothPairedResetResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processBluetoothPairedReset.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ LOG_APPED_UI(model.data().mMessage);
+ emit didAttributeResponse(model.data());
+}
+
+///////////////////////////////////////////// DeviceBluetoothPairedQuery
+void DeviceController::onAttributeRequest(const DeviceBluetoothPairedQueryRequestData &)
+{
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, Bluetooth_Paired_Query), _deviceBluetoothPairedQueryResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processBluetoothPairedQuery.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceBluetoothPairedQueryResponse);
+ return;
+ }
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ TimedProcess *timedProcess = new TimedProcess(&_processBluetoothPairedQuery, script, timeout_ms);
+ timedProcess->start();
+}
+
+void DeviceController::onProcessBluetoothPairedQueryExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ // The Exit code in this script is not used.
+ // any other checking is done by UI Software at the moment this script is called.
+ // The only thing matters is the pared device info in text and it will be empty string if error happens.
+ MDeviceBluetoothPairedQueryResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processBluetoothPairedQuery.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ emit didAttributeResponse(model.data());
+ LOG_APPED_UI(model.data().mMessage);
+}
+
+/*!
+ * \brief DeviceController::doScreenshot
+ * \details emit the screenshot signal to run that in Device controller thread
+ * \param vCurrentDateTime
+ */
+void DeviceController::doScreenshot(const QImage &vImage, const QString &vFileName) {
+ emit didScreenshot(vImage, vFileName);
+}
+
+/*!
+ * \brief DeviceController::onScreenshot
+ * \details The function to save the image vImage in the file vFileName
+ * \param vImage - The image source object
+ * \param vFileName - The filename to same the image to
+ */
+void DeviceController::onScreenshot(const QImage &vImage, const QString &vFileName) {
+ vImage.save(vFileName);
+ LOG_DEBUG("Screenshot saved in " + vFileName);
+}
+
+/*!
+ * \brief DeviceController::ondoAddWatch
+ * \details The thread safe add file watch method
+ * \param vFile - The file to add to watch.
+ */
+void DeviceController::ondoAddWatch(const QString &vFile, bool vCreate)
+{
+ DeviceError::Scripts_Error_Enum err = DeviceError::eDevice_OK;
+ if ( vCreate ) {
+ if ( ! FileHandler::write ( vFile, "", false) ) { err = DeviceError::eDevice_Watch_Error_NotCreate; goto lErr; }}
+ else {
+ if ( ! QFileInfo::exists ( vFile ) ) { err = DeviceError::eDevice_Watch_Error_NotFound ; goto lErr; }}
+ if ( ! _fileSystemWatcher.removePath ( vFile ) ) { LOG_APPED_UI(QString("Device NOT watching %1").arg(vFile)); }
+ else { LOG_APPED_UI(QString("Device watch removed %1").arg(vFile)); }
+ if ( ! _fileSystemWatcher.addPath ( vFile ) ) { err = DeviceError::eDevice_Watch_Error_NotAdded ; goto lErr; }
+
+ LOG_APPED_UI(QString("Device watch %1").arg(vFile));
+ return;
+lErr:
+ LOG_DEBUG(DeviceError::deviceErrorText(err, 0));
+}
+
+/*!
+ * \brief DeviceController::onWatchFileChanged
+ * \details This slot is called once the files being watched is updated.
+ * \param vFile - the file name.
+ */
+void DeviceController::onWatchFileChanged(const QString &vFile)
+{
+ emit didWatchFileChange(vFile);
+}
+
+/*!
+ * \brief DeviceController::onEventThreadChange
+ * \details The signal handler for the DeviceController(this)::didEventThreadChange
+ * to start checking for the Encrypted partition readiness.
+ */
+void DeviceController::onEventThreadChange()
+{
+ //DEBUG qDebug() << " ---------- " << __FUNCTION__ << QThread::currentThread()->objectName() << QThread::currentThread() << qApp->thread();
+ if ( QThread::currentThread() != &Threads::_DeviceController_Thread ) {
+ qCritical() << " ***** Device controller thread not initialized correctly ***** ";
+ return;
+ }
+ _hasThread = true;
+ checkConfugurationMountReady();
+}
+
+/*!
+ * \brief DeviceController::onPOSTOSVersionData
+ * \details Collects the OS Version
+ * when it is ready after the POST is done reading OS Version
+ * \param vMacAddress - The Ethernet MAC address
+ */
+void DeviceController::onPOSTOSVersionData(const QString &vOSVersion) {
+ _osVersion = vOSVersion;
+ emit didPOSTOSVersionData (vOSVersion);
+}
+
+/*!
+ * \brief DeviceController::onPOSTEthernetData
+ * \details Collects the ethernet mac address
+ * when it is ready after the POST is done for the Ethernet
+ * \param vMacAddress - The Ethernet MAC address
+ */
+void DeviceController::onPOSTEthernetData(const QString &vMacAddress) {
+ _macEthernet = vMacAddress;
+ emit didPOSTEthernetData (vMacAddress);
+}
+
+/*!
+ * \brief DeviceController::onPOSTWirelessData
+ * \details Collects the wireless mac address
+ * when it is ready after the POST is done for the Wireless connection
+ * \param vMacAddress - The Wireless MAC address
+ */
+void DeviceController::onPOSTWirelessData(const QString &vMacAddress) {
+ _macWireless = vMacAddress;
+
+ encryption::varSalt(vMacAddress);
+ _hasSalt = ! vMacAddress.trimmed().isEmpty();
+ checkConfugurationMountReady();
+
+ emit didPOSTWirelessData (vMacAddress);
+}
+
+/*!
+ * \brief DeviceController::onPOSTBluetoothData
+ * \details Collects the bluetooth mac address
+ * when it is ready after the POST is done for the Bluetooth
+ * \param vMacAddress - The Bluetooth MAC address
+ */
+void DeviceController::onPOSTBluetoothData(const QString &vMacAddress) {
+ _macBluetooth = vMacAddress;
+ emit didPOSTBluetoothData (vMacAddress);
+}
+
+/*!
+ * \brief DeviceController::onPOSTCloudSyncData
+ * \details Collects the CloudSync Network Address
+ * when it is ready after the POST is done for the CloudSync
+ * \param vNetAddress - *** Not defined yet and is a placeholder for later use ***
+ */
+void DeviceController::onPOSTCloudSyncData(const QString &vNetAddress) {
+ _netCloudSync = vNetAddress;
+ emit didPOSTCloudSyncData (vNetAddress);
+}
+
+bool DeviceController::logBackup(const QString &vFileName)
+{
+ if ( ! gLogUpload ) return false; // no log backup
+
+ bool ok = true;
+ QString fileSrc = vFileName;
+ QFileInfo fileInfo(vFileName);
+ QString filePath(fileInfo.absolutePath());
+ QString fileBase(fileInfo.baseName());
+ QString fileSufx(fileInfo.completeSuffix().prepend(_Logger.logFileNamePendingSubExt()));
+ QString fileDest(QString("%1/%2.%3").arg(filePath, fileBase, fileSufx));
+ // DEBUG qDebug() << __FUNCTION__ << "\n" << vFileName << "\n" << fileDest;
+ if ( gLogCompress ) {
+ fileSrc += _Logger.logFileNameCompressExt();
+ fileDest += _Logger.logFileNameCompressExt();
+ ok = FileHandler::backupFile(vFileName);
+ }
+ ok = QFile::rename(fileSrc, fileDest);
+ return ok;
+}
+
+void DeviceController::onLogBackup(const QString &vFileName)
+{
+ if ( ! gLogUpload ) return; // no log backup ( slot )
+
+ bool ok = true;
+ ok = logBackup( vFileName);
+ emit didLogBackup(ok, vFileName);
+}
+
+bool DeviceController::logUpload(const QString &vFileName)
+{
+ if ( ! gLogUpload ) return false; // no log Uploaded rename
+
+ bool ok = true;
+ QFileInfo fileInfo(vFileName);
+ QString filePath;
+ QString fileBase(fileInfo.baseName());
+ QString ext = _Logger.logFileNamePendingSubExt();
+ QString fileSufx(fileInfo.completeSuffix().remove(ext));
+ QString fileDest = QString("%1.%2").arg(fileBase, fileSufx);
+
+ Logger::LogType logType = _Logger.logFileLogType(vFileName, filePath);
+ ok = logType != Logger::eLogNone;
+ if ( ! ok ) { LOG_APPED_UI(QString("CS Incorrect log upload type [%1]").arg(fileSufx)); goto lOut; }
+ // DEBUG qDebug() << __FUNCTION__ << "\n" << vFileName << "\n" << fileDest;
+
+ ok = QFile::rename(filePath + vFileName, filePath + fileDest);
+lOut:
+ return ok;
+}
+
+void DeviceController::onLogUpload(const QString &vFileName)
+{
+ if ( ! gLogUpload ) return; // no log uploaded rename ( slot )
+
+ bool ok = true;
+ ok = logUpload( vFileName);
+ emit didLogUpload(ok, vFileName);
+}
+
+/*!
+ * \brief DeviceController::checkConfugurationMountReady
+ * \details Cheks if the system is ready to mount the encrypted partition.
+ * The object has to be on its own thread and the salt for the decryption has to be ready.
+ */
+void DeviceController::checkConfugurationMountReady()
+{
+ /// in manufacturing or updating the system is logged with root and configurations are in /home/root
+ /// therefore no need to mount the cononfiguraiton partition.
+ /// also for manufacturing the partition is being set up
+ /// and is less steps for setup if the partition is not mounted.
+ if ( gEnableManufacturing ) return; // it should do the mount when gEnableUpdating, therefore here should not add gEnableUpdating.
+ if ( ! ( _hasThread && _hasSalt ) ) return;
+
+ DeviceCryptSetupRequestData data;
+ data.mCommand = "mount";
+ bool ok = false;
+ data.mPassword = encryption::configurationsPassword( ok );
+ if ( ! ok ) { // not enough infromation to create a secure passowrd
+ // status(tr("Not enough secure information provided"));
+ }
+ else {
+ onAttributeRequest(data);
+ }
+
+ // I_AM_HERE
+ // HERE move the settings read from ApplicationController to here
+ // here is when the DeviceController is moved to its thread
+ // and now can start mounting the encrypted partition
+ // and then read the settings.
+ // TODO don't forget to check for the required configurations files and parameters in the settings class.
+ // and take care of the security flag in the Storage class.
+}
+
+/*!
+ * \brief DeviceController::findPendingLogs
+ * \details this function counts downs for the _pendingInterval
+ * when the _pendingCounter reaches 0 will search for the files
+ * and if there is any will get the recent file in the list
+ */
+void DeviceController::findPendingLogs()
+{
+ if ( ! gLogUpload ) return; // no log upload pending detection
+
+ static QString pendingLog = "";
+ if( _pendingCounter ) {
+ _pendingCounter -- ;
+ return;
+ }
+ else {
+ _pendingCounter = _pendingInterval; // every minute
+ }
+
+ QFileInfoList pendingFiles;
+ QString logLoc = Log_Folder_Base;
+ QString logExt = QString("*.%1*").arg(_Logger.logFileNamePendingSubExt()); // "*.u.*";
+ for( auto logFolder : { Log_Folder_Application, Log_Folder_Service/*, Log_Folder_CloudSync*/ } ) {
+ pendingFiles = Storage::FileHandler::find( logLoc + logFolder, { logExt } );
+ // look into the list.
+ // if there are pending files,
+ // send a request only for the top on the list
+ /// Note I thought it makes sense to send the oldest on the application and service logs
+ /// but there are some conversation about the situation if something happens on the device,
+ /// and it would be a critical situation to get the recent/top log and won't wait for the old ones to upload.
+ // * When gets uploaded, moves from pending then next one comes to top
+ // the process repeats until there is no file in pending
+
+ bool uploadOldestFirst = true; //TODO: make if configurable(cfg, or cli)
+
+ if ( pendingFiles.count() ) {
+ // the most recent/first log file, to first ask for the current log which has just been saved as pending
+ if ( uploadOldestFirst ) {
+ _pendingLog = pendingFiles.last().absoluteFilePath();
+ } else {
+ _pendingLog = pendingFiles.first().absoluteFilePath();
+ }
+ QString message = pendingLog;
+ LOG_DEBUG(message);
+ emit didPendingLog( _pendingLog, FileHandler::sha256sum( _pendingLog ) );
+ // when a pending file found in the first log folder stop
+ // until there is none in first one (log)
+ // then continue to the next log folder (service) ...
+ goto lOut;
+ }
+ }
+lOut:
+ return;
+}
+
+///////////////////////////////////////////// DeviceFactoryReset
+void DeviceController::onAttributeRequest(const DeviceFactoryResetRequestData &vData)
+{
+ _deviceFactoryResetRequest._data = vData;
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, Factory_Reset), _deviceFactoryResetResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processFactoryReset.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceFactoryResetResponse);
+ return;
+ }
+
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ TimedProcess *timedProcess = new TimedProcess(&_processFactoryReset, script, timeout_ms);
+ timedProcess->start();
+
+ MDeviceFactoryResetResponse model;
+ model._data.mAccepted = false; // will indirectly set the property factoryResetEnabled
+ model._data.mMessage = tr("Factory Reset started.");
+ emit didAttributeResponse(model.data());
+}
+
+/*!
+ * \brief DeviceController::onProcessFactoryResetExitCode
+ * \param vExitCode - the script exit code.
+ * \param vStatus - the script echoed message.
+ */
+void DeviceController::onProcessFactoryResetExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ // The Exit code in this script is not used.
+ // any other checking is done by UI Software at the moment this script is called.
+ // The only thing matters is the paired device info in text and it will be empty string if error happens.
+ MDeviceFactoryResetResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processFactoryReset.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ // DEBUG: qDebug() << model._data.mMessage << deviceInfo;
+ emit didAttributeResponse (model.data());
+ emit didFactoryReset (model._data.mAccepted);
+
+ LOG_APPED_UI(model.data().mMessage);
+}
+
+///////////////////////////////////////////// DeviceDecommission
+void DeviceController::onAttributeRequest(const DeviceDecommissionRequestData &vData)
+{
+ _deviceDecommissionRequest._data = vData;
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, Device_Decommission), _deviceDecommissionResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processDecommission.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceDecommissionResponse);
+ return;
+ }
+
+
+ // ----- run the process
+ int timeout_ms = 10000;
+ TimedProcess *timedProcess = new TimedProcess(&_processDecommission, script, timeout_ms, { CloudSyncPath });
+ _processDecommission.setEnvironment(QProcess::systemEnvironment() << QString("PASSWORD=%1").arg(_deviceDecommissionRequest._data.mPassword));
+ timedProcess->start();
+
+ MDeviceDecommissionResponse model;
+ model._data.mAccepted = false; // will indirectly set the property decommissionEnabled
+ model._data.mMessage = tr("Decommissioning started.");
+ emit didAttributeResponse(model.data());
+}
+
+/*!
+ * \brief DeviceController::onProcessDecommissionExitCode
+ * \param vExitCode
+ * \param vStatus
+ */
+void DeviceController::onProcessDecommissionExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ // The Exit code in this script is not used.
+ // any other checking is done by UI Software at the moment this script is called.
+ // The only thing matters is the paired device info in text and it will be empty string if error happens.
+ MDeviceDecommissionResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processDecommission.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ // DEBUG: qDebug() << model._data.mMessage << deviceInfo;
+ emit didAttributeResponse (model.data());
+ emit didDecommissioning (model._data.mAccepted);
+
+ LOG_APPED_UI(model.data().mMessage);
+}
+
+///////////////////////////////////////////// DeviceUSBMounting
+void DeviceController::onAttributeRequest(const DeviceUSBMountRequestData &vData)
+{
+ Q_UNUSED(vData)
+ usbMountReq(vData.usbDevice, vData.isMountRequest);
+}
+
+/*!
+ * \brief DeviceController::usbMountReq
+ * \details Calls the Usb unmount/mount script
+ * \param vIsMount - indicate if the request is for mounting or unmounting
+ * \param vDevice - the path to the USB device
+ */
+void DeviceController::usbMountReq(const QString &vDevice, bool vIsMount)
+{
+ qDebug() << __FUNCTION__ << vDevice << vIsMount;
+ _deviceUSBMountRequest._data.isMountRequest = vIsMount ;
+ _deviceUSBMountRequest._data.usbDevice = vDevice ; // not necessary, but to be consistent
+
+ // ----- check that script exists.
+ QString script;
+ if ( checkError( DeviceError::checkScript(script, (vIsMount ? USB_Mount : USB_Unmount )), _deviceUSBMountResponse, script) )
+ return;
+
+ // ----- check if the process is not running
+ if ( _processUSBMount.state() != QProcess::NotRunning ) {
+ checkError(DeviceError::eDevice_Scripts_Error_IsRunning, _deviceUSBMountResponse);
+ return;
+ }
+
+ // ----- run the process
+ int timeout_ms = 5000;
+ TimedProcess *timedProcess = new TimedProcess(&_processUSBMount, script, timeout_ms, {vDevice, USB_Mount_Point, USB_File_System});
+ timedProcess->start();
+
+ MDeviceUSBMountResponse model;
+ model._data.mAccepted = false;
+ model._data.mMessage = vIsMount ? tr("USB unmount started.") : tr("USB mount started");
+ emit didAttributeResponse(model.data());
+}
+
+/*!
+ * \brief DeviceController::onProcessUSBMountExitCode
+ * \param vExitCode
+ * \param vStatus
+ */
+void DeviceController::onProcessUSBMountExitCode(int vExitCode, QProcess::ExitStatus vStatus)
+{
+ MDeviceUSBMountResponse model;
+ QByteArray deviceInfo;
+ if ( vStatus ) vExitCode = Device::DeviceError::eDevice_Scripts_Error_Status;
+ else deviceInfo = _processUSBMount.readAll();
+ model.fromByteArray( deviceInfo, &vExitCode );
+ emit didAttributeResponse(model.data());
+
+ // Re-evaluate the USB space available - need to call this here to avoid
+ // visual lag caused by waiting to call this function on the timer timeout
+ usbSpaceCheck();
+
+ bool ok = ! vStatus;
+ QString usbDevice = _deviceUSBMountRequest._data.usbDevice;
+ if(_deviceUSBMountRequest._data.isMountRequest) { // *** USB Mount
+ if ( ok && ! _mounted ) {
+ _mounted = true;
+ _removed = false;
+ LOG_DEBUG(QString("USB flash drive %1 has been mounted on %2").arg(usbDevice).arg(USB_Mount_Point));
+ emit didUSBDriveMount();
+ } else {
+ usbError(usbDevice);
+ }
+ } else { // *** USB Unmount
+ if ( ok && _mounted ) {
+ _mounted = false;
+ // _umounted = true; // I think it might be needed, but needs more testing.
+ LOG_DEBUG(QString("USB drive %2 unmounted").arg(usbDevice));
+ emit didUSBDriveUmount();
+ } else {
+ // the error is irrelevant, commented out for now
+ // usbError(usbDrive);
+ }
+ }
+
+ // log error and exit
+ return;
+}
Index: sources/gui/qml/KeyboardItem.qml
===================================================================
diff -u -ra522e6aa7a36ac696a9a956200e89d838f319e25 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/gui/qml/KeyboardItem.qml (.../KeyboardItem.qml) (revision a522e6aa7a36ac696a9a956200e89d838f319e25)
+++ sources/gui/qml/KeyboardItem.qml (.../KeyboardItem.qml) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -32,8 +32,6 @@
function setVisible(vVisible) {
Qt.inputMethod.show()
visible = vVisible
- // AMIR
- console.log("-----------keyboard locale is : " + VirtualKeyboardSettings.locale)
}
externalLanguageSwitchEnabled: true
@@ -56,7 +54,7 @@
anchors.top: _root.bottom
}
Component.onCompleted: {
- VirtualKeyboardSettings.locale = vLocalization.keyboardAcronym;
+ VirtualKeyboardSettings.locale = vLocalization.keyboardLocale;
console.log("Default keyboard locale set to : " + VirtualKeyboardSettings.locale)
}
}
Index: sources/model/settings/MSettings.cpp
===================================================================
diff -u -ra75bc5b80ad4ebde50f028b550cd534e589bd059 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/model/settings/MSettings.cpp (.../MSettings.cpp) (revision a75bc5b80ad4ebde50f028b550cd534e589bd059)
+++ sources/model/settings/MSettings.cpp (.../MSettings.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -142,8 +142,8 @@
}
}
-QString MSettings::systemLocale () { return value(Storage::Settings_Category_SettingsSystem, "Localization", "Locale" ).toString(); }
-QString MSettings::systemLanguage () { return value(Storage::Settings_Category_SettingsSystem, "Localization", "Language" ).toString(); }
+QString MSettings::systemLocale () { return value(Storage::Settings_Category_Locale, "Localization", "Locale" ).toString(); }
+QString MSettings::systemLanguage () { return value(Storage::Settings_Category_Locale, "Localization", "Language" ).toString(); }
/********** The common helper functions **********/
Index: sources/storage/Settings.cpp
===================================================================
diff -u -rb794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/storage/Settings.cpp (.../Settings.cpp) (revision b794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0)
+++ sources/storage/Settings.cpp (.../Settings.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -29,85 +29,65 @@
#include "Settings.h"
-bool Settings::exists(const QString &vSettingFile)
-{
- int err = Settings::Settings_Error::eError_None;
- if (! QFileInfo::exists(vSettingFile)) {
- err = Settings::Settings_Error::eError_SettingNotExists;
- LOG_DEBUG(errorMessage(err).arg(vSettingFile));
- return false;
- }
- return true;
-}
-
/*!
- * \brief Settings::fileName
- * \details returns the conf file by the settings information provided.
- * \param vCategory - the settings file category
- * \param vLocale - the settings file locale
- * \return QString configuration/settings file name
- */
-QString Settings::fileName(const QString &vCategory, const QString &vLocale) {
- return QString("%1%2%4.%3").arg(Storage::Settings_Path()).arg(vCategory).arg(_settingsExt).arg(vLocale.trimmed().isEmpty() ? "" : _settingsLocalSeparator + vLocale);
-}
-
-/*!
- * \brief Settings::doRead
- * \details Reads all the configuration files
+ * \brief Settings::readCategory
+ * \details Reads, parses and adds the read value to the settins.
+ * \param vCategory - the category of the configuration file to read.
* \return non-zero, error value on error, and zero on success.
*/
-int Settings::read()
+int Settings::readCategory(Category_Enum vCategory)
{
int err = Settings::Settings_Error::eError_None;
+ QString msg;
QFileInfo mSettingFile;
QString mCategory;
- for ( quint8 i = 0; i <= _categoryCount; i++ ) {
- mCategory = category(static_cast(i));
- switch (i) { // NOTE: don't use default case
- case eSettingsSystem :
- case eMessagesUnhandled :
- mSettingFile.setFile(fileName(mCategory, ""));
- // FALLTHROUGH
- break;
- case eInstructions :
- case eConfigurationsDataList :
- case eAlarms :
- case eEvents :
- case eRejects :
- case eGenericConfirm :
- mSettingFile.setFile(fileName(mCategory, _Settings.systemLocale()));
- // FALLTHROUGH
- break;
- }
+ QString mFileName;
+ Detail mDetail;
- if (! exists(mSettingFile.absoluteFilePath())) continue; // error handling is done in exists(), so just continue.
- QFile file(mSettingFile.absoluteFilePath());
- if (! file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- err = Settings::Settings_Error::eError_Read;
- LOG_APPED_PO(errorMessage(err).arg(Storage::Settings_Path()));
- return err;
- }
+ mCategory = category(vCategory);
+ mFileName = fileName(vCategory);
+ qDebug() << mCategory << mFileName;
+ mSettingFile.setFile(mFileName);
+ QFile mFile(mSettingFile.absoluteFilePath());
+ if (! mFile.exists() ) { err = Settings::Settings_Error::eError_SettingNotExists ; msg = errorMessage(err, mSettingFile.fileName ()) ; goto lOut; }
+ if (! mFile.open(QIODevice::ReadOnly | QIODevice::Text) ) { err = Settings::Settings_Error::eError_Read ; msg = errorMessage(err, Storage::Settings_Path()) ; goto lOut; }
- Detail detail;
- detail.content = file.readAll().trimmed();
- if (detail.content.isEmpty()) {
- //TODO Do not error out for now, the list of the config files which can be empty or not needs to be defined.
- // err = Settings::Settings_Error::eError_Empty;
- LOG_APPED_PO(errorMessage(Settings::Settings_Error::eError_Empty).arg(mSettingFile.fileName()));
- continue;
- }
+ mDetail.content = mFile.readAll().trimmed();
+ if (mDetail.content.isEmpty() ) { err = Settings::Settings_Error::eError_Empty ; msg = errorMessage(err, mSettingFile.fileName ()) ; goto lOut; }
- detail.location = mSettingFile.absolutePath() + "/";
- detail.category = mCategory;
+ mDetail.location = mSettingFile.absolutePath() + "/";
+ mDetail.category = mCategory;
- if ( ! parse(detail) ) {
- LOG_DEBUG( (QString("Configuration file '%1' failed to load").arg(mSettingFile.fileName())) );
- }
- else {
- LOG_DEBUG( (QString("Configuration file '%1' successfully loaded").arg(mSettingFile.fileName())) );
- }
+ if ( ! parse(mDetail) ) { err = Settings::Settings_Error::eError_Parse ; msg = errorMessage(err, mSettingFile.fileName ()) ; goto lOut; }
+ else { msg = errorMessage(err, mSettingFile.fileName ()) ; }
+
+lOut:
+ LOG_APPED_PO( msg );
+ return err;
+}
+
+/*!
+ * \brief Settings::readConfigurations
+ * \details Reads all the configuration files
+ * \return non-zero, error value on error, and zero on success.
+ */
+int Settings::readConfigurations()
+{
+ int err = Settings::Settings_Error::eError_None;
+ for ( quint8 i = 0; i <= _configurationsCount; i++ ) {
+ readCategory(static_cast(i));
}
+ return err;
+}
+/*!
+ * \brief Settings::readLocale
+ * \return
+ */
+int Settings::readLocale()
+{
+ int err = Settings_Error::eError_None;
+ err = readCategory(eConfigurationsLocale);
return err;
}
@@ -194,47 +174,42 @@
* \details Writes the setting in the configuration files
* \return
*/
-int Settings::saveSystem(const QString &vGroup, const QString &vKey, const QString &vValue)
+int Settings::save(const QString &vGroup, const QString &vKey, const QString &vValue, Category_Enum vCategory)
{
// qDebug() << vCategory
// << vGroup
// << vKey
// << vValue;
- QString mCategory = Storage::Settings_Category_SettingsSystem;
- QString mFileName = fileName(mCategory, "");
+
+ int err = Settings_Error::eError_None;
+ QString msg;
+ QString mCategory;
+ QString mPath;
+ QString mFileName;
QString mContent;
- int err = Settings_Error::eError_None;
+
+ if ( ! isCategoryWritable(vCategory) ) { err = Settings_Error::eError_Not_Writable ; msg = errorMessage(err ); goto lOut; }
+
+ mCategory = category(vCategory);
+ mFileName = fileName(vCategory);
// --------------------------------------------------------------------------------------------------------------
//Note: the configuration files which can be saved, are like settings and should not have duplicate values.
// as an example the Alarm volume can't have two separate duplicate entry in the settings.
// --------------------------------------------------------------------------------------------------------------
_Settings.add(mCategory, vGroup, vKey, vValue, false);
- QString mPath = QFileInfo(mFileName).absolutePath();
- if ( mPath.trimmed().isEmpty() ) {
- err = Settings_Error::eError_PathEmpty;
- LOG_DEBUG(errorMessage(err));
- return err;
- }
-
- if ( ! FileHandler::makeFolder(mPath) ) {
- err = Settings_Error::eError_MkDir;
- LOG_DEBUG(errorMessage(err).arg(mPath));
- return err;
- }
-
- for ( const auto &group : _Settings.groups(mCategory) ) {
+ mPath = QFileInfo(mFileName).absolutePath();
+ if ( mPath.trimmed().isEmpty() ) { err = Settings_Error::eError_PathEmpty ; msg = errorMessage(err ); goto lOut; }
+ if ( ! FileHandler::makeFolder(mPath) ) { err = Settings_Error::eError_MkDir ; msg = errorMessage(err, mPath ); goto lOut; }
+ for ( const auto &group : _Settings.groups(mCategory) ) {
mContent += QString("\n[%1]\n").arg(group);
for ( const auto &key : _Settings.keys(mCategory, group) ) {
mContent += QString("%1 = %2\n").arg(key).arg(_Settings.value(mCategory, group, key).toString());
}
}
+ if ( ! FileHandler::write(mFileName,mContent, false) ) { err = Settings_Error::eError_Write ; msg = errorMessage(err, mFileName ); goto lOut; }
- if ( ! FileHandler::write(mFileName,mContent, false) ) {
- err = Settings_Error::eError_Write;
- LOG_DEBUG(errorMessage(err).arg(mFileName));
- return err;
- }
-
+lOut:
+ if ( err ) LOG_DEBUG( msg );
return err;
}
@@ -256,71 +231,47 @@
lstExclude << QFileInfo( src + Storage::Settings_Category_SettingsSystem ).absolutePath();
}
- if ( ! Settings ::configurationsPOST(loc )) { err = Settings_Error::eError_Remove; msg = errorMessage(err ); LOG_DEBUG(msg); goto lOut; }
- if ( ! FileHandler ::makeFolder ( dst )) { err = Settings_Error::eError_Copy ; msg = errorMessage(err ); LOG_DEBUG(msg); goto lOut; }
+ if ( ! Settings ::configurationsPOST(loc )) { err = Settings_Error::eError_Remove; msg = errorMessage(err ); goto lOut; }
+ if ( ! FileHandler ::makeFolder ( dst )) { err = Settings_Error::eError_Copy ; msg = errorMessage(err ); goto lOut; }
for( QString dir : FileHandler::subFolders(src)) {
QString sub = src + dir;
if ( ! lstExclude.contains( sub ) ) {
- if ( FileHandler ::copyFolder (sub, dst )) { err = Settings_Error::eError_MkDir ; msg = errorMessage(err, dir); LOG_DEBUG(msg); goto lOut; }
+ if ( FileHandler ::copyFolder (sub, dst )) { err = Settings_Error::eError_MkDir ; msg = errorMessage(err, dir); goto lOut; }
}
- if ( FileHandler ::removeFolder (sub )) { err = Settings_Error::eError_POST ; msg = errorMessage(err, dir); LOG_DEBUG(msg); goto lOut; }
+ if ( FileHandler ::removeFolder (sub )) { err = Settings_Error::eError_POST ; msg = errorMessage(err, dir); goto lOut; }
}
Storage::Settings_Secured();
lOut:
+ if ( err ) LOG_DEBUG ( msg );
if ( vMessage ) { *vMessage = msg; }
return err;
}
/*!
- * \brief Settings::loadTranslation
+ * \brief Settings::loadTranslation
* \return
*/
-int Settings::loadTranslation()
+int Settings::loadTranslation(QTranslator &vTranslator)
{
int err = Settings_Error::eError_None;
- QString qmFile;
+ QString msg;
+ QString translationFile;
bool ok = true;
-// QString mCategory = Storage::Settings_Category_SettingsSystem;
-// QString mLanguage = "";
-// mLanguage = _Settings.value(mCategory, "Localization", "Language").toString();
-// if ( mLanguage.isEmpty() ) {
-// qDebug() << __FUNCTION__ << ":" << __LINE__ << "-------------Could Not Find the Language";
-// }
-// else {
-// qDebug() << __FUNCTION__ << ":" << __LINE__ << "-------------mLanguage:" << mLanguage;
-// }
-// QLocale::setDefault(QLocale::German);
-
-
QString locale = _Settings.systemLocale();
- if( locale.isEmpty()) {
- err = Settings_Error::eError_No_SettingsLocale;
- qDebug() << __FUNCTION__ << ":" << __LINE__ << "-------------Could Not Find the Language";
- LOG_DEBUG(errorMessage(err));
-// goto lOut;
- }
+ if( locale.isEmpty() ) { err = Settings_Error::eError_No_SettingsLocale ; msg = errorMessage(err ); goto lOut; }
- qmFile = QString("%1%2%4.%3")
- .arg(Storage::Settings_Path())
- .arg(Storage::Settings_Category_Translation)
- .arg("qm")
- .arg(_settingsLocalSeparator + QString("es")); // locale);
+ translationFile = fileName(eTranslation);
+ ok = vTranslator.load(translationFile);
- qDebug() << __FUNCTION__ << ":" << __LINE__ << "-------------qmFile:" << qmFile;
+ if ( ! ok ) { err = Settings_Error::eError_TranslationNotExists ; msg = errorMessage(err, translationFile ); goto lOut; }
+ else { msg = errorMessage(err, translationFile ); }
- ok = _translator.load(qmFile);
- if ( ! ok) {
- qDebug() << __FUNCTION__ << ":" << __LINE__ << "-------------FAILED";
- err = Settings_Error::eError_SettingNotExists;
- goto lOut;
- }
+ QCoreApplication::installTranslator(&vTranslator);
- QApplication::installTranslator(&_translator);
-
lOut:
-
+ LOG_APPED_PO( msg );
return err;
}
Index: sources/storage/Settings.h
===================================================================
diff -u -rb794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/storage/Settings.h (.../Settings.h) (revision b794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0)
+++ sources/storage/Settings.h (.../Settings.h) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -42,15 +42,14 @@
{
private:
// Settings
- const char *_config_attribute_tag = "#--";
- const char *_duplicate_key_on = "duplicate_key_on";
- const char *_duplicate_key_off = "duplicate_key_off";
- const char *_settingsExt = "conf";
- const char *_settingsFormat = "%1/%2.%3";
- const char *_settingsLocalSeparator = "_";
+ static constexpr const char *_config_attribute_tag = "#--";
+ static constexpr const char *_duplicate_key_on = "duplicate_key_on";
+ static constexpr const char *_duplicate_key_off = "duplicate_key_off";
+ static constexpr const char*_settingsExt = "conf";
+ static constexpr const char *_settingsFormat = "%1/%2.%3";
+ static constexpr const char*_settingsLocalSeparator = "_";
+ static constexpr const char*_translationExt = "qm";
- QTranslator _translator;
-
struct Detail {
QString category;
QString location;
@@ -68,31 +67,37 @@
eError_Write ,
eError_Read ,
eError_Empty ,
+ eError_Parse ,
eError_Copy ,
eError_Remove ,
eError_No_SettingsFolder ,
eError_No_SettingsFile ,
eError_SettingNotExists ,
eError_No_SettingsLocale ,
+ eError_Not_Writable ,
+ eError_TranslationNotExists ,
};
+
private:
- const QHash settingsError_Message { // no translation for the error. My experience shows the error messages if translated is not useful for serviceability and debugging.
- { eError_None , "" },
- { eError_POST , "The configuration source check failed." },
- { eError_PathEmpty , "The settings path is empty." },
- { eError_MkDir , "The configuration folder '%1' cannot be created." },
- { eError_Write , "The settings file %1 can't be written." },
- { eError_Read , "The settings file %1 can't be read." },
- { eError_Empty , "The settings file %1 is empty." },
- { eError_Copy , "The configuration folder '%1' cannot be copied." },
- { eError_Remove , "The configuration folder '%1' cannot be removed." },
- { eError_No_SettingsFolder , "No settings folder in the %1 path found." },
- { eError_No_SettingsFile , "No settings file in the %1 folder found." },
- { eError_SettingNotExists , "The setting file %1 doesn't exists." },
- { eError_No_SettingsLocale , "The system locale no defined." },
+ static inline QHash settingsError_Message { // no translation for the error. My experience shows the error messages if translated is not useful for serviceability and debugging.
+ { eError_None , "The configuration file '%1' successfully loaded," },
+ { eError_POST , "The configuration source check failed." },
+ { eError_PathEmpty , "The settings path is empty." },
+ { eError_MkDir , "The configuration folder '%1' cannot be created." },
+ { eError_Write , "The settings file %1 can't be written." },
+ { eError_Read , "The settings file %1 can't be read." },
+ { eError_Empty , "The settings file %1 is empty." },
+ { eError_Parse , "The settings file %1 parse error." },
+ { eError_Copy , "The configuration folder '%1' cannot be copied." },
+ { eError_Remove , "The configuration folder '%1' cannot be removed." },
+ { eError_No_SettingsFolder , "No settings folder in the %1 path found." },
+ { eError_No_SettingsFile , "No settings file in the %1 folder found." },
+ { eError_SettingNotExists , "The setting file %1 doesn't exists." },
+ { eError_No_SettingsLocale , "The system locale not defined. The default en_US used." },
+ { eError_Not_Writable , "The setting file %1 is not writable." },
+ { eError_TranslationNotExists , "The translation file %1 doesn't exists." },
};
-public:
- const QString errorMessage(int vErr, QString vArg1 = "", QString vArg2 = "") {
+ static const QString errorMessage(int vErr, QString vArg1 = "", QString vArg2 = "") {
if ( settingsError_Message.contains(vErr) ) {
if ( ! vArg1.isEmpty() ) return QString(settingsError_Message[vErr]).arg(vArg1);
if ( ! vArg2.isEmpty() ) return QString(settingsError_Message[vErr]).arg(vArg1).arg(vArg2);
@@ -102,63 +107,108 @@
}
// } Class SettingsError
-private:
- const QString makeSetting(const char *vPath, const char *vFile) {
- QString literal(_settingsFormat);
- return QString(literal.arg(vPath).arg(vFile).arg(_settingsExt));
- }
-
- bool exists(const QString &vSettingFile);
-
- QString fileName(const QString &vCategory, const QString &vLocale);
-
- bool parse(const Detail &vDetail);
-
-
-public:
Settings() {}
+public:
enum Category_Enum {
eSettingsSystem = 0, // has to be the first one to read the other configs according to the locale set in the Systems.conf
eInstructions ,
- eConfigurationsDataList , // TODO: the category for this conf is not used. may need to be merged into the Settings, but since it is list, It needs a little more thought.
+ eParametersDataList , // TODO: the category for this conf is not used. may need to be merged into the Settings, but since it is list, It needs a little more thought.
eAlarms ,
eEvents ,
eRejects ,
eMessagesUnhandled ,
eGenericConfirm ,
+ eTranslation ,
+ eConfigurationsLocale ,
+
}; // IMPORTANT: not having a eCount in the enum is intentional. to make sure in switch no enum is missed when not using the default.
- const int _categoryCount = eGenericConfirm;
+ static constexpr int _configurationsCount = eGenericConfirm;
enum Key_Enum {
- eKeyTitle ,
- eKeyMessage ,
- eKeyListTitle ,
- eKeyConfirm ,
- eKeyCancel ,
+ eKeyTitle ,
+ eKeyMessage ,
+ eKeyListTitle ,
+ eKeyConfirm ,
+ eKeyCancel ,
};
enum Location_Enum {
eInit ,
eSecured ,
};
- int read ();
- int saveSystem (const QString &vGroup, const QString &vKey, const QString &vValue);
- int configurationsMove (QString *vMessage = nullptr, bool vIsUpdate = false);
- int configurationsPOST (Location_Enum vLoc = Location_Enum::eSecured) { Q_UNUSED(vLoc); return true; }
- int loadTranslation ();
+ static int readConfigurations ();
+ static int save (const QString &vGroup, const QString &vKey, const QString &vValue, Category_Enum vCategory = eSettingsSystem);
+ static int configurationsMove (QString *vMessage = nullptr, bool vIsUpdate = false);
+ static int readLocale ();
+ static int loadTranslation (QTranslator &vTranslator);
+ static QString locale(Category_Enum vCategory, bool vSeparator = false) {
+ auto mLocale = [=](){
+ QString s = _Settings.systemLocale();
+ QString l = s.isEmpty() ? "" : QString( vSeparator ? _settingsLocalSeparator : "") + s ;
+ return l;
+ };
+ switch (vCategory) { // NOTE: don't use default case
+ case eSettingsSystem : return "" ;
+ case eInstructions : return mLocale() ;
+ case eParametersDataList : return mLocale() ;
+ case eAlarms : return mLocale() ;
+ case eEvents : return mLocale() ;
+ case eRejects : return mLocale() ;
+ case eMessagesUnhandled : return "" ;
+ case eGenericConfirm : return mLocale() ;
+ case eTranslation : return mLocale() ;
+ case eConfigurationsLocale : return "" ;
+ }
+ return "";
+ }
+
+ static QString extention(Category_Enum vCategory) {
+ switch (vCategory) { // NOTE: don't use default case
+ case eSettingsSystem : return _settingsExt ;
+ case eInstructions : return _settingsExt ;
+ case eParametersDataList : return _settingsExt ;
+ case eAlarms : return _settingsExt ;
+ case eEvents : return _settingsExt ;
+ case eRejects : return _settingsExt ;
+ case eMessagesUnhandled : return _settingsExt ;
+ case eGenericConfirm : return _settingsExt ;
+ case eTranslation : return _translationExt ;
+ case eConfigurationsLocale : return _settingsExt ;
+ }
+ return "";
+ }
+
+ static QString path(Category_Enum vCategory) {
+ switch (vCategory) { // NOTE: don't use default case
+ case eSettingsSystem : return Storage::Settings_Path() ;
+ case eInstructions : return Storage::Settings_Path() ;
+ case eParametersDataList : return Storage::Settings_Path() ;
+ case eAlarms : return Storage::Settings_Path() ;
+ case eEvents : return Storage::Settings_Path() ;
+ case eRejects : return Storage::Settings_Path() ;
+ case eMessagesUnhandled : return Storage::Settings_Path() ;
+ case eGenericConfirm : return Storage::Settings_Path() ;
+ case eTranslation : return Storage::Translations_Path() ;
+ case eConfigurationsLocale : return Storage::Configurations_Path() ;
+ }
+ return "";
+ }
+
static QString category(Category_Enum vCategory) {
switch (vCategory) { // NOTE: don't use default case
case eSettingsSystem : return Storage::Settings_Category_SettingsSystem ;
case eInstructions : return Storage::Settings_Category_Instructions ;
- case eConfigurationsDataList : return Storage::Settings_Category_ConfigurationsDataList ;
+ case eParametersDataList : return Storage::Settings_Category_DataList ;
case eAlarms : return Storage::Settings_Category_Alarms ;
case eEvents : return Storage::Settings_Category_Events ;
case eRejects : return Storage::Settings_Category_Rejects ;
case eMessagesUnhandled : return Storage::Settings_Category_MessagesUnhandled ;
case eGenericConfirm : return Storage::Settings_Category_GenericConfirm ;
+ case eTranslation : return Storage::Settings_Category_Translation ;
+ case eConfigurationsLocale : return Storage::Settings_Category_Locale ;
}
return "";
}
@@ -185,8 +235,9 @@
static bool isCategorySettingsSystem (const QString &vCategory) { return vCategory == category( eSettingsSystem ); }
static bool isCategoryInstructions (const QString &vCategory) { return vCategory == category( eInstructions ); }
- static bool isCategoryConfigurationsDataList (const QString &vCategory) { return vCategory == category( eConfigurationsDataList ); }
+ static bool isCategoryParametersDataList (const QString &vCategory) { return vCategory == category( eParametersDataList ); }
static bool isCategoryAlarms (const QString &vCategory) { return vCategory == category( eAlarms ); }
+ static bool isCategoryEvents (const QString &vCategory) { return vCategory == category( eEvents ); }
static bool isCategoryRejects (const QString &vCategory) { return vCategory == category( eRejects ); }
static bool isCategoryMessagesUnhandled (const QString &vCategory) { return vCategory == category( eMessagesUnhandled ); }
static bool isCategoryConfirm (const QString &vCategory) { return vCategory == category( eGenericConfirm ); }
@@ -196,6 +247,28 @@
static bool isKeyConfirm (const QString &vKey ) { return vKey == key ( eKeyConfirm ); }
static bool isKeyCancel (const QString &vKey ) { return vKey == key ( eKeyCancel ); }
+private: // using the Category_Enum so have to be defined after.
+ /*!
+ * \brief Settings::fileName
+ * \details returns the conf file by the settings information provided.
+ * \param vCategory - the settings file category
+ * \param vLocale - the settings file locale
+ * \return QString configuration/settings file name
+ */
+ static QString fileName ( Category_Enum vCategory ) {
+ return QString("%1%2%4.%3").arg(path(vCategory)).arg(category(vCategory)).arg(extention(vCategory)).arg(locale(vCategory,true));
+ }
+ static bool isCategoryWritable ( Category_Enum vCategory ) {
+ const QVector mCategory_Writable {
+ eSettingsSystem ,
+ eConfigurationsLocale ,
+ };
+ return mCategory_Writable.contains(vCategory);
+ }
+
+ static bool parse (const Detail &vDetail );
+ static int readCategory (Category_Enum vCategory );
+ static int configurationsPOST (Location_Enum vLoc = Location_Enum::eSecured) { Q_UNUSED(vLoc); return true; }
};
}
Index: sources/storage/StorageGlobals.cpp
===================================================================
diff -u -r7a3067893b8133d0f47bbdddd3268439e722d37d -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision 7a3067893b8133d0f47bbdddd3268439e722d37d)
+++ sources/storage/StorageGlobals.cpp (.../StorageGlobals.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -83,7 +83,23 @@
const char *Settings_Path () { return gUseRootHome ? Settings_Path_Init : ( ( gEnableManufacturing || gEnableUpdating ) ? ( settings_secured ? Settings_Path_Name: Settings_Path_Init ) : Settings_Path_Name ); }
void Settings_Secured() { settings_secured = true; }
+ const char *Configurations_Path() {
#ifdef BUILD_FOR_TARGET
+ return QString(QCoreApplication::applicationDirPath() + "/").toLatin1().constData();
+#else
+ return "/home/denali/Desktop/";
+#endif
+ }
+
+ const char *Translations_Path() {
+#ifdef BUILD_FOR_TARGET
+ return QString(QCoreApplication::applicationDirPath() + "/").toLatin1().constData();
+#else
+ return "/home/denali/Projects/application/resources/";
+#endif
+ }
+
+#ifdef BUILD_FOR_TARGET
//WARNING: This has to match with the crypt_setup.sh
const char *Settings_Path_Init = "/home/root/.config/"; // this is the manufacturing or update setup and the user is root.
const char *Settings_Path_Name = "/var/configurations/";
@@ -92,22 +108,25 @@
const char *Settings_Path_Init = "/home/denali/Projects/application/resources/settings/";
const char *Settings_Path_Name = "/home/denali/Projects/application/resources/settings/";
#endif
- const char *Settings_Category_Instructions = "Instructions/Instructions";
- const char *Settings_Category_InstructionsImagesLoc = "%1/Instructions/";
- const char *Settings_Category_ConfigurationsDataList = "Configurations/DataList" ;
- const char *Settings_Category_Alarms = "Alarms/Alarms" ;
- const char *Settings_Category_Events = "Alarms/Events" ;
- const char *Settings_Category_Rejects = "Alarms/Rejects" ;
- const char *Settings_Category_MessagesUnhandled = "Messages/Unhandled" ;
- const char *Settings_Category_SettingsSystem = "Settings/System" ;
- const char *Settings_Category_GenericConfirm = "Confirm/Confirm" ;
- const char *Settings_Category_Translation = "Translation/Translation" ;
- const char *Settings_Key_Title = "Title" ;
- const char *Settings_Key_Message = "Message" ;
- const char *Settings_Key_ListTitle = "ListTitle" ;
- const char *Settings_Key_Confirm = "Confirm" ;
- const char *Settings_Key_Cancel = "Cancel" ;
+ const char *Settings_Category_Instructions = "Instructions/Instructions" ;
+ const char *Settings_Category_InstructionsImagesLoc = "%1/Instructions/" ;
+ const char *Settings_Category_DataList = "Parameters/DataList" ;
+ const char *Settings_Category_Alarms = "Alarms/Alarms" ;
+ const char *Settings_Category_Events = "Alarms/Events" ;
+ const char *Settings_Category_Rejects = "Alarms/Rejections" ;
+ const char *Settings_Category_MessagesUnhandled = "Messages/Unhandled" ;
+ const char *Settings_Category_SettingsSystem = "Settings/System" ;
+ const char *Settings_Category_GenericConfirm = "Confirm/Confirm" ;
+ const char *Settings_Category_Translation = "translations/translation" ; // in qrc
+ const char *Settings_Category_Locale = "settings/locale" ; // in app location
+ // common key.value pairs
+ const char *Settings_Key_Title = "Title" ;
+ const char *Settings_Key_Message = "Message" ;
+ const char *Settings_Key_ListTitle = "ListTitle" ;
+ const char *Settings_Key_Confirm = "Confirm" ;
+ const char *Settings_Key_Cancel = "Cancel" ;
+
// CloudSync credentials
#ifdef BUILD_FOR_TARGET
const char *CloudSync_Base_Path_Name = gUseRootHome ? "/home/root/.cloudSync/" : "/var/configurations/CloudSync/";
Index: sources/storage/StorageGlobals.h
===================================================================
diff -u -rb794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision b794e2e09c4a06e6faaa722f2dc35f50e5f2e8e0)
+++ sources/storage/StorageGlobals.h (.../StorageGlobals.h) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -53,18 +53,22 @@
// Settings
extern void Settings_Secured ();
extern const char *Settings_Path ();
+ extern const char *Configurations_Path ();
+ extern const char *Translations_Path ();
+
extern const char *Settings_Path_Init ;
extern const char *Settings_Path_Name ;
extern const char *Settings_Category_Instructions ;
extern const char *Settings_Category_InstructionsImagesLoc ;
- extern const char *Settings_Category_ConfigurationsDataList ;
+ extern const char *Settings_Category_DataList ;
extern const char *Settings_Category_Alarms ;
extern const char *Settings_Category_Events ;
extern const char *Settings_Category_Rejects ;
extern const char *Settings_Category_MessagesUnhandled ;
extern const char *Settings_Category_SettingsSystem ;
extern const char *Settings_Category_GenericConfirm ;
- extern const char *Settings_Category_Translation ;
+ extern const char *Settings_Category_Translation ; // in qrc
+ extern const char *Settings_Category_Locale ; // in app location /settings
// Settings - Keys
extern const char *Settings_Key_Title ;
extern const char *Settings_Key_Message ;
Index: sources/storage/TreatmentLog.cpp
===================================================================
diff -u -r4947841e8cdd7e72d4fe26e604f7e5061fb86d64 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision 4947841e8cdd7e72d4fe26e604f7e5061fb86d64)
+++ sources/storage/TreatmentLog.cpp (.../TreatmentLog.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -203,7 +203,7 @@
// TODO : The settings needs modification not only to define the category and groups in a common header but also the settings itself needs some mods.
// - the category shall become as part of the group
// - the structure of the settings should become horizontal which vertical now.
- QString mCategory = Storage::Settings_Category_ConfigurationsDataList;
+ QString mCategory = Storage::Settings_Category_DataList;
QString mAcidConcentrateType = _Settings.key(mCategory, "Acid Concentrate Options" , vData.mAcidConcentrateType );
QString mBicarbonateConcentrateType = _Settings.key(mCategory, "Bicarbonate Concentrate Options" , vData.mBicarbonateConcentrateType );
QString mDialyzerType = _Settings.key(mCategory, "Dialyzer Type Options" , vData.mDialyzerType );
Index: sources/view/VTreatmentCreate.cpp
===================================================================
diff -u -r2ef03b2ce51b4dc507f66e9671953a8e0824bde9 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/view/VTreatmentCreate.cpp (.../VTreatmentCreate.cpp) (revision 2ef03b2ce51b4dc507f66e9671953a8e0824bde9)
+++ sources/view/VTreatmentCreate.cpp (.../VTreatmentCreate.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -191,7 +191,7 @@
QStringList mBicarbonateConcentrateOptions ;
QStringList mDialyzerTypeOptions ;
- QString mCategory = Storage::Settings_Category_ConfigurationsDataList;
+ QString mCategory = Storage::Settings_Category_DataList;
if ( heparinTypeSet () ) { // this is managed on UI with heparinTypeSet() // && ( _heparinDispensingRate || _heparinBolusVolume )
mHeparinTypeOptions = _Settings.keys(mCategory, "Heparin Type Options" );
Index: sources/view/hd/data/VTreatmentRanges.cpp
===================================================================
diff -u -r2ef03b2ce51b4dc507f66e9671953a8e0824bde9 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/view/hd/data/VTreatmentRanges.cpp (.../VTreatmentRanges.cpp) (revision 2ef03b2ce51b4dc507f66e9671953a8e0824bde9)
+++ sources/view/hd/data/VTreatmentRanges.cpp (.../VTreatmentRanges.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -56,7 +56,7 @@
*/
void View::VTreatmentRanges::onActionReceive(const SettingsData &)
{
- QString mCategory = Storage::Settings_Category_ConfigurationsDataList;
+ QString mCategory = Storage::Settings_Category_DataList;
bool isConfigsOk = true; // assume configurations are valid
Index: sources/view/settings/VLocalization.cpp
===================================================================
diff -u -ra522e6aa7a36ac696a9a956200e89d838f319e25 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/view/settings/VLocalization.cpp (.../VLocalization.cpp) (revision a522e6aa7a36ac696a9a956200e89d838f319e25)
+++ sources/view/settings/VLocalization.cpp (.../VLocalization.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -35,27 +35,21 @@
void View::VLocalization::doAdjustment(quint8 vLanguageIndex)
{
- Storage::Settings settings;
+ QString mLocale = _localeMap .value(vLanguageIndex);
+ QString mLanguage = _languageMap.value(vLanguageIndex);
- QString mLocale = "";
- QString mLanguage = "";
+ if ( Storage::Settings::save("Localization", "Locale" , mLocale , Storage::Settings::Category_Enum::eConfigurationsLocale ) ) goto lErr;
+ if ( Storage::Settings::save("Localization", "Language" , mLanguage , Storage::Settings::Category_Enum::eConfigurationsLocale ) ) goto lErr;
- mLocale = _localeMap.value(vLanguageIndex);
- if ( settings.saveSystem("Localization", "Locale", mLocale ) ) goto lErr;
-
- mLanguage = _languageMap.value(vLanguageIndex);
- if ( settings.saveSystem("Localization", "Language", mLanguage ) ) goto lErr;
-
// FIXME: Notify UI with a message for success
- keyboardAcronym( _keyboardLocaleMap.value(vLanguageIndex) );
- qDebug() << __FUNCTION__ << ":" << __LINE__ << ":" << "------------------keyboardAcronym:" << keyboardAcronym();
+ //NOTE: We do not have other keyboards implemented for any language other than en_UK, en_US
+ // keyboardLocale( _keyboardLocaleMap.value(vLanguageIndex) );
return;
lErr:
LOG_DEBUG("Unsuccessfull configuration value storage for Language");
-
}
/*!
@@ -65,7 +59,7 @@
*/
void View::VLocalization::onActionReceive(const SettingsData &)
{
- QString mCategory = Storage::Settings_Category_SettingsSystem;
+ QString mCategory = Storage::Settings_Category_Locale;
QString mLanguage = "";
mLanguage = _Settings.value(mCategory, "Localization", "Language").toString();
@@ -78,6 +72,5 @@
lErr:
LOG_DEBUG("incorrect configuration value for Language");
// FIXME: Notify UI with a message
-
}
Index: sources/view/settings/VLocalization.h
===================================================================
diff -u -ra522e6aa7a36ac696a9a956200e89d838f319e25 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/view/settings/VLocalization.h (.../VLocalization.h) (revision a522e6aa7a36ac696a9a956200e89d838f319e25)
+++ sources/view/settings/VLocalization.h (.../VLocalization.h) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -38,22 +38,19 @@
QMap _languageMap {
{0, "English"},
{1, "Spanish"},
- {2, "German"},
- {3, "French"}
+ {2, "Germany"},
};
QMap _localeMap {
- {0, "en"},
+ {0, " "}, // the english is the default and empty to load the default files.
{1, "es"},
{2, "de"},
- {3, "fr"}
};
QMap _keyboardLocaleMap {
{0, "en_US"},
{1, "es_ES"},
{2, "de_DE"},
- {3, "fr_FR"}
};
// The property adjustment_Triggered has to be always true
@@ -63,7 +60,7 @@
PROPERTY( QString , notification ,"")
PROPERTY( quint8 , languageIndex , 0)
- PROPERTY( QString , keyboardAcronym ,"de_DE")
+ PROPERTY( QString , keyboardLocale ,_keyboardLocaleMap[0])
READONLY( QStringList, languageList, _languageMap.values())
Index: sources/view/settings/VSettings.cpp
===================================================================
diff -u -ra75bc5b80ad4ebde50f028b550cd534e589bd059 -rd9b9df9b23da89b4c27f4672ff6e7f570adcc48a
--- sources/view/settings/VSettings.cpp (.../VSettings.cpp) (revision a75bc5b80ad4ebde50f028b550cd534e589bd059)
+++ sources/view/settings/VSettings.cpp (.../VSettings.cpp) (revision d9b9df9b23da89b4c27f4672ff6e7f570adcc48a)
@@ -46,26 +46,23 @@
void VSettings::servicePass_post(const QString &vservicePass) {
//TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
- Storage::Settings settings;
- if ( settings.saveSystem(servicePassGroup(), servicePassKey(), vservicePass) != 0 ) {
+ if ( Storage::Settings::save(servicePassGroup(), servicePassKey(), vservicePass) != 0 ) {
servicePass("");
// FIXME: Notify UI with a message
}
}
void VSettings::roWaterMode_post(const bool &vroWaterMode_post) {
//TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
- Storage::Settings settings;
- if ( settings.saveSystem(roWaterModeGroup(), roWaterModeKey(), QString::number(vroWaterMode_post)) != 0 ) {
+ if ( Storage::Settings::save(roWaterModeGroup(), roWaterModeKey(), QString::number(vroWaterMode_post)) != 0 ) {
roWaterMode(false);
// FIXME: Notify UI with a message
}
}
void VSettings::alarmVolume_post(const quint8 &valarmVolume) {
//TODO The Settings shall be the Singleton SettingsController and modify the MSettings like the others.
- Storage::Settings settings;
- settings.saveSystem(alarmVolumeGroup(), alarmVolumeKey(), QString::number(valarmVolume));
+ Storage::Settings::save(alarmVolumeGroup(), alarmVolumeKey(), QString::number(valarmVolume));
}
void VSettings::onActionReceive(const SettingsData &)