Index: drydemoxmlstates.scxml
===================================================================
diff -u -rce5cfa527a7f05d77a42a05c859d5de4571de84f -rb4e5f0d4181127e7941f8ae437e1f61c5c746091
--- drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision ce5cfa527a7f05d77a42a05c859d5de4571de84f)
+++ drydemoxmlstates.scxml (.../drydemoxmlstates.scxml) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
@@ -1,24 +1,24 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -27,47 +27,69 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: sources/MessageGlobals.h
===================================================================
diff -u -raf84a44034a877134a53b6b48b016d409f843380 -rb4e5f0d4181127e7941f8ae437e1f61c5c746091
--- sources/MessageGlobals.h (.../MessageGlobals.h) (revision af84a44034a877134a53b6b48b016d409f843380)
+++ sources/MessageGlobals.h (.../MessageGlobals.h) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
@@ -121,6 +121,7 @@
enum Message_ID_Enum {
ID_NONE = 0x0000,
+ ID_PRESSURE_OCCLUSION_DATA_BC = 0x0900,
ID_TX_TIME_BC = 0x0D00,
ID_HD_TX_STATES_BC = 0x0F00,
ID_USER_TX_TIME_CHANGES_RQST = 0x1600,
@@ -134,6 +135,7 @@
ID_HD_PRIMING_TIME_BC = 0x4300,
ID_UI_SET_UF_VOLUME_RQST = 0x4F00,
ID_HD_SET_UF_VOLUME_RESP = 0x5000,
+ ID_HD_BLOOD_PRIME_BC = 0x5900,
ID_PRE_TX_STATES_BC = 0x5C00,
ID_SAMPLE_WATER_RESULT = 0x5F00,
ID_FILTER_FLUSH_TIME_BC = 0x6000,
Index: sources/StateController.cpp
===================================================================
diff -u -raf84a44034a877134a53b6b48b016d409f843380 -rb4e5f0d4181127e7941f8ae437e1f61c5c746091
--- sources/StateController.cpp (.../StateController.cpp) (revision af84a44034a877134a53b6b48b016d409f843380)
+++ sources/StateController.cpp (.../StateController.cpp) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
@@ -1,4 +1,6 @@
+#include
+
#include "StateController.h"
#include "ApplicationController.h"
#include "types.h"
@@ -20,10 +22,15 @@
_dryDemo.connectToState("BP_HR" , this, &StateController::onBPHRStateChange );
_dryDemo.connectToState("Ultrafiltraion" , this, &StateController::onUltrafiltrationStateChange );
_dryDemo.connectToState("Connection" , this, &StateController::onConnectionStateChange );
+
_dryDemo.connectToState("Start_Tx" , this, &StateController::onStartTreatmentStateChange );
+ _dryDemo.connectToState("Blood_Prime" , this, &StateController::onTreatmentBloodPrimeStateChange);
+ _dryDemo.connectToState("Treatment" , this, &StateController::onTreatmentTreatmentStateChange );
+
_dryDemo.connectToState("End_Tx" , this, &StateController::onEndTreatmentStateChange );
_dryDemo.connectToState("Disinfect" , this, &StateController::onDisinfectStateChange );
+
_dryDemoCurrentCmd = CMD_NONE;
resetVariables();
@@ -153,27 +160,12 @@
_hasUserConfirmedToProceed = true;
break;
- case ID_USER_TX_TIME_CHANGES_RQST: {
- int IDIndex = 0;
- Types::U32 txDurMin;
- GetValue(msg[1].toByteArray(), IDIndex, txDurMin);
-
- qDebug() << "New treat time" << txDurMin.value;
-
- _prescribedTreatmentTimeS *= MINUTES_TO_SECONDS;
-
- msgBack.clear();
- msgBack.append(static_cast(ID_USER_TX_TIME_CHANGES_RESP));
- msgBack.append(Can_Id::eChlid_HD_UI);
- msgBack.append(1);
- msgBack.append(0);
- msgBack.append(txDurMin.value);
- msgBack.append(DEFAULT_UF_VOLUME_L);
- emit _ApplicationController.didActionTransmit(msgBack);
- }
+ case ID_USER_TX_TIME_CHANGES_RQST:
+ _treatmentRcvdMessages[receivedMsgID] = msg[1];
break;
case ID_NONE:
+ case ID_PRESSURE_OCCLUSION_DATA_BC:
case ID_TX_TIME_BC:
case ID_HD_TX_PARAMS_RANGES_DATA:
case ID_HD_TX_STATES_BC:
@@ -188,6 +180,7 @@
case ID_HD_SET_UF_VOLUME_RESP:
case ID_HD_PATINET_CONNECTION_CONF_RESP:
case ID_USER_TX_TIME_CHANGES_RESP:
+ case ID_HD_BLOOD_PRIME_BC:
// Do nothing
break;
}
@@ -200,102 +193,116 @@
void StateController::timerEvent(QTimerEvent *)
{
- quint16 listSize = _dryDemoCmds[_dryDemoCurrentCmd].size();
+ _dryDemo.submitEvent("TimeoutEvent");
//qDebug() << "Index" << _index << listSize;
- if ((listSize > 1) && (_index < listSize)) {
+ if (_isBoradcastListReady) {
+ sendMessages(true);
+ }
- int counterType = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toInt();
- Counter_Type counterTypeEnum = static_cast(counterType);
+ if (_isSendListReady) {
+ sendMessages(false);
+ }
- //qDebug() << "Counter Type" << _dryDemoCurrentCmd << _index << counterTypeEnum;
+ quint16 listSize = _dryDemoCmds[_dryDemoCurrentCmd].size();
- //if (_dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toBool()) {
- if (counterTypeEnum != COUNTER_NONE) {
+ if (_dryDemoCurrentCmd != CMD_START_TX) {
+ if ((listSize > 1) && (_index < listSize)) {
- if (_timerBroadcastCount >= NUM_OF_COUNTS_TIMER_BC_EMIT) {
+ int counterType = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toInt();
+ Counter_Type counterTypeEnum = static_cast(counterType);
- QVariant tempVar;
- QVariantList msg;
+ //qDebug() << "Counter Type" << _dryDemoCurrentCmd << _index << counterTypeEnum;
- switch ( counterTypeEnum)
- {
- case COUNTER_NONE:
- // Do nothing
- break;
+ //if (_dryDemoCmds[_dryDemoCurrentCmd][_index][IS_TIMER_INDEX].toBool()) {
+ if (counterTypeEnum != COUNTER_NONE) {
- case COUNTER_PRE_TX_TIMERS:
- if (_currentCounterValue < 0) {
- _currentCounterValue = _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt();
- }
+ if (_timerBroadcastCount >= NUM_OF_COUNTS_TIMER_BC_EMIT) {
- _currentCounterValue--;
- _timerBroadcastCount = 0;
+ QVariant tempVar;
+ QVariantList msg;
- tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
- msg = tempVar.toList();
- msg[COUNT_DOWN_TIMER_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue;
- //qDebug() << "Counters Pre Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt();
- emit _ApplicationController.didActionTransmit(msg);
- break;
+ switch ( counterTypeEnum)
+ {
+ case COUNTER_NONE:
+ // Do nothing
+ break;
- case COUNTER_TX_TIMER:
- if ((_currentCounterValue < 0) && (_prescribedTreatmentTimeS < 0)) {
- _prescribedTreatmentTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_PRESCRIBED_S_INDEX].toUInt();
- quint32 elapsedTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_ELAPSED_S_INDEX].toUInt();
- _currentCounterValue = _prescribedTreatmentTimeS - elapsedTimeS;
- }
+ case COUNTER_PRE_TX_TIMERS:
+ if (_currentCounterValue < 0) {
+ _currentCounterValue = _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt();
+ }
- _currentCounterValue--;
- _timerBroadcastCount = 0;
+ _currentCounterValue--;
+ _timerBroadcastCount = 0;
- tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
- msg = tempVar.toList();
- msg[TIME_PRESCRIBED_S_INDEX - RESP_MSG_START_INDEX] = _prescribedTreatmentTimeS;
- msg[TIME_REMAINING_S_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue;
- qDebug() << "Counters Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index];
- emit _ApplicationController.didActionTransmit(msg);
- break;
+ tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
+ msg = tempVar.toList();
+ msg[COUNT_DOWN_TIMER_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue;
+ //qDebug() << "Counters Pre Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index][COUNT_DOWN_TIMER_INDEX].toUInt();
+ emit _ApplicationController.didActionTransmit(msg);
+ break;
- case COUNTER_RINSEBACK_TIMER:
- break;
- }
+ case COUNTER_TX_TIMER:
+ /*
+ if ((_currentCounterValue < 0) && (_prescribedTreatmentTimeS < 0)) {
+ _prescribedTreatmentTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_PRESCRIBED_S_INDEX].toUInt();
+ quint32 elapsedTimeS = _dryDemoCmds[_dryDemoCurrentCmd][_index][TIME_ELAPSED_S_INDEX].toUInt();
+ _currentCounterValue = _prescribedTreatmentTimeS - elapsedTimeS;
+ }
- if (_currentCounterValue == 0) {
- _index++;
- _currentCounterValue = COUNTER_VAR_DEFAULT_VALUE;
+ _currentCounterValue--;
+ _timerBroadcastCount = 0;
+
+ tempVar = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
+ msg = tempVar.toList();
+ msg[TIME_PRESCRIBED_S_INDEX - RESP_MSG_START_INDEX] = _prescribedTreatmentTimeS;
+ msg[TIME_REMAINING_S_INDEX - RESP_MSG_START_INDEX] = _currentCounterValue;
+ qDebug() << "Counters Tx" << _currentCounterValue << _dryDemoCmds[_dryDemoCurrentCmd][_index];
+ emit _ApplicationController.didActionTransmit(msg);
+ */
+ break;
+
+ case COUNTER_RINSEBACK_TIMER:
+ break;
+ }
+
+ if (_currentCounterValue == 0) {
+ _index++;
+ _currentCounterValue = COUNTER_VAR_DEFAULT_VALUE;
+ }
}
+ else {
+ _timerBroadcastCount++;
+ }
}
else {
- _timerBroadcastCount++;
- }
- }
- else {
- if (_broadcastMsgCount <= NUM_OF_COUNTS_TO_BC_MSG) {
- emit _ApplicationController.didActionTransmit(_dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX));
- _broadcastMsgCount++;
- }
+ if (_broadcastMsgCount <= NUM_OF_COUNTS_TO_BC_MSG) {
+ emit _ApplicationController.didActionTransmit(_dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX));
+ _broadcastMsgCount++;
+ }
- bool isWaitNeeded = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_WAIT_NEEDED_INDEX].toBool();
+ bool isWaitNeeded = _dryDemoCmds[_dryDemoCurrentCmd][_index][IS_WAIT_NEEDED_INDEX].toBool();
- if ((!isWaitNeeded) || (isWaitNeeded && _hasUserConfirmedToProceed)) {
- //qDebug() << "Nex Inedx" << _dryDemoCmds[_dryDemoCurrentCmd][_index];
+ if ((!isWaitNeeded) || (isWaitNeeded && _hasUserConfirmedToProceed)) {
+ //qDebug() << "Nex Inedx" << _dryDemoCmds[_dryDemoCurrentCmd][_index];
- if (_broadcastMsgCount > NUM_OF_COUNTS_TO_BC_MSG) {
- int nextCmd = _dryDemoCmds[_dryDemoCurrentCmd][_index][NEXT_AUTO_TRANSITION_INDEX].toInt();
- User_Command_ID nextCmdEnum = static_cast(nextCmd);
- qDebug() << "NONE" << nextCmd << nextCmdEnum;
- if (nextCmdEnum != CMD_NONE) {
- qDebug() << "Current Enum" << _dryDemoCurrentCmd;
- _dryDemoCurrentCmd = nextCmdEnum;
- qDebug() << "New transition" << nextCmdEnum << _dryDemoCurrentCmd << _index;
- _dryDemo.submitEvent("Transition_back_2_idle");
- }
+ if (_broadcastMsgCount > NUM_OF_COUNTS_TO_BC_MSG) {
+ int nextCmd = _dryDemoCmds[_dryDemoCurrentCmd][_index][NEXT_AUTO_TRANSITION_INDEX].toInt();
+ User_Command_ID nextCmdEnum = static_cast(nextCmd);
+ qDebug() << "NONE" << nextCmd << nextCmdEnum;
+ if (nextCmdEnum != CMD_NONE) {
+ qDebug() << "Current Enum" << _dryDemoCurrentCmd;
+ _dryDemoCurrentCmd = nextCmdEnum;
+ qDebug() << "New transition" << nextCmdEnum << _dryDemoCurrentCmd << _index;
+ _dryDemo.submitEvent("Transition_back_2_idle");
+ }
- _index++;
- _broadcastMsgCount = 0;
- _hasUserConfirmedToProceed = false;
+ _index++;
+ _broadcastMsgCount = 0;
+ _hasUserConfirmedToProceed = false;
+ }
}
}
}
@@ -862,6 +869,7 @@
_dryDemoCmds[CMD_CONNECTION].append(temp);
temp.clear();
+ /*
temp.append("Transition_2_Start_Tx");
temp.append(false);
temp.append(static_cast(CMD_NONE)); // auto transition
@@ -932,6 +940,7 @@
temp.append(DEFAULT_TX_PRESCRIBED_DUR_S - DEFAULT_TX_ELAPSED_TIME_S);
_dryDemoCmds[CMD_START_TX].append(temp);
temp.clear();
+ */
temp.append("Transition_2_End_Tx");
temp.append(static_cast(COUNTER_NONE)); // Transition to Tx. This is empty because there is no event
@@ -1004,27 +1013,164 @@
_hasUserConfirmedToProceed = false;
_currentCounterValue = COUNTER_VAR_DEFAULT_VALUE;
_prescribedTreatmentTimeS = PRESC_TIME_DEFAULT_VALUE;
+
+ _stateStatus = STATE_ON_ENTRY;
+ _isBoradcastListReady = false;
+ _isSendListReady = false;
+
+ _treatmentVars.accumulatedVolumeML = 0.0;
+ _treatmentVars.broadcastIntervalCount = 0;
+ _treatmentVars.treatmentElapsedTimeS = 0;
+ _treatmentVars.treatmentElapsedTimeS = 0;
+ _treatmentVars.broadcastIntervalCount = 0;
+
+ _broadcastMessages.clear();
+ _sendMessages.clear();
}
+void StateController::sendMessages(bool isBroadcast)
+{
+ QList msgList = _broadcastMessages;
+
+ if (isBroadcast) {
+ _broadcastMessages.clear();
+ }
+ else
+ {
+ msgList = _sendMessages;
+ _sendMessages.clear();
+
+ }
+
+ for (auto item: msgList) {
+ emit _ApplicationController.didActionTransmit(item);
+ }
+}
+
+void StateController::prepareOcclusionBroadcastData()
+{
+ QVariantList msg;
+ msg.append(static_cast(ID_PRESSURE_OCCLUSION_DATA_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(10.2); msg.append(12.3); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0); msg.append(0);
+ _broadcastMessages.append(msg);
+}
+
+void StateController::prepareTreatmentTimeBroadcastData()
+{
+ _treatmentVars.treatmentElapsedTimeS++;
+ _treatmentVars.remainingTreatmentTimeS = _treatmentVars.prescribedTreatmentTimeS - _treatmentVars.treatmentElapsedTimeS;
+
+ //qDebug() << " Treatment time" << QTime::currentTime() << _treatmentVars._broadcastIntervalCount << _treatmentVars._treatmentElapsedTimeS << _treatmentVars._remainingTreatmentTimeS;
+
+ QVariantList msg;
+ msg.append(static_cast(ID_TX_TIME_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(_treatmentVars.prescribedTreatmentTimeS);
+ msg.append(_treatmentVars.treatmentElapsedTimeS);
+ msg.append(_treatmentVars.remainingTreatmentTimeS);
+ _broadcastMessages.append(msg);
+}
+
+void StateController::prepareTreatmentStatesBroadcastData(const QVariantList &payload)
+{
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_TX_STATES_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+
+ for (auto item: payload) {
+ msg.append(item);
+ }
+ _broadcastMessages.append(msg);
+}
+
+void StateController::handleTreatmentReceivedMessages()
+{
+ for (auto i = _treatmentRcvdMessages.begin(), end = _treatmentRcvdMessages.end(); i != end; ++i) {
+
+ //qDebug() << "Hash Message" << i.key() << i.value();
+
+ if (i.key() == ID_USER_TX_TIME_CHANGES_RQST)
+ {
+ handleTreatmentTimeChangeRequest(i.value());
+ }
+ }
+
+ _treatmentRcvdMessages.clear();
+}
+
+void StateController::handleTreatmentTimeChangeRequest(const QVariant &payload)
+{
+ quint32 accept = REJECT_VALUE;
+ int IDIndex = 0;
+ Types::U32 txDurMinType;
+ GetValue(payload.toByteArray(), IDIndex, txDurMinType);
+
+ quint32 txDurMin = txDurMinType.value;
+ quint32 elapsedTimeMins = _treatmentVars.treatmentElapsedTimeS / SECONDS_PER_MINUTE;
+
+ if ((txDurMin > elapsedTimeMins) && (txDurMin >= MIN_TX_TIME_MINS)) {
+ float UFVolumeL = ((txDurMin - elapsedTimeMins) * _treatmentVars.prescribedUFRate) + _treatmentVars.refUFVolumeML;
+ UFVolumeL /= MILLILITERS_PER_LITER;
+
+ // TODO from treatment params
+ quint32 dialVolume = 600 * txDurMin; // TODO treatment params
+ bool isMinTxTimeValid = (txDurMin >= MIN_TX_TIME_MINS ? true : false);
+ bool isTxTimeValid = (txDurMin <= TX_PARAM_PRESCRIBED_DUR_S ? true : false);
+ bool isMinUFVolValid = ((UFVolumeL >= 0.0) || (UFVolumeL <= 0.0) ? true : false); // TODO fix the UF Vol
+ bool isUFVolValid = (UFVolumeL <= TX_PARAM_UF_VOLUME_L ? true : false);
+
+ qDebug() << "Test of tx" << _treatmentVars.prescribedUFRate << elapsedTimeMins << UFVolumeL << isUFVolValid;
+
+ if (isMinTxTimeValid && isTxTimeValid && isMinUFVolValid && isUFVolValid && (dialVolume <= MAX_DIALYSATE_VOLUME_ML)) {
+ // TODO set UF values
+ _treatmentVars.prescribedTreatmentTimeS = txDurMin * SECONDS_PER_MINUTE;
+ _treatmentVars.prescribedMaxUFVolML = UFVolumeL * MILLILITERS_PER_LITER;
+ accept = ACCEPT_VALUE;
+ qDebug() << "New tx time" << txDurMin * SECONDS_PER_MINUTE << accept;
+ }
+ }
+
+ _isSendListReady = false;
+ QVariantList resp;
+ resp.append(static_cast(ID_USER_TX_TIME_CHANGES_RESP));
+ resp.append(Can_Id::eChlid_HD_UI);
+ resp.append(accept);
+ resp.append(0);
+ resp.append(_treatmentVars.prescribedTreatmentTimeS);
+ resp.append(_treatmentVars.prescribedMaxUFVolML);
+ _sendMessages.append(resp);
+ _isSendListReady = true;
+}
+
// ----------- State transition methods ---------------- //
void StateController::onIdleStateChange(bool active)
{
if (active) {
- qDebug() << "Idle on entry";
+ qDebug() << "Idle on entry" << _dryDemoCurrentCmd;
- if ((_dryDemoCmds.contains(_dryDemoCurrentCmd)) && (_dryDemoCurrentCmd != CMD_NONE)) {
+ // TODO remove
+ if (_dryDemoCurrentCmd == CMD_START_TX) {
+ qDebug() << "Treatment event stareted";
+ _dryDemo.submitEvent("Transition_2_Start_Tx");
+ }
+ else if ((_dryDemoCmds.contains(_dryDemoCurrentCmd)) && (_dryDemoCurrentCmd != CMD_NONE)) {
transitionApplicationToStandBy();
QString transitionEvent = _dryDemoCmds[_dryDemoCurrentCmd][_index][TRANSITION_EVENT_INDEX].toString();
qDebug() << "Event" << transitionEvent <<_dryDemoCurrentCmd << _index;
_dryDemo.submitEvent(transitionEvent);
}
}
else {
- qDebug() << "Idle on exit!";
- QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
- emit _ApplicationController.didActionTransmit(msg);
- _index++;
+ if (_dryDemoCurrentCmd != CMD_START_TX) {
+ qDebug() << "Idle on exit!";
+ QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
+ emit _ApplicationController.didActionTransmit(msg);
+ _index++;
+ }
}
}
@@ -1042,6 +1188,10 @@
QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
emit _ApplicationController.didActionTransmit(msg);
}
+ else
+ {
+ qDebug() << "Sample inactive";
+ }
}
void StateController::onConsumablesStateChange(bool active)
@@ -1096,15 +1246,118 @@
}
}
-void StateController::onStartTreatmentStateChange(bool active)
+void StateController::onStartTreatmentStateChange(bool )
{
- if (active) {
+ if (_stateStatus == STATE_ON_ENTRY) {
qDebug() << "Start Treatment active";
- QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
- emit _ApplicationController.didActionTransmit(msg);
+
+ resetVariables();
+
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_OP_MODE));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(MODE_TREA);
+ msg.append(0);
+ _broadcastMessages.append(msg);
+ msg.clear();
+
+ msg.append(static_cast(ID_HD_TX_PARAMS_RANGES_DATA));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(0); msg.append(TX_PARAM_PRESCRIBED_DUR_S / SECONDS_PER_MINUTE);
+ msg.append(0.0); msg.append(TX_PARAM_UF_VOLUME_L);
+ msg.append(MIN_DIAL_RATE_MLPM); msg.append(MAX_DIAL_RATE_MLPM);
+ _broadcastMessages.append(msg);
+ msg.clear();
+
+ msg.append(1); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0);
+ prepareTreatmentStatesBroadcastData(msg);
+
+
+ _treatmentVars.prescribedMaxUFVolML = TX_PARAM_UF_VOLUME_L * MILLILITERS_PER_LITER;
+ _treatmentVars.prescribedUFRate = _treatmentVars.prescribedMaxUFVolML / (TX_PARAM_PRESCRIBED_DUR_S / SECONDS_PER_MINUTE);
+ _treatmentVars.refUFVolumeML = 0.0;
+
+ _isBoradcastListReady = true;
+ _stateStatus = STATE_ON_EXIT;
}
+ else if (_stateStatus == STATE_ON_EXIT)
+ {
+ _stateStatus = STATE_ON_ENTRY;
+ _dryDemo.submitEvent("Start_Tx_2_Blood_Prime");
+ }
}
+void StateController::onTreatmentBloodPrimeStateChange(bool)
+{
+ _treatmentVars.broadcastIntervalCount++;
+
+ if (_treatmentVars.accumulatedVolumeML > BLOOD_PRIME_VOLUME_ML) {
+ _stateStatus = STATE_ON_EXIT;
+ }
+
+ if (_stateStatus == STATE_ON_ENTRY) {
+ resetVariables();
+ qDebug() << "Blood prime enty";
+ _stateStatus = STATE_ON_ACTION;
+ }
+ else if (_stateStatus == STATE_ON_EXIT) {
+ qDebug() << "Blood prime exit";
+ _stateStatus = STATE_ON_ENTRY;
+ _dryDemo.submitEvent("Blood_Prime_2_Treatment");
+ }
+
+ _treatmentVars.accumulatedVolumeML += (TX_PARAM_BLOOD_FLOW_RATE_MLPM * BLOOD_FLOW_INTEGRATOR);
+
+ if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
+ _isBoradcastListReady = false;
+ QVariantList msg;
+ msg.append(static_cast(ID_HD_BLOOD_PRIME_BC));
+ msg.append(Can_Id::eChlid_HD_Sync);
+ msg.append(BLOOD_PRIME_VOLUME_ML);
+ msg.append(_treatmentVars.accumulatedVolumeML);
+ _broadcastMessages.append(msg);
+ prepareOcclusionBroadcastData();
+ _isBoradcastListReady = true;
+ }
+}
+
+void StateController::onTreatmentTreatmentStateChange(bool)
+{
+ _treatmentVars.broadcastIntervalCount++;
+
+ handleTreatmentReceivedMessages();
+
+ if (_stateStatus == STATE_ON_ENTRY) {
+ resetVariables();
+ qDebug() << "Treatment Treatment state";
+ _treatmentVars.prescribedTreatmentTimeS = TX_PARAM_PRESCRIBED_DUR_S;
+ _treatmentVars.treatmentElapsedTimeS = DEFAULT_TX_ELAPSED_TIME_S;
+ _stateStatus = STATE_ON_ACTION;
+ }
+ else if (_stateStatus == STATE_ON_EXIT) {
+ qDebug() << "Treat Treatment exit";
+ // _dryDemo.submitEvent("Treatment_2_End_Treatment");
+ }
+
+ if (_treatmentVars.broadcastIntervalCount % NUM_OF_BC_COUNTS_ADJUSTED == 0) {
+ _isBoradcastListReady = false;
+ QVariantList msg;
+ msg.append(2); msg.append(1); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0); msg.append(0); msg.append(0); msg.append(0); msg.append(0);
+ msg.append(0);
+ prepareTreatmentStatesBroadcastData(msg);
+ prepareOcclusionBroadcastData();
+ prepareTreatmentTimeBroadcastData();
+ _isBoradcastListReady = true;
+ }
+
+ if (_treatmentVars.remainingTreatmentTimeS <= 0 ) {
+ _stateStatus = STATE_ON_EXIT;
+ }
+}
+
void StateController::onEndTreatmentStateChange(bool active)
{
if (active) {
@@ -1121,5 +1374,9 @@
QVariantList msg = _dryDemoCmds[_dryDemoCurrentCmd][_index].mid(RESP_MSG_START_INDEX);
emit _ApplicationController.didActionTransmit(msg);
}
+ else
+ {
+ qDebug() << "Disinfect exit";
+ }
}
Index: sources/StateController.h
===================================================================
diff -u -raf84a44034a877134a53b6b48b016d409f843380 -rb4e5f0d4181127e7941f8ae437e1f61c5c746091
--- sources/StateController.h (.../StateController.h) (revision af84a44034a877134a53b6b48b016d409f843380)
+++ sources/StateController.h (.../StateController.h) (revision b4e5f0d4181127e7941f8ae437e1f61c5c746091)
@@ -33,7 +33,12 @@
#define UI_MSG_BB_PAYLOAD_ID 0x63
#define COUNTER_VAR_DEFAULT_VALUE -1
#define PRESC_TIME_DEFAULT_VALUE -1
- #define MINUTES_TO_SECONDS 60
+ #define SECONDS_PER_MINUTE 60
+ #define MINUTES_PER_HOUR 60
+ #define MILLISECONDS_PER_SECOND 1000
+ #define MILLILITERS_PER_LITER 1000
+ #define ACCEPT_VALUE 1
+ #define REJECT_VALUE 0
// Pre treatment defines
#define DEFAULT_TIMEOUT_S 10
@@ -48,16 +53,31 @@
#define QOBJECT_TIMER_TIMEOUT_MS 100
#define PROGRESS_TIME_BC_INTERVAL_MS 1000
#define NUM_OF_COUNTS_TIMER_BC_EMIT (PROGRESS_TIME_BC_INTERVAL_MS / QOBJECT_TIMER_TIMEOUT_MS)
+ #define NUM_OF_BC_COUNTS_ADJUSTED (NUM_OF_COUNTS_TIMER_BC_EMIT * 2)
#define NUM_OF_COUNTS_TO_BC_MSG 3
+ // Treatment params
+ #define MIN_DIAL_RATE_MLPM 100
+ #define MAX_DIAL_RATE_MLPM 600
+ #define MIN_TX_TIME_MINS 60
+
+ #define DEFAULT_TX_ELAPSED_TIME_S (2 * MINUTES_PER_HOUR) * SECONDS_PER_MINUTE
+ #define TX_PARAM_PRESCRIBED_DUR_S ((4 * MINUTES_PER_HOUR) + 30) * SECONDS_PER_MINUTE
+ #define TX_PARAM_UF_VOLUME_L 2.0
+ #define TX_PARAM_BLOOD_FLOW_RATE_MLPM 400
+ #define TX_PARAM_DIAL_FLOW_RATE_MLPM 600
+ #define TX_PARAM_SALINE_BOLUS_VOL_ML 200
+
// Treatment defines
- #define DEFAULT_TX_PRESCRIBED_DUR_S ((4 * 60) + 30) * MINUTES_TO_SECONDS
- #define DEFAULT_TX_ELAPSED_TIME_S (2 * 60) * MINUTES_TO_SECONDS
- #define TIME_PRESCRIBED_S_INDEX 5
- #define TIME_ELAPSED_S_INDEX 6
- #define TIME_REMAINING_S_INDEX 7
- #define DEFAULT_UF_VOLUME_L 2.0
+ #define TIME_PRESCRIBED_S_INDEX 5 // TODO remove
+ #define TIME_ELAPSED_S_INDEX 6 // TODo remove
+ #define TIME_REMAINING_S_INDEX 7 // TODO remove
+ #define BLOOD_PRIME_VOLUME_ML (106.6 + 40)
+ #define BLOOD_FLOW_INTEGRATOR (1.0 / (SECONDS_PER_MINUTE * (MILLISECONDS_PER_SECOND /QOBJECT_TIMER_TIMEOUT_MS)))
+ #define MAX_DIALYSATE_VOLUME_ML 150000
+
+
enum User_Command_ID {
CMD_NONE = -1,
CMD_TX_PARAMS = 0 ,
@@ -81,6 +101,13 @@
COUNTER_RINSEBACK_TIMER,
};
+ enum State_Status {
+ STATE_ON_ENTRY = 0,
+ STATE_ON_ACTION,
+ STATE_ON_EXIT,
+ };
+
+
QHash > _dryDemoCmds;
quint16 _index;
quint16 _broadcastMsgCount;
@@ -91,10 +118,39 @@
User_Command_ID _dryDemoCurrentCmd;
drydemoXMLstates _dryDemo;
+ // New state machine stuff
+ struct Treatment_Variables {
+ float accumulatedVolumeML;
+ quint32 broadcastIntervalCount;
+ quint32 treatmentElapsedTimeS;
+ quint32 remainingTreatmentTimeS;
+ quint32 prescribedTreatmentTimeS;
+ // UF variables
+ float prescribedMaxUFVolML;
+ float prescribedUFRate;
+ float refUFVolumeML;
+ };
+
+ State_Status _stateStatus;
+ QList _broadcastMessages;
+ QList _sendMessages;
+ QHash _treatmentRcvdMessages;
+ bool _isBoradcastListReady; // TODO use a mutex
+ bool _isSendListReady; // Todo use a mutex
+ Treatment_Variables _treatmentVars;
+
void initMessagesHashTable();
void transitionApplicationToStandBy();
void resetVariables();
+ void sendMessages(bool isBroadcast);
+
+ void prepareOcclusionBroadcastData();
+ void prepareTreatmentTimeBroadcastData();
+ void prepareTreatmentStatesBroadcastData(const QVariantList &payload);
+ void handleTreatmentReceivedMessages();
+ void handleTreatmentTimeChangeRequest(const QVariant &payload);
+
void onIdleStateChange(bool active);
void onTreatmentParamsStateChange(bool active);
void onWaterSampleStateChange(bool active);
@@ -104,7 +160,11 @@
void onBPHRStateChange(bool active);
void onUltrafiltrationStateChange(bool active);
void onConnectionStateChange(bool active);
- void onStartTreatmentStateChange(bool active);
+
+ void onStartTreatmentStateChange(bool);
+ void onTreatmentBloodPrimeStateChange(bool);
+ void onTreatmentTreatmentStateChange(bool);
+
void onEndTreatmentStateChange(bool active);
void onDisinfectStateChange(bool active);
};