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 &)