14#include "keyple/core/service/ObservableReaderStateServiceAdapter.hpp"
18#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterAsynchronousSpi.hpp"
19#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterBlockingSpi.hpp"
20#include "keyple/core/plugin/spi/reader/observable/state/insertion/CardInsertionWaiterNonBlockingSpi.hpp"
21#include "keyple/core/plugin/spi/reader/observable/state/insertion/WaitForCardInsertionBlockingSpi.hpp"
22#include "keyple/core/plugin/spi/reader/observable/state/insertion/WaitForCardInsertionNonBlockingSpi.hpp"
23#include "keyple/core/plugin/spi/reader/observable/state/processing/CardPresenceMonitorBlockingSpi.hpp"
24#include "keyple/core/plugin/spi/reader/observable/state/processing/WaitForCardRemovalDuringProcessingBlockingSpi.hpp"
25#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterBlockingSpi.hpp"
26#include "keyple/core/plugin/spi/reader/observable/state/removal/CardRemovalWaiterNonBlockingSpi.hpp"
27#include "keyple/core/plugin/spi/reader/observable/state/removal/WaitForCardRemovalNonBlockingSpi.hpp"
28#include "keyple/core/service/CardInsertionActiveMonitoringJobAdapter.hpp"
29#include "keyple/core/service/CardInsertionPassiveMonitoringJobAdapter.hpp"
30#include "keyple/core/service/CardRemovalActiveMonitoringJobAdapter.hpp"
31#include "keyple/core/service/CardRemovalPassiveMonitoringJobAdapter.hpp"
32#include "keyple/core/service/WaitForCardInsertionStateAdapter.hpp"
33#include "keyple/core/service/WaitForCardProcessingStateAdapter.hpp"
34#include "keyple/core/service/WaitForCardRemovalStateAdapter.hpp"
35#include "keyple/core/service/WaitForStartDetectStateAdapter.hpp"
41using keyple::core::plugin::spi::reader::observable::state::insertion::
42 CardInsertionWaiterAsynchronousSpi;
43using keyple::core::plugin::spi::reader::observable::state::insertion::
44 CardInsertionWaiterBlockingSpi;
45using keyple::core::plugin::spi::reader::observable::state::insertion::
46 CardInsertionWaiterNonBlockingSpi;
47using keyple::core::plugin::spi::reader::observable::state::insertion::
48 WaitForCardInsertionBlockingSpi;
49using keyple::core::plugin::spi::reader::observable::state::insertion::
50 WaitForCardInsertionNonBlockingSpi;
51using keyple::core::plugin::spi::reader::observable::state::processing::
52 CardPresenceMonitorBlockingSpi;
53using keyple::core::plugin::spi::reader::observable::state::processing::
54 WaitForCardRemovalDuringProcessingBlockingSpi;
55using keyple::core::plugin::spi::reader::observable::state::removal::
56 CardRemovalWaiterBlockingSpi;
57using keyple::core::plugin::spi::reader::observable::state::removal::
58 CardRemovalWaiterNonBlockingSpi;
59using keyple::core::plugin::spi::reader::observable::state::removal::
60 WaitForCardRemovalNonBlockingSpi;
62ObservableReaderStateServiceAdapter::ObservableReaderStateServiceAdapter(
63 ObservableLocalReaderAdapter* reader)
65, mReaderSpi(reader->getObservableReaderSpi())
66, mExecutorService(std::make_shared<ExecutorService>())
70 {MonitoringState::WAIT_FOR_START_DETECTION,
71 std::make_shared<WaitForStartDetectStateAdapter>(mReader)});
74 if (std::dynamic_pointer_cast<CardInsertionWaiterAsynchronousSpi>(
76 || std::dynamic_pointer_cast<WaitForCardInsertionAutonomousSpi>(
79 {MonitoringState::WAIT_FOR_CARD_INSERTION,
80 std::make_shared<WaitForCardInsertionStateAdapter>(mReader)});
83 std::dynamic_pointer_cast<CardInsertionWaiterNonBlockingSpi>(mReaderSpi)
84 || std::dynamic_pointer_cast<WaitForCardInsertionNonBlockingSpi>(
87 = std::dynamic_pointer_cast<CardInsertionWaiterNonBlockingSpi>(
89 int sleepDurationMillis
90 = readerSpi ? readerSpi->getCardInsertionMonitoringSleepDuration()
93 auto cardInsertionActiveMonitoringJobAdapter
94 = std::make_shared<CardInsertionActiveMonitoringJobAdapter>(
95 mReader, sleepDurationMillis,
true);
98 {MonitoringState::WAIT_FOR_CARD_INSERTION,
99 std::make_shared<WaitForCardInsertionStateAdapter>(
101 cardInsertionActiveMonitoringJobAdapter,
105 std::dynamic_pointer_cast<CardInsertionWaiterBlockingSpi>(mReaderSpi)
106 || std::dynamic_pointer_cast<WaitForCardInsertionBlockingSpi>(
108 auto cardInsertionPassiveMonitoringJobAdapter
109 = std::make_shared<CardInsertionPassiveMonitoringJobAdapter>(
112 {MonitoringState::WAIT_FOR_CARD_INSERTION,
113 std::make_shared<WaitForCardInsertionStateAdapter>(
115 cardInsertionPassiveMonitoringJobAdapter,
119 throw IllegalStateException(
120 "Reader should implement implement a WaitForCardInsertion "
125 if (std::dynamic_pointer_cast<CardPresenceMonitorBlockingSpi>(mReaderSpi)
126 || std::dynamic_pointer_cast<
127 WaitForCardRemovalDuringProcessingBlockingSpi>(mReaderSpi)) {
128 auto cardRemovalPassiveMonitoringJobAdapter
129 = std::make_shared<CardRemovalPassiveMonitoringJobAdapter>(mReader);
131 {MonitoringState::WAIT_FOR_CARD_PROCESSING,
132 std::make_shared<WaitForCardProcessingStateAdapter>(
134 cardRemovalPassiveMonitoringJobAdapter,
139 {MonitoringState::WAIT_FOR_CARD_PROCESSING,
140 std::make_shared<WaitForCardProcessingStateAdapter>(mReader)});
144 if (std::dynamic_pointer_cast<CardRemovalWaiterAsynchronousSpi>(mReaderSpi)
145 || std::dynamic_pointer_cast<WaitForCardRemovalAutonomousSpi>(
148 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
149 std::make_shared<WaitForCardRemovalStateAdapter>(mReader)});
152 std::dynamic_pointer_cast<CardRemovalWaiterNonBlockingSpi>(mReaderSpi)
153 || std::dynamic_pointer_cast<WaitForCardRemovalNonBlockingSpi>(
156 = std::dynamic_pointer_cast<CardRemovalWaiterNonBlockingSpi>(
158 int sleepDurationMillis
159 = readerSpi ? readerSpi->getCardRemovalMonitoringSleepDuration()
162 auto cardRemovalActiveMonitoringJobAdapter
163 = std::make_shared<CardRemovalActiveMonitoringJobAdapter>(
164 mReader, sleepDurationMillis);
167 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
168 std::make_shared<WaitForCardRemovalStateAdapter>(
170 cardRemovalActiveMonitoringJobAdapter,
174 std::dynamic_pointer_cast<CardRemovalWaiterBlockingSpi>(mReaderSpi)
175 || std::dynamic_pointer_cast<WaitForCardRemovalBlockingSpi>(
177 auto cardRemovalPassiveMonitoringJobAdapter
178 = std::make_shared<CardRemovalPassiveMonitoringJobAdapter>(mReader);
180 {MonitoringState::WAIT_FOR_CARD_REMOVAL,
181 std::make_shared<WaitForCardRemovalStateAdapter>(
183 cardRemovalPassiveMonitoringJobAdapter,
187 throw IllegalStateException(
188 "Reader should implement implement a WaitForCardRemoval "
192 switchState(MonitoringState::WAIT_FOR_START_DETECTION);
196ObservableReaderStateServiceAdapter::onEvent(
const InternalEvent event)
205 case InternalEvent::CARD_INSERTED:
206 case InternalEvent::CARD_REMOVED:
207 case InternalEvent::CARD_PROCESSED:
208 case InternalEvent::STOP_DETECT:
209 case InternalEvent::TIME_OUT:
211 case InternalEvent::START_DETECT:
212 mReaderSpi->onStartDetection();
217 mCurrentState->onEvent(event);
221ObservableReaderStateServiceAdapter::switchState(
const MonitoringState stateId)
223 std::lock_guard<std::mutex> lock(mMutex);
225 if (mCurrentState !=
nullptr) {
227 "Switch state of reader [%] from % to %\n",
229 mCurrentState->getMonitoringState(),
231 mCurrentState->onDeactivate();
234 "Switch state of reader [%] to %\n", mReader->getName(), stateId);
238 mCurrentState = mStates.at(stateId);
244 if (stateId == MonitoringState::WAIT_FOR_START_DETECTION) {
245 mReaderSpi->onStopDetection();
249 mCurrentState->onActivate();
252std::shared_ptr<AbstractObservableStateAdapter>
253ObservableReaderStateServiceAdapter::getCurrentState()
255 std::lock_guard<std::mutex> lock(mMutex);
257 return mCurrentState;
261ObservableReaderStateServiceAdapter::getCurrentMonitoringState()
263 std::lock_guard<std::mutex> lock(mMutex);
265 return mCurrentState->getMonitoringState();
269ObservableReaderStateServiceAdapter::shutdown()
271 mExecutorService->shutdown();
ObservableLocalReaderAdapter::InternalEvent InternalEvent