1*61c4878aSAndroid Build Coastguard Worker // Copyright 2023 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker // 3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker // the License at 6*61c4878aSAndroid Build Coastguard Worker // 7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker // 9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker // the License. 14*61c4878aSAndroid Build Coastguard Worker #include "chre/platform/system_timer.h" 15*61c4878aSAndroid Build Coastguard Worker 16*61c4878aSAndroid Build Coastguard Worker #include "chre/platform/log.h" 17*61c4878aSAndroid Build Coastguard Worker #include "chre/util/time.h" 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Worker namespace chre { 20*61c4878aSAndroid Build Coastguard Worker OnExpired()21*61c4878aSAndroid Build Coastguard Workervoid SystemTimerBase::OnExpired() { 22*61c4878aSAndroid Build Coastguard Worker SystemTimer* timer = static_cast<SystemTimer*>(this); 23*61c4878aSAndroid Build Coastguard Worker timer->mCallback(timer->mData); 24*61c4878aSAndroid Build Coastguard Worker } 25*61c4878aSAndroid Build Coastguard Worker SystemTimer()26*61c4878aSAndroid Build Coastguard WorkerSystemTimer::SystemTimer() {} 27*61c4878aSAndroid Build Coastguard Worker ~SystemTimer()28*61c4878aSAndroid Build Coastguard WorkerSystemTimer::~SystemTimer() { 29*61c4878aSAndroid Build Coastguard Worker if (!initialized_) { 30*61c4878aSAndroid Build Coastguard Worker return; 31*61c4878aSAndroid Build Coastguard Worker } 32*61c4878aSAndroid Build Coastguard Worker cancel(); 33*61c4878aSAndroid Build Coastguard Worker initialized_ = false; 34*61c4878aSAndroid Build Coastguard Worker } 35*61c4878aSAndroid Build Coastguard Worker init()36*61c4878aSAndroid Build Coastguard Workerbool SystemTimer::init() { 37*61c4878aSAndroid Build Coastguard Worker initialized_ = true; 38*61c4878aSAndroid Build Coastguard Worker return initialized_; 39*61c4878aSAndroid Build Coastguard Worker } 40*61c4878aSAndroid Build Coastguard Worker set(SystemTimerCallback * callback,void * data,Nanoseconds delay)41*61c4878aSAndroid Build Coastguard Workerbool SystemTimer::set(SystemTimerCallback* callback, 42*61c4878aSAndroid Build Coastguard Worker void* data, 43*61c4878aSAndroid Build Coastguard Worker Nanoseconds delay) { 44*61c4878aSAndroid Build Coastguard Worker if (!initialized_) { 45*61c4878aSAndroid Build Coastguard Worker return false; 46*61c4878aSAndroid Build Coastguard Worker } 47*61c4878aSAndroid Build Coastguard Worker mCallback = callback; 48*61c4878aSAndroid Build Coastguard Worker mData = data; 49*61c4878aSAndroid Build Coastguard Worker pw::chrono::SystemClock::duration interval = 50*61c4878aSAndroid Build Coastguard Worker std::chrono::nanoseconds(delay.toRawNanoseconds()); 51*61c4878aSAndroid Build Coastguard Worker const pw::chrono::SystemClock::time_point now = 52*61c4878aSAndroid Build Coastguard Worker pw::chrono::SystemClock::now(); 53*61c4878aSAndroid Build Coastguard Worker timer_.InvokeAt(now + interval); 54*61c4878aSAndroid Build Coastguard Worker return true; 55*61c4878aSAndroid Build Coastguard Worker } 56*61c4878aSAndroid Build Coastguard Worker cancel()57*61c4878aSAndroid Build Coastguard Workerbool SystemTimer::cancel() { 58*61c4878aSAndroid Build Coastguard Worker if (!initialized_) { 59*61c4878aSAndroid Build Coastguard Worker return false; 60*61c4878aSAndroid Build Coastguard Worker } 61*61c4878aSAndroid Build Coastguard Worker timer_.Cancel(); 62*61c4878aSAndroid Build Coastguard Worker return true; 63*61c4878aSAndroid Build Coastguard Worker } 64*61c4878aSAndroid Build Coastguard Worker isActive()65*61c4878aSAndroid Build Coastguard Workerbool SystemTimer::isActive() { return is_active_; } 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker } // namespace chre 68