/* * * Copyright (c) 2023 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "PumpManager.h" #include "AppConfig.h" #include "AppTask.h" #include #include LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL); static k_timer sStartTimer; PumpManager PumpManager::sPump; void PumpManager::Init() { k_timer_init(&sStartTimer, &PumpManager::TimerEventHandler, nullptr); k_timer_user_data_set(&sStartTimer, this); mState = kState_StartCompleted; mAutoStartTimerArmed = false; mAutoRestart = false; mAutoStartDuration = 0; } void PumpManager::SetCallbacks(Callback_fn_initiated aActionInitiated_CB, Callback_fn_completed aActionCompleted_CB) { mActionInitiated_CB = aActionInitiated_CB; mActionCompleted_CB = aActionCompleted_CB; } bool PumpManager::IsActionInProgress() { return (mState == kState_StartInitiated || mState == kState_StartInitiated) ? true : false; } bool PumpManager::IsStopped() { return (mState == kState_StopCompleted) ? true : false; } void PumpManager::EnableAutoRestart(bool aOn) { mAutoRestart = aOn; } void PumpManager::SetAutoStartDuration(uint32_t aDurationInSecs) { mAutoStartDuration = aDurationInSecs; } bool PumpManager::InitiateAction(int32_t aActor, Action_t aAction) { bool action_initiated = false; State_t new_state; // Initiate Start/Stop Action only when the previous one is complete. if (mState == kState_StartCompleted && aAction == STOP_ACTION) { action_initiated = true; mCurrentActor = aActor; new_state = kState_StopInitiated; } else if (mState == kState_StopCompleted && aAction == START_ACTION) { action_initiated = true; mCurrentActor = aActor; new_state = kState_StartInitiated; } if (action_initiated) { if (mAutoStartTimerArmed && new_state == kState_StartInitiated) { // If auto start timer has been armed and someone initiates stop, // cancel the timer and continue as normal. mAutoStartTimerArmed = false; CancelTimer(); } StartTimer(PUMP_START_PERIOS_MS); // Since the timer started successfully, update the state and trigger callback mState = new_state; if (mActionInitiated_CB) { mActionInitiated_CB(aAction, aActor); } } return action_initiated; } void PumpManager::StartTimer(uint32_t aTimeoutMs) { k_timer_start(&sStartTimer, K_MSEC(aTimeoutMs), K_NO_WAIT); } void PumpManager::CancelTimer(void) { k_timer_stop(&sStartTimer); } void PumpManager::TimerEventHandler(k_timer * timer) { PumpManager * pump = static_cast(k_timer_user_data_get(timer)); // The timer event handler will be called in the context of the timer task // once sStartTimer expires. Post an event to apptask queue with the actual handler // so that the event can be handled in the context of the apptask. AppEvent event; event.Type = AppEvent::kEventType_Timer; event.TimerEvent.Context = pump; event.Handler = pump->mAutoStartTimerArmed ? AutoRestartTimerEventHandler : PumpStartTimerEventHandler; GetAppTask().PostEvent(&event); } void PumpManager::AutoRestartTimerEventHandler(AppEvent * aEvent) { PumpManager * pump = static_cast(aEvent->TimerEvent.Context); int32_t actor = 0; // Make sure auto start timer is still armed. if (!pump->mAutoStartTimerArmed) return; pump->mAutoStartTimerArmed = false; LOG_INF("Auto Re-Start has been triggered!"); pump->InitiateAction(actor, START_ACTION); } void PumpManager::PumpStartTimerEventHandler(AppEvent * aEvent) { Action_t actionCompleted = INVALID_ACTION; PumpManager * pump = static_cast(aEvent->TimerEvent.Context); if (pump->mState == kState_StartInitiated) { pump->mState = kState_StartCompleted; actionCompleted = START_ACTION; } else if (pump->mState == kState_StopInitiated) { pump->mState = kState_StopCompleted; actionCompleted = STOP_ACTION; } if (actionCompleted != INVALID_ACTION) { if (pump->mActionCompleted_CB) { pump->mActionCompleted_CB(actionCompleted, pump->mCurrentActor); } if (pump->mAutoRestart && actionCompleted == START_ACTION) { // Start the timer for auto restart pump->StartTimer(pump->mAutoStartDuration * 1000); pump->mAutoStartTimerArmed = true; LOG_INF("Auto Re-start enabled. Will be triggered in %u seconds", pump->mAutoStartDuration); } } } int16_t PumpManager::GetMaxPressure() { // 1.6.1. MaxPressure Attribute // Range -3276.7 kPa to 3276.7 kPa (steps of 0.1 kPa) // -3276.8 is invalid value - perhaps 'null' // Return 2000.0 kPa as Max Pressure return 20000; } uint16_t PumpManager::GetMaxSpeed() { // 1.6.2. MaxSpeed Attribute // Range 0 RPM to 65534 RPM (steps of 1 RPM) // 65535 is invalid value - perhaps 'null' // Return 1000 RPM as MaxSpeed return 1000; } uint16_t PumpManager::GetMaxFlow() { // 1.6.3. MaxFlow Attribute // Range 0 m3/h to 6553.4 m3/h (steps of 0.1 m3/h) // 6553.5 m3/h is invalid value - perhaps 'null' // Return 200.0 m3/h as MaxFlow return 2000; } int16_t PumpManager::GetMinConstPressure() { // 1.6.4. MinConstPressure Attribute // Range -3276.7 kPa to 3276.7 kPa (steps of 0.1 kPa) // -3276.8 is invalid value - perhaps 'null' // Return -100.0 kPa as MinConstPressure return -1000; } int16_t PumpManager::GetMaxConstPressure() { // 1.6.5. MaxConstPressure Attribute // Range -3276.7 kPa to 3276.7 kPa (steps of 0.1 kPa) // -3276.8 is invalid value - perhaps 'null' // Return 100.0 kPa as MaxConstPressure return 1000; } int16_t PumpManager::GetMinCompPressure() { // 1.6.6. MinCompPressure Attribute // Range -3276.7 kPa to 3276.7 kPa (steps of 0.1 kPa) // -3276.8 is invalid value - perhaps 'null' // Return -20.0 kPa as MinCompPressure return -200; } int16_t PumpManager::GetMaxCompPressure() { // 1.6.7. MaxCompPressure Attribute // Range -3276.7 kPa to 3276.7 kPa (steps of 0.1 kPa) // -3276.8 is invalid value - perhaps 'null' // Return 20.0 kPa as MaxCompPressure return 200; } uint16_t PumpManager::GetMinConstSpeed() { // 1.6.8. MinConstSpeed Attribute // Range 0 to 65534 RPM (steps of 1 RPM) // 65535 RPM is invalid valud - perhaps 'null' // Return 200 RPM as MinConstSpeed return 200; } uint16_t PumpManager::GetMaxConstSpeed() { // 1.6.9. MaxConstSpeed Attribute // Range 0 to 65534 RPM (steps of 1 RPM) // 65535 RPM is invalid valud - perhaps 'null' // Return 2000 RPM as MaxConstSpeed return 2000; } uint16_t PumpManager::GetMinConstFlow() { // 1.6.10. MinConstFlow Attribute // Range 0 m3/h to 6553.4 m3/h (steps of 0.1 m3/h) // 6553.5 m3/h is invalid value - perhaps 'null' // Return 12.5 m3/h as MinConstFlow return 125; } uint16_t PumpManager::GetMaxConstFlow() { // 1.6.11. MaxConstFlow Attribute // Range 0 m3/h to 6553.4 m3/h (steps of 0.1 m3/h) // 6553.5 m3/h is invalid value - perhaps 'null' // Return 655.7 m3/h as MaxConstFlow return 6557; } int16_t PumpManager::GetMinConstTemp() { // 1.6.12. MinConstTemp Attribute // Range -273.15 C to 327.67 C (steps of 0.01 C) // All other values are invalid values - perhaps 'null' // Return 30.00 C as MinConstTemp return 3000; } int16_t PumpManager::GetMaxConstTemp() { // 1.6.13. MaxConstTemp Attribute // Range -273.15 C to 327.67 C (steps of 0.01 C) // All other values are invalid values - perhaps 'null' // Return 56.00 C as MaxConstTemp return 5600; }