Index: firmware/App/Controllers/AirPump.c =================================================================== diff -u --- firmware/App/Controllers/AirPump.c (revision 0) +++ firmware/App/Controllers/AirPump.c (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -0,0 +1,272 @@ +/************************************************************************** +* +* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file AirPump.c +* +* @author (last) Michael Garthwaite +* @date (last) 21-Nov-2022 +* +* @author (original) Michael Garthwaite +* @date (original) 21-Nov-2022 +* +***************************************************************************/ + +#include "reg_het.h" +#include "gio.h" +#include "AirPump.h" +#include "AlarmMgmt.h" +#include "ModeTreatmentParams.h" +#include "OperationModes.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" +#include "TaskPriority.h" +#include "Timers.h" + +/** + * @addtogroup AirPump + * @{ + */ + +// ********** private definitions ********** +#define AIR_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) +#define DATA_PUBLISH_COUNTER_START_COUNT +#define AIR_PUMP_GPIO_PIN 0x24 + + +static const U32 AIR_PUMP_STATUS_PERSISTENCE = ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ); + +typedef enum AirPumpMotorStates +{ + AIR_PUMP_MOTOR_OFF = 0, ///< Air Pump Off + AIR_PUMP_MOTOR_ON, ///< Air Pump On + NUM_OF_AIR_PUMP_MOTOR_STATES, + +} AIR_PUMP_MOTOR_STATE_T; + +// ********** private data ********** + +static AIR_PUMP_MOTOR_STATE_T currentAirPumpMotorState; + +static AIR_PUMP_STATE_T currentAirPumpState; +static U32 airPumpDataPublicationTimerCounter; + +static OVERRIDE_U32_T airPumpDataPublishInterval = { AIR_PUMP_DATA_PUB_INTERVAL, AIR_PUMP_DATA_PUB_INTERVAL, 0, 0 }; + + +// ********** private function prototypes ********** + +static AIR_PUMP_STATE_T handleAirPumpStartState( void ); +static AIR_PUMP_STATE_T handleAirPumpOffState( void ); +static AIR_PUMP_STATE_T handleAirPumpOnState ( void ); +static void publishAirPumpData( void ); + + +void initAirPump(void) +{ + currentAirPumpMotorState = AIR_PUMP_MOTOR_OFF; + currentAirPumpState = AIR_PUMP_STATE_START; + +} + +static void setAirPumpMotor(AIR_PUMP_MOTOR_STATE_T state) +{ + if ( NUM_OF_AIR_PUMP_MOTOR_STATES < state ) + { + gioSetBit( hetPORT1, AIR_PUMP_GPIO_PIN, (BOOL) state ); + } + else + { + // hard fault + } +} + +void setAirPumpState( AIR_PUMP_STATE_T state ) +{ + if ( NUM_OF_AIR_PUMP_STATES < state ) + { + currentAirPumpState = state; + } + else + { + // hard fault + } +} + +AIR_PUMP_MOTOR_STATE_T getAirPumpMotorState( void ) +{ + return gioGetBit( hetPORT1, AIR_PUMP_GPIO_PIN ); +} + +AIR_PUMP_STATE_T getAirPumpState( void ) +{ + return currentAirPumpState; +} + + +void execAirPumpMonitor( void ) +{ + AIR_PUMP_MOTOR_STATE_T state = currentAirPumpMotorState; + //check if motor is running at the state we requested it to. + // how to handle testers? + // otherwise we alarm/fault + + publishAirPumpData(); +} + +void execAirPumpController( void ) +{ + switch( currentAirPumpState ) + { + case AIR_PUMP_STATE_START: + currentAirPumpState = handleAirPumpStartState(); + break; + + case AIR_PUMP_STATE_OFF: + currentAirPumpState = handleAirPumpOffState(); + break; + + case AIR_PUMP_STATE_ON: + currentAirPumpState = handleAirPumpOnState(); + break; + /// open loop state for testing? + default: + //hard fault + break; + } +} + +static AIR_PUMP_STATE_T handleAirPumpStartState( void ) +{ + AIR_PUMP_STATE_T state = AIR_PUMP_STATE_OFF; + + return state; +} + +static AIR_PUMP_STATE_T handleAirPumpOffState( void ) +{ + AIR_PUMP_STATE_T state = AIR_PUMP_STATE_OFF; + + if (AIR_PUMP_MOTOR_ON == getAirPumpMotorState() ) + { + setAirPumpMotor( AIR_PUMP_MOTOR_OFF ); + } + + return state; +} + +static AIR_PUMP_STATE_T handleAirPumpOnState( void ) +{ + AIR_PUMP_STATE_T state = AIR_PUMP_STATE_ON; + + if (AIR_PUMP_MOTOR_OFF == getAirPumpMotorState()) + { + setAirPumpMotor( AIR_PUMP_MOTOR_ON ); + } + + return state; +} + +static void publishAirPumpData( void ) +{ + if (++airPumpDataPublicationTimerCounter >= getU32OverrideValue( &airPumpDataPublishInterval ) ) + { + AIR_PUMP_PAYLOAD_T data; + data.airPumpStateStatus = getAirPumpState(); + data.airPumpMotorStatus = getAirPumpMotorState(); + + broadcastData( MSG_ID_HD_AIR_PUMP_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( AIR_PUMP_PAYLOAD_T ) ); + } + +} + +/*********************************************************************//** + * @brief + * The execAirPumpTest function executes the state machine for the air pump + * self-test. + * @details Inputs: none + * @details Outputs: none + * @return the current state of the air pump self-test. + *************************************************************************/ +SELF_TEST_STATUS_T execAirPumpTest( void ) +{ + SELF_TEST_STATUS_T status = SELF_TEST_STATUS_PASSED; + + // TODO - Implement POST + + return status; +} + + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetAirPumpDataPublishIntervalOverride function overrides the + * air pump data publish interval. + * @details Inputs: none + * @details Outputs: airTrapDataPublishInterval + * @param value override air trap data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetAirPumpDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + airPumpDataPublishInterval.ovData = intvl; + airPumpDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetAirPumpDataPublishIntervalOverride function resets the override + * of the air pump data publish interval. + * @details Inputs: none + * @details Outputs: airPumpDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetAirPumpDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + airPumpDataPublishInterval.override = OVERRIDE_RESET; + airPumpDataPublishInterval.ovData = airPumpDataPublishInterval.ovInitData; + } + + return result; +} + + +BOOL testSetAirPump( U32 state ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + setAirPumpState( (AIR_PUMP_STATE_T) state ); + result = TRUE; + } + + return result; +} + +/**@}*/ + Index: firmware/App/Controllers/AirPump.h =================================================================== diff -u --- firmware/App/Controllers/AirPump.h (revision 0) +++ firmware/App/Controllers/AirPump.h (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -0,0 +1,57 @@ +/************************************************************************** +* +* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* +* THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN +* WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +* +* @file AirPump.h +* +* @author (last) Michael Garthwaite +* @date (last) 21-Nov-2022 +* +* @author (original) Michael Garthwaite +* @date (original) 21-Nov-2022 +* +***************************************************************************/ + +#ifndef __AIRPUMP_H__ +#define __AIRPUMP_H__ +// ********** public definitions ********** + + +#include "HDCommon.h" + +/// Payload record structure for air pump data broadcast message +typedef struct +{ + U32 airPumpStateStatus; + U32 airPumpMotorStatus; +} AIR_PUMP_PAYLOAD_T; + +typedef enum AirPumpControllerStates +{ + AIR_PUMP_STATE_START = 0, + AIR_PUMP_STATE_OFF, ///< Air Pump Off + AIR_PUMP_STATE_ON, ///< Air Pump On + NUM_OF_AIR_PUMP_STATES, + +} AIR_PUMP_STATE_T; + +// ********** public function prototypes ********** +void initAirPump(void); + +void execAirPumpMonitor(void); +void execAirPumpController(void); +void setAirPumpState( AIR_PUMP_STATE_T state ); +AIR_PUMP_STATE_T getAirPumpState( void ); + +BOOL testSetAirPumpDataPublishIntervalOverride( U32 value ); +BOOL testResetAirPumpDataPublishIntervalOverride( void ); +BOOL testSetAirPump( U32 state ); + + + + + +#endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r044d8892373acc5545020aab894cd1943c4d7449 -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 044d8892373acc5545020aab894cd1943c4d7449) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -1376,7 +1376,7 @@ handleHDBloodPumpRotorCountOverrideRequest( message ); break; - case MSG_ID_DIALYSATE_INLET_PUMP_ROTOR_COUNT_OVERRIDE: + case MSG_ID_HD_DIALYSATE_INLET_PUMP_ROTOR_COUNT_OVERRIDE: handleHDDialInPumpRotorCountOverrideRequest( message ); break; @@ -1688,6 +1688,14 @@ handleTestDialOutSetPWM( message ); break; + case MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE: + handleAirPumpIntervalOverrideRequest( message ); + break; + + case MSG_ID_HD_AIR_PUMP_SET_STATE: + handleAirPumpSetState( message ); + break; + // The default cannot be reached in VectorCAST since the cases are run in a for loop default: // Unrecognized message ID received - ignore Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r044d8892373acc5545020aab894cd1943c4d7449 -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 044d8892373acc5545020aab894cd1943c4d7449) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -7615,4 +7615,46 @@ sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); } +void handleAirPumpIntervalOverrideRequest( MESSAGE_T *message ) +{ + TEST_OVERRIDE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify payload length + if ( sizeof( TEST_OVERRIDE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( &payload, message->payload, sizeof( TEST_OVERRIDE_PAYLOAD_T ) ); + if ( FALSE == payload.reset ) + { + result = testSetAirPumpDataPublishIntervalOverride( (U32)( payload.state.u32 ) ); + } + else + { + result = testResetAirPumpDataPublishIntervalOverride(); + } + } + + // Respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + +void handleAirPumpSetState( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // verify payload length + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + U32 payLoad; + + memcpy( &payLoad, message->payload, sizeof( U32 ) ); + + result = testSetAirPump( payLoad ); + } + + // respond to request + sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, result ); +} + + /**@}*/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r044d8892373acc5545020aab894cd1943c4d7449 -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 044d8892373acc5545020aab894cd1943c4d7449) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -17,7 +17,8 @@ #ifndef __SYSTEM_COMM_MESSAGES_H__ #define __SYSTEM_COMM_MESSAGES_H__ - + +#include "AirPump.h" #include "AirTrap.h" #include "BloodFlow.h" #include "BloodLeak.h" @@ -845,6 +846,12 @@ // MSG_ID_HD_DIAL_OUT_SET_PWM void handleTestDialOutSetPWM( MESSAGE_T* message ); +// MSG_ID_HD_AIR_PUMP_PUBLISH_INTERVAL_OVERRIDE +void handleAirPumpIntervalOverrideRequest( MESSAGE_T* message ); + +// MSG_ID_HD_AIR_PUMP_SET_STATE +void handleAirPumpSetState( MESSAGE_T * message ); + /**@}*/ #endif Index: firmware/HD.dil =================================================================== diff -u -r8466e63f95f65a3ffb18c3af85ac99328e41167b -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/HD.dil (.../HD.dil) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) +++ firmware/HD.dil (.../HD.dil) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -1,4 +1,4 @@ -# RM46L852PGE 07/27/21 12:57:43 +# RM46L852PGE 11/21/22 13:24:17 # ARCH=RM46L852PGE # @@ -7736,7 +7736,7 @@ DRIVER.PINMUX.VAR.DMA_INTFTCEN_9.VALUE=1 DRIVER.PINMUX.VAR.DMA_INTMP_2_VALUE.VALUE=0x0001 DRIVER.PINMUX.VAR.DMA_INTEN_16.VALUE=1 -DRIVER.PINMUX.VAR.MUX20_OPTION0.VALUE=0 +DRIVER.PINMUX.VAR.MUX20_OPTION0.VALUE=1 DRIVER.PINMUX.VAR.MUX12_OPTION0.VALUE=0 DRIVER.PINMUX.VAR.MUX20_OPTION1.VALUE=0 DRIVER.PINMUX.VAR.MUX12_OPTION1.VALUE=0 Index: firmware/source/sys_link.cmd =================================================================== diff -u -rc666fa7998974faf90e80c36fccd366cfbcc0a76 -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/source/sys_link.cmd (.../sys_link.cmd) (revision c666fa7998974faf90e80c36fccd366cfbcc0a76) +++ firmware/source/sys_link.cmd (.../sys_link.cmd) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -58,8 +58,8 @@ { VECTORS (X) : origin=0x00000000 length=0x00000020 FLASH0 (RX) : origin=0x00000020 length=0x0013FFE0 - STACKS (RW) : origin=0x08000000 length=0x00004c00 - RAM (RW) : origin=0x08004c00 length=0x0002b400 + STACKS (RW) : origin=0x08000000 length=0x00005800 + RAM (RW) : origin=0x08005800 length=0x0002a800 /* USER CODE BEGIN (2) */ #endif @@ -88,15 +88,15 @@ SECTIONS { .intvecs : {} > VECTORS - .text : {} > FLASH0 - .const : {} > FLASH0 - .cinit : {} > FLASH0 - .pinit : {} > FLASH0 + .text : {} > FLASH0 + .const : {} > FLASH0 + .cinit : {} > FLASH0 + .pinit : {} > FLASH0 .bss : {} > RAM .data : {} > RAM .sysmem : {} > RAM + - /* USER CODE BEGIN (4) */ #endif /* Override Sections with CRCs here */ Index: firmware/source/sys_selftest.c =================================================================== diff -u -rf9757546acead1664344df6dd6d21ab86ecb590b -r8791132fbfcb8fa25fb11a9ab15d695686aaef75 --- firmware/source/sys_selftest.c (.../sys_selftest.c) (revision f9757546acead1664344df6dd6d21ab86ecb590b) +++ firmware/source/sys_selftest.c (.../sys_selftest.c) (revision 8791132fbfcb8fa25fb11a9ab15d695686aaef75) @@ -51,6 +51,7 @@ #define STACK_MARKER 0xCAFECAFE ///< Location in the stack to determine the offset in word from the Link Register #define LR_OFFSET_ADJUSTMENT 4 ///< Adjust the content of the LR so that the Memory Access Violation does not get call continously /* USER CODE END */ + #include "sys_selftest.h" #include "sys_core.h" #include "sys_pmu.h"