Index: firmware/.launches/HD.launch =================================================================== diff -u -r79f3a45ee472c053fd191e8196245729703ebab3 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/.launches/HD.launch (.../HD.launch) (revision 79f3a45ee472c053fd191e8196245729703ebab3) +++ firmware/.launches/HD.launch (.../HD.launch) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -6,7 +6,7 @@ - + Index: firmware/App/Controllers/BloodFlow.c =================================================================== diff -u -r6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b) +++ firmware/App/Controllers/BloodFlow.c (.../BloodFlow.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -937,20 +937,67 @@ } /************************************************************************* - * @brief testSetTargetBloodFlowRateOverride and testResetTargetBloodFlowRateOverride + * @brief * The testSetTargetBloodFlowRateOverride function overrides the target \n * blood flow rate. \n - * The testResetTargetBloodFlowRateOverride function resets the override of the \n - * target blood flow rate. * @details * Inputs : none * Outputs : targetBloodFlowRate * @param value : override target blood flow rate (in mL/min) * @return TRUE if override successful, FALSE if not *************************************************************************/ -DATA_OVERRIDE_FUNC( S32, testSetTargetBloodFlowRateOverride, testResetTargetBloodFlowRateOverride, targetBloodFlowRate ) +BOOL testSetTargetBloodFlowRateOverride( S32 value ) +{ + BOOL result = FALSE; + if ( TRUE == isTestingActivated() ) + { + MOTOR_DIR_T dir; + + if ( value < 0 ) + { + dir = MOTOR_DIR_REVERSE; + } + else + { + dir = MOTOR_DIR_FORWARD; + } + targetBloodFlowRate.ovInitData = targetBloodFlowRate.data; // backup current target flow rate + targetBloodFlowRate.ovData = value; + targetBloodFlowRate.override = OVERRIDE_KEY; + result = setBloodPumpTargetFlowRate( ABS(value), dir, bloodPumpControlMode ); + } + + return result; +} + /************************************************************************* + * @brief + * The testResetTargetBloodFlowRateOverride function resets the override of the \n + * target blood flow rate. + * @details + * Inputs : none + * Outputs : targetBloodFlowRate + * @param none + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTargetBloodFlowRateOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetBloodFlowRate.data = targetBloodFlowRate.ovInitData; // restore pre-override target flow rate + targetBloodFlowRate.override = OVERRIDE_RESET; + targetBloodFlowRate.ovInitData = 0; + targetBloodFlowRate.ovData = 0; + result = setBloodPumpTargetFlowRate( targetBloodFlowRate.data, bloodPumpDirection, bloodPumpControlMode ); + } + + return result; +} + +/************************************************************************* * @brief testSetMeasuredBloodFlowRateOverride and testResetMeasuredBloodFlowRateOverride * The testResetMeasuredBloodFlowRateOverride function overrides the measured \n * blood flow rate. \n Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -r6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -921,20 +921,67 @@ } /************************************************************************* - * @brief testSetTargetDialInFlowRateOverride and testResetTargetDialInFlowRateOverride + * @brief * The testSetTargetDialInFlowRateOverride function overrides the target \n - * dialIn flow rate. \n - * The testResetTargetDialInFlowRateOverride function resets the override of the \n - * target dialIn flow rate. + * dialysate inlet flow rate. \n * @details * Inputs : none * Outputs : targetDialInFlowRate - * @param value : override target dialIn flow rate (in mL/min) + * @param value : override target dialysate inlet flow rate (in mL/min) * @return TRUE if override successful, FALSE if not *************************************************************************/ -DATA_OVERRIDE_FUNC( S32, testSetTargetDialInFlowRateOverride, testResetTargetDialInFlowRateOverride, targetDialInFlowRate ) +BOOL testSetTargetDialInFlowRateOverride( S32 value ) +{ + BOOL result = FALSE; + if ( TRUE == isTestingActivated() ) + { + MOTOR_DIR_T dir; + + if ( value < 0 ) + { + dir = MOTOR_DIR_REVERSE; + } + else + { + dir = MOTOR_DIR_FORWARD; + } + targetDialInFlowRate.ovInitData = targetDialInFlowRate.data; // backup current target flow rate + targetDialInFlowRate.ovData = value; + targetDialInFlowRate.override = OVERRIDE_KEY; + result = setDialInPumpTargetFlowRate( ABS(value), dir, dialInPumpControlMode ); + } + + return result; +} + /************************************************************************* + * @brief + * The testResetTargetDialInFlowRateOverride function resets the override of the \n + * target dialysate inlet flow rate. + * @details + * Inputs : none + * Outputs : targetDialInFlowRate + * @param none + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTargetDialInFlowRateOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetDialInFlowRate.data = targetDialInFlowRate.ovInitData; // restore pre-override target flow rate + targetDialInFlowRate.override = OVERRIDE_RESET; + targetDialInFlowRate.ovInitData = 0; + targetDialInFlowRate.ovData = 0; + result = setDialInPumpTargetFlowRate( targetDialInFlowRate.data, dialInPumpDirection, dialInPumpControlMode ); + } + + return result; +} + +/************************************************************************* * @brief testSetMeasuredDialInFlowRateOverride and testResetMeasuredDialInFlowRateOverride * The testResetMeasuredDialInFlowRateOverride function overrides the measured \n * dialIn flow rate. \n Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 6788d3f0fe41ee36ac7e9d4bd8e0f407f9fc2c4b) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -21,6 +21,7 @@ #include "DialOutFlow.h" #include "Buttons.h" #include "OperationModes.h" +#include "SystemCommMessages.h" #include "ModeStandby.h" #ifdef RM46_EVAL_BOARD_TARGET #include "Timers.h" Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r79f3a45ee472c053fd191e8196245729703ebab3 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 79f3a45ee472c053fd191e8196245729703ebab3) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -111,9 +111,21 @@ static U32 badCRCListIdx = 0; // where next bad message CRC time stamp will go in list static U32 badCRCListCount = 0; // # of bad CRCs in the list -#ifdef DEBUG_ENABLED -static U08 dbgRcvFromDialin[2048]; -static U32 dbgRcvFromDialinIdx = 0; +//#ifdef DEBUG_ENABLED +//static U08 dbgRcvFromDialin[2048]; +//static U32 dbgRcvFromDialinIdx = 0; +//#endif + +#ifdef CAN_TEST +U08 dbgRcvdCANFrames[2048][8]; +U32 dbgRcvdCANFrameTS[2048]; +U32 dbgRcvdCANFrameCh[2048]; +U32 dbgRcvdCANFrameIdx = 0; +U08 dbgXmitCANFrames[2048][8]; +U32 dbgXmitCANFrameTS[2048]; +U32 dbgXmitCANFrameCh[2048]; +U32 dbgXmitCANFrameIdx = 0; +U32 dbgCANOutIdx = 0; #endif // ********** private function prototypes ********** @@ -305,6 +317,23 @@ { transmitNextUARTPacket(); } +#ifdef CAN_TEST + if ( dbgRcvdCANFrameIdx >= 2000 ) + { + U32 i = dbgCANOutIdx; + char debugStr[ 150 ]; + + dbgCANOutIdx++; + if ( dbgCANOutIdx < 2000 ) + { + sprintf( debugStr, "%8d %4d %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X %8d %4d %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", + dbgRcvdCANFrameTS[i], dbgRcvdCANFrameCh[i], dbgRcvdCANFrames[i][0], dbgRcvdCANFrames[i][1], dbgRcvdCANFrames[i][2], dbgRcvdCANFrames[i][3], dbgRcvdCANFrames[i][4], dbgRcvdCANFrames[i][5], dbgRcvdCANFrames[i][6], dbgRcvdCANFrames[i][7], + dbgXmitCANFrameTS[i], dbgXmitCANFrameCh[i], dbgXmitCANFrames[i][0], dbgXmitCANFrames[i][1], dbgXmitCANFrames[i][2], dbgXmitCANFrames[i][3], dbgXmitCANFrames[i][4], dbgXmitCANFrames[i][5], dbgXmitCANFrames[i][6], dbgXmitCANFrames[i][7]); + sendDebugData( (U08*)debugStr, strlen(debugStr) ); +// printf(debugStr); + } + } +#endif } /************************************************************************* @@ -343,6 +372,19 @@ // if packet retrieved, add to buffer if ( result != 0 ) { +#ifdef CAN_TEST + if ( dbgRcvdCANFrameIdx >= 2000 ) + { + result = 99; // Break point here + } + else + { + dbgRcvdCANFrameTS[dbgRcvdCANFrameIdx] = getMSTimerCount(); + dbgRcvdCANFrameCh[dbgRcvdCANFrameIdx] = srcCANBox; + memcpy( &dbgRcvdCANFrames[dbgRcvdCANFrameIdx][0], data, 8); + dbgRcvdCANFrameIdx++; + } +#endif //#ifdef DEBUG_ENABLED // if ( srcCANBox == COMM_BUFFER_IN_CAN_PC ) // { @@ -581,6 +623,19 @@ if ( dataSize == CAN_MESSAGE_PAYLOAD_SIZE ) { signalCANXmitsInitiated(); +#ifdef CAN_TEST + if ( dbgXmitCANFrameIdx > 2000 ) + { + dataSize = 99; // Break point here + } + else + { + dbgXmitCANFrameTS[dbgXmitCANFrameIdx] = getMSTimerCount(); + dbgXmitCANFrameCh[dbgXmitCANFrameIdx] = mBox; + memcpy( &dbgXmitCANFrames[dbgXmitCANFrameIdx][0], data, 8); + dbgXmitCANFrameIdx++; + } +#endif if ( 0 != canTransmit( canREG1, mBox, data ) ) { result = CAN_MESSAGE_PAYLOAD_SIZE; @@ -913,6 +968,10 @@ static void checkTooManyBadMsgCRCs( void ) { U32 listTimeInMS; +#ifdef CAN_TEST + static U32 crcErrorCtr = 0; + crcErrorCtr++; +#endif // replace oldest bad CRC in list with this new one badCRCTimeStamps[ badCRCListIdx ] = getMSTimerCount(); @@ -925,8 +984,10 @@ if ( ( badCRCListCount >= MAX_COMM_CRC_FAILURES ) && ( listTimeInMS <= MAX_COMM_CRC_FAILURE_WINDOW_MS ) ) { #ifndef DISABLE_CRC_ERROR +#ifndef CAN_TEST activateAlarmNoData( ALARM_ID_COMM_TOO_MANY_BAD_CRCS ); #endif +#endif } } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r57ee0134869672b53ab5b7146b8988ede8f828d6 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -644,7 +644,33 @@ return result; } +#ifdef CAN_TEST +void broadcastCANTest1LargeFrequentMessage() +{ + static U16 seqNo = 0; + MESSAGE_T msg; + U32 i; + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_HD_CAN_TEST_1_LARGE_FREQ; + msg.hdr.payloadLen = 96; + + for ( i = 0; i < 12; i++ ) + { + memcpy(&msg.payload[i*8], &seqNo, 2); + seqNo++; + } + memcpy(&msg.payload[94], &seqNo, 2); + seqNo++; + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + serializeMessage( msg, COMM_BUFFER_OUT_CAN_HD_BROADCAST, ACK_NOT_REQUIRED ); +} +#endif + + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r57ee0134869672b53ab5b7146b8988ede8f828d6 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -39,6 +39,10 @@ MSG_ID_DIALYSATE_OUT_FLOW_DATA, // 11 MSG_ID_LOAD_CELL_READINGS, // 12 MSG_ID_TREATMENT_TIME, // 13 +#ifdef CAN_TEST + MSG_ID_HD_CAN_TEST_1_LARGE_FREQ, // 14 + MSG_ID_DG_CAN_TEST_1_LARGE_FREQ, // 15 +#endif // service/test CAN messages @@ -128,6 +132,11 @@ // MSG_ID_TREATMENT_TIME BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ); +#ifdef CAN_TEST +// MSG_ID_HD_CAN_TEST_1_LARGE_FREQ +void broadcastCANTest1LargeFrequentMessage(); +#endif + // *********** public test support message functions ********** // DEBUG OUTPUT Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r57ee0134869672b53ab5b7146b8988ede8f828d6 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 57ee0134869672b53ab5b7146b8988ede8f828d6) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -24,6 +24,7 @@ #include "OperationModes.h" #include "PresOccl.h" #include "SystemComm.h" +#include "SystemCommMessages.h" #include "WatchdogMgmt.h" #include "TaskGeneral.h" #include "RTC.h" @@ -60,12 +61,24 @@ if ( TRUE == uiCommunicated() ) #endif { +#ifndef CAN_TEST // monitor pressure/occlusion sensors execPresOccl(); +#endif // run operation mode state machine execOperationModes(); +#ifdef CAN_TEST + { + static U32 canTestCtr = 0; + if ( ++canTestCtr >= 2 ) + { + broadcastCANTest1LargeFrequentMessage(); + canTestCtr = 0; + } + } +#else // control blood pump execBloodFlowController(); @@ -83,6 +96,7 @@ // control alarm lamp execAlarmLamp(); +#endif #ifdef RM46_EVAL_BOARD_TARGET if ( getUserButtonState() == PIN_SIGNAL_LOW ) Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -ra74a984a7059f75d86ad87d6d9499bd8f94cc976 -r48278ac6fa3738a97349ed7f3278773daf1d8004 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision a74a984a7059f75d86ad87d6d9499bd8f94cc976) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 48278ac6fa3738a97349ed7f3278773daf1d8004) @@ -44,6 +44,7 @@ // 1st pass for FPGA execFPGAIn(); +#ifndef CAN_TEST // monitor and process buttons execButtons(); @@ -58,7 +59,7 @@ // monitor dialysate outlet pump and load cells execDialOutFlowMonitor(); - +#endif // 2nd pass for FPGA execFPGAOut(); }