|
@ -7,6 +7,7 @@ void DisinfectionStateMachine::regStateProcesser( // |
|
|
m_state_processer_map[string(state)] = processer; |
|
|
m_state_processer_map[string(state)] = processer; |
|
|
} |
|
|
} |
|
|
void DisinfectionStateMachine::regBfStateProcess(function<void()> processer) { m_bf_state_processer = processer; } |
|
|
void DisinfectionStateMachine::regBfStateProcess(function<void()> processer) { m_bf_state_processer = processer; } |
|
|
|
|
|
void DisinfectionStateMachine::regExceptionProcesser(function<void(const appexception&)> processer) { m_exception_processer = processer; } |
|
|
|
|
|
|
|
|
void DisinfectionStateMachine::pushEvent(DisinfectionEvent event) { |
|
|
void DisinfectionStateMachine::pushEvent(DisinfectionEvent event) { |
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
@ -31,59 +32,66 @@ void DisinfectionStateMachine::callStateProcesser(DisinfectionState state, Disin |
|
|
iter->second(event); |
|
|
iter->second(event); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
void DisinfectionStateMachine::loop() { |
|
|
|
|
|
this_thread::sleep_for(chrono::milliseconds(2)); |
|
|
|
|
|
|
|
|
void DisinfectionStateMachine::startProcess() { |
|
|
|
|
|
m_process_thread_.reset(new Thread("DisinfectionStateMachineThread", [this]() { |
|
|
|
|
|
while (true) { |
|
|
|
|
|
this_thread::sleep_for(chrono::milliseconds(2)); |
|
|
|
|
|
|
|
|
shared_ptr<DisinfectionEvent> event; |
|
|
|
|
|
|
|
|
shared_ptr<DisinfectionEvent> event; |
|
|
|
|
|
|
|
|
bool popevent = false; |
|
|
|
|
|
{ |
|
|
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
|
|
if (!m_event_list.empty()) { |
|
|
|
|
|
event = m_event_list.front(); |
|
|
|
|
|
m_event_list.pop_front(); |
|
|
|
|
|
popevent = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
bool popevent = false; |
|
|
|
|
|
{ |
|
|
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
|
|
if (!m_event_list.empty()) { |
|
|
|
|
|
event = m_event_list.front(); |
|
|
|
|
|
m_event_list.pop_front(); |
|
|
|
|
|
popevent = true; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (popevent) { |
|
|
|
|
|
if (event->event == kevent_change_state) { |
|
|
|
|
|
DisinfectionEvent exit_event; |
|
|
|
|
|
DisinfectionEvent enter_event; |
|
|
|
|
|
|
|
|
if (popevent) { |
|
|
|
|
|
if (event->event == kevent_change_state) { |
|
|
|
|
|
DisinfectionEvent exit_event; |
|
|
|
|
|
DisinfectionEvent enter_event; |
|
|
|
|
|
|
|
|
exit_event.event = kevent_exit_state; |
|
|
|
|
|
exit_event.exitState.next = event->changeState.to; |
|
|
|
|
|
|
|
|
exit_event.event = kevent_exit_state; |
|
|
|
|
|
exit_event.exitState.next = event->changeState.to; |
|
|
|
|
|
|
|
|
enter_event.event = kevent_enter_state; |
|
|
|
|
|
enter_event.enterState.last = event->changeState.from; |
|
|
|
|
|
|
|
|
enter_event.event = kevent_enter_state; |
|
|
|
|
|
enter_event.enterState.last = event->changeState.from; |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &exit_event); |
|
|
|
|
|
m_state = event->changeState.to; |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &exit_event); |
|
|
|
|
|
m_state = event->changeState.to; |
|
|
|
|
|
|
|
|
m_enter_state_tp = zsystem_clock().now(); |
|
|
|
|
|
logger->info("change state from {} to {}", //
|
|
|
|
|
|
string(event->changeState.from), string(event->changeState.to)); |
|
|
|
|
|
|
|
|
m_enter_state_tp = zsystem_clock().now(); |
|
|
|
|
|
logger->info("change state from {} to {}", //
|
|
|
|
|
|
string(event->changeState.from), string(event->changeState.to)); |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &enter_event); |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &enter_event); |
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
logger->info("process event: {}", disinfection_event_to_string(event->event)); |
|
|
|
|
|
callStateProcesser(m_state, event.get()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
logger->info("process event: {}", disinfection_event_to_string(event->event)); |
|
|
|
|
|
callStateProcesser(m_state, event.get()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief |
|
|
|
|
|
*/ |
|
|
|
|
|
if (zsystem_clock().elapsedTimeMs(m_last_tmr_event) > 1000) { |
|
|
|
|
|
DisinfectionEvent event; |
|
|
|
|
|
event.event = kevent_tmr_1s; |
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief |
|
|
|
|
|
*/ |
|
|
|
|
|
if (zsystem_clock().elapsedTimeMs(m_last_tmr_event) > 1000) { |
|
|
|
|
|
DisinfectionEvent event; |
|
|
|
|
|
event.event = kevent_tmr_1s; |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &event); |
|
|
|
|
|
m_last_tmr_event = zsystem_clock().now(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
callStateProcesser(m_state, &event); |
|
|
|
|
|
m_last_tmr_event = zsystem_clock().now(); |
|
|
|
|
|
|
|
|
void DisinfectionStateMachine::startProcess() { |
|
|
|
|
|
m_process_thread_.reset(new Thread("DisinfectionStateMachineThread", [this]() { |
|
|
|
|
|
while (true) { |
|
|
|
|
|
try { |
|
|
|
|
|
loop(); |
|
|
|
|
|
} catch (const appexception& e) { |
|
|
|
|
|
if (m_exception_processer) m_exception_processer(e); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
})); |
|
|
})); |
|
|