14#include "keyple/core/service/ObservableReaderStateServiceAdapter.hpp"
19#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterAsynchronousSpi.hpp"
20#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterBlockingSpi.hpp"
21#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterNonBlockingSpi.hpp"
22#include "keyple/core/plugin/spi/reader/observable/state/insertion/WaitForCardInsertionBlockingSpi.hpp"
23#include "keyple/core/plugin/spi/reader/observable/state/insertion/WaitForCardInsertionNonBlockingSpi.hpp"
24#include "keyple/core/plugin/spi/reader/observable/state/processing/CardPresenceMonitorBlockingSpi.hpp"
25#include "keyple/core/plugin/spi/reader/observable/state/processing/WaitForCardRemovalDuringProcessingBlockingSpi.hpp"
26#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterBlockingSpi.hpp"
27#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterNonBlockingSpi.hpp"
28#include "keyple/core/plugin/spi/reader/observable/state/removal/WaitForCardRemovalNonBlockingSpi.hpp"
29#include "keyple/core/service/CardInsertionActiveMonitoringJobAdapter.hpp"
30#include "keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.hpp"
31#include "keyple/core/service/CardRemovalActiveMonitoringJobAdapter.hpp"
32#include "keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.hpp"
33#include "keyple/core/service/WaitForCardInsertionStateAdapter.hpp"
34#include "keyple/core/service/WaitForCardProcessingStateAdapter.hpp"
35#include "keyple/core/service/WaitForCardRemovalStateAdapter.hpp"
36#include "keyple/core/service/WaitForStartDetectStateAdapter.hpp"
42using keyple::core::plugin::spi::reader::observable::state::insertion::
43 CardInsertionWaiterAsynchronousSpi;
44using keyple::core::plugin::spi::reader::observable::state::insertion::
45 CardInsertionWaiterBlockingSpi;
46using keyple::core::plugin::spi::reader::observable::state::insertion::
47 CardInsertionWaiterNonBlockingSpi;
48using keyple::core::plugin::spi::reader::observable::state::insertion::
49 WaitForCardInsertionBlockingSpi;
50using keyple::core::plugin::spi::reader::observable::state::insertion::
51 WaitForCardInsertionNonBlockingSpi;
52using keyple::core::plugin::spi::reader::observable::state::processing::
53 CardPresenceMonitorBlockingSpi;
54using keyple::core::plugin::spi::reader::observable::state::processing::
55 WaitForCardRemovalDuringProcessingBlockingSpi;
56using keyple::core::plugin::spi::reader::observable::state::removal::
57 CardRemovalWaiterBlockingSpi;
58using keyple::core::plugin::spi::reader::observable::state::removal::
59 CardRemovalWaiterNonBlockingSpi;
60using keyple::core::plugin::spi::reader::observable::state::removal::
61 WaitForCardRemovalNonBlockingSpi;
63ObservableReaderStateServiceAdapter::ObservableReaderStateServiceAdapter(
64 ObservableLocalReaderAdapter* reader)
66, mReaderSpi(reader->getObservableReaderSpi())
67, mExecutorService(std::make_shared<ExecutorService>())
71 {MonitoringState::WAIT_FOR_START_DETECTION,
72 std::make_shared<WaitForStartDetectStateAdapter>(mReader)});
75 if (std::dynamic_pointer_cast<CardInsertionWaiterAsynchronousSpi>(
77 || std::dynamic_pointer_cast<WaitForCardInsertionAutonomousSpi>(
80 {MonitoringState::WAIT_FOR_CARD_INSERTION,
81 std::make_shared<WaitForCardInsertionStateAdapter>(mReader)});
84 std::dynamic_pointer_cast<CardInsertionWaiterNonBlockingSpi>(mReaderSpi)
85 || std::dynamic_pointer_cast<WaitForCardInsertionNonBlockingSpi>(
88 = std::dynamic_pointer_cast<CardInsertionWaiterNonBlockingSpi>(
90 int sleepDurationMillis
91 = readerSpi ? readerSpi->getCardInsertionMonitoringSleepDuration()
94 auto cardInsertionActiveMonitoringJobAdapter
95 = std::make_shared<CardInsertionActiveMonitoringJobAdapter>(
96 mReader, sleepDurationMillis,
true);
99 {MonitoringState::WAIT_FOR_CARD_INSERTION,
100 std::make_shared<WaitForCardInsertionStateAdapter>(
102 cardInsertionActiveMonitoringJobAdapter,
106 std::dynamic_pointer_cast<CardInsertionWaiterBlockingSpi>(mReaderSpi)
107 || std::dynamic_pointer_cast<WaitForCardInsertionBlockingSpi>(
109 auto cardInsertionPassiveMonitoringJobAdapter
110 = std::make_shared<CardInsertionPassiveMonitoringJobAdapter>(
113 {MonitoringState::WAIT_FOR_CARD_INSERTION,
114 std::make_shared<WaitForCardInsertionStateAdapter>(
116 cardInsertionPassiveMonitoringJobAdapter,
120 throw IllegalStateException(
122 "Cannot cast the provided reader extension to a valid "
123 "WaitForCardInsertion interface. Actual type: ")
124 +
typeid(mReaderSpi).name());
128 if (std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(mReaderSpi)
129 || std::dynamic_pointer_cast<
130 WaitForCardRemovalDuringProcessingBlockingSpi>(mReaderSpi)) {
131 auto cardRemovalPassiveMonitoringJobAdapter
132 = std::make_shared<CardRemovalPassiveMonitoringJobAdapter>(mReader);
134 {MonitoringState::WAIT_FOR_CARD_PROCESSING,
135 std::make_shared<WaitForCardProcessingStateAdapter>(
137 cardRemovalPassiveMonitoringJobAdapter,
142 {MonitoringState::WAIT_FOR_CARD_PROCESSING,
143 std::make_shared<WaitForCardProcessingStateAdapter>(mReader)});
147 if (std::dynamic_pointer_cast<CardRemovalWaiterAsynchronousSpi>(mReaderSpi)
148 || std::dynamic_pointer_cast<WaitForCardRemovalAutonomousSpi>(
151 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
152 std::make_shared<WaitForCardRemovalStateAdapter>(mReader)});
155 std::dynamic_pointer_cast<CardRemovalWaiterNonBlockingSpi>(mReaderSpi)
156 || std::dynamic_pointer_cast<WaitForCardRemovalNonBlockingSpi>(
159 = std::dynamic_pointer_cast<CardRemovalWaiterNonBlockingSpi>(
161 int sleepDurationMillis
162 = readerSpi ? readerSpi->getCardRemovalMonitoringSleepDuration()
165 auto cardRemovalActiveMonitoringJobAdapter
166 = std::make_shared<CardRemovalActiveMonitoringJobAdapter>(
167 mReader, sleepDurationMillis);
170 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
171 std::make_shared<WaitForCardRemovalStateAdapter>(
173 cardRemovalActiveMonitoringJobAdapter,
177 std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(mReaderSpi)
178 || std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(
180 auto cardRemovalPassiveMonitoringJobAdapter
181 = std::make_shared<CardRemovalPassiveMonitoringJobAdapter>(mReader);
183 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
184 std::make_shared<WaitForCardRemovalStateAdapter>(
186 cardRemovalPassiveMonitoringJobAdapter,
190 throw IllegalStateException(
192 "Cannot cast the provided reader extension to a valid "
193 "WaitForCardRemoval interface. Actual type: ")
194 +
typeid(mReaderSpi).name());
197 switchState(MonitoringState::WAIT_FOR_START_DETECTION);
201ObservableReaderStateServiceAdapter::onEvent(
const InternalEvent event)
210 case InternalEvent::CARD_INSERTED:
211 case InternalEvent::CARD_REMOVED:
212 case InternalEvent::CARD_PROCESSED:
213 case InternalEvent::STOP_DETECT:
214 case InternalEvent::TIME_OUT:
216 case InternalEvent::START_DETECT:
217 mReaderSpi->onStartDetection();
222 mCurrentState->onEvent(event);
226ObservableReaderStateServiceAdapter::switchState(
const MonitoringState stateId)
228 std::lock_guard<std::mutex> lock(mMutex);
230 if (mCurrentState !=
nullptr) {
232 "[fsmService=%] Switching state [from=%, to=%]\n",
234 mCurrentState->getMonitoringState(),
236 mCurrentState->onDeactivate();
239 "[fsmService=%] Switching state [from=null, to=%]\n",
245 mCurrentState = mStates.at(stateId);
251 if (stateId == MonitoringState::WAIT_FOR_START_DETECTION) {
252 mReaderSpi->onStopDetection();
256 mCurrentState->onActivate();
259 "[fsmService=%] State switched [current=%, expected=%]",
261 mCurrentState->getMonitoringState(),
265std::shared_ptr<AbstractObservableStateAdapter>
266ObservableReaderStateServiceAdapter::getCurrentState()
268 std::lock_guard<std::mutex> lock(mMutex);
270 return mCurrentState;
274ObservableReaderStateServiceAdapter::getCurrentMonitoringState()
276 std::lock_guard<std::mutex> lock(mMutex);
278 return mCurrentState->getMonitoringState();
282ObservableReaderStateServiceAdapter::shutdown()
284 mExecutorService->shutdown();
ObservableLocalReaderAdapter::InternalEvent InternalEvent