24 #ifndef ASYNCTRIGGERCONTROLLER_HPP__
25 #define ASYNCTRIGGERCONTROLLER_HPP__
31 #include <ccut/async.hpp>
32 #include <ccut/utils.hpp>
33 #include <logger/Logger.hpp>
34 #include <oatpp/core/macro/component.hpp>
36 #include "Exception.hpp"
37 #include "FutureCoroutine.hpp"
39 #include "SmcController.hpp"
40 #include "device/DeviceBase.hpp"
41 #include "device/DeviceStore.hpp"
42 #include "device/Trigger.hpp"
43 #include "platform/PlatformFactory.hpp"
44 #include "util/serialize.hpp"
46 #include OATPP_CODEGEN_BEGIN(ApiController)
54 OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper)) :
57 addTag(*
this,
"trigger");
61 const std::shared_ptr<oatpp::web::server::api::Endpoint::Info> &info)
63 info->pathParams.add<String>(
"id")
64 .addExample(
"Global Trigger", String(
"grbl://1/trigger"))
65 .addExample(
"Trigger 0", String(
"grbl://1/trigger/0"));
69 ENDPOINT_INFO(getTriggerState)
72 info->summary =
"trigger is armed?";
73 info->addResponse<Boolean>(Status::CODE_200,
"application/json")
74 .addExample(
"example", Boolean(
true));
75 info->summary =
"checking if a trigger is armed is not currently "
76 "possible at grbl level";
80 ENDPOINT_ASYNC(
"GET",
"/trigger/{id}/state", getTriggerState)
84 ENDPOINT_ASYNC_INIT(getTriggerState)
88 auto deviceStore(controller->deviceStore.lock());
92 smc::Trigger::Shared trigger = deviceStore->getDevice<
smc::Trigger>(
93 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
96 auto future = trigger->
isArmed();
98 return smc::debug::wait(future.share())
99 .callbackTo(&getTriggerState::onResult);
103 controller->createResponse(Status::CODE_500,
"no deviceStore"));
106 Action onResult(
const bool &armed)
109 controller->createDtoResponse(Status::CODE_200, Boolean(armed)));
114 ENDPOINT_INFO(putTriggerState)
117 info->summary =
"arm trigger";
118 info->addResponse(Status::CODE_200,
"application/json");
119 info->addConsumes<Boolean>(
"application/json")
120 .addExample(
"arm trigger", Boolean(
true))
121 .addExample(
"disarm trigger", Boolean(
false));
126 ENDPOINT_ASYNC(
"PUT",
"/trigger/{id}/arm", putTriggerState)
130 ENDPOINT_ASYNC_INIT(putTriggerState)
131 Action act()
override
135 ->readBodyToDtoAsync<Boolean>(
136 controller->getDefaultObjectMapper())
137 .callbackTo(&putTriggerState::onArmTrigger);
141 Action onArmTrigger(
const Boolean &armed)
144 auto deviceStore(controller->deviceStore.lock());
148 smc::Trigger::Shared trigger = deviceStore->getDevice<
smc::Trigger>(
149 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
152 logger::info(
"arming trigger:") << trigger->
toString();
154 auto future = armed ? trigger->arm() : trigger->disarm();
155 logger::info(
"armed trigger:") << trigger->toString();
156 return smc::debug::wait(future.share())
158 controller->createResponse(Status::CODE_200,
"trigger state changed")));
161 controller->createResponse(Status::CODE_500,
"no deviceStore"));
166 ENDPOINT_INFO(postTriggerTrigger)
169 info->summary =
"trigger the trigger";
170 info->addResponse(Status::CODE_200,
"application/json");
175 ENDPOINT_ASYNC(
"POST",
"/trigger/{id}/trigger", postTriggerTrigger)
179 ENDPOINT_ASYNC_INIT(postTriggerTrigger)
180 Action act()
override
183 auto deviceStore(controller->deviceStore.lock());
187 smc::Trigger::Shared trigger = deviceStore->getDevice<
smc::Trigger>(
188 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
191 logger::info(
"triggering trigger:") << trigger->
toString();
193 auto future = trigger->trig();
195 return smc::debug::wait(future.share())
197 controller->createResponse(Status::CODE_200,
"trigger triggered")));
201 controller->createResponse(Status::CODE_500,
"no deviceStore"));
209 #include OATPP_CODEGEN_END(ApiController)
std::string toString() const
debug and logging operation
virtual std::future< bool > isArmed() const =0
check if trigger is armed