24 #include "AsyncAxisController.hpp"
26 #include OATPP_CODEGEN_BEGIN(ApiController)
28 using namespace oatpp::web::protocol::http;
29 using namespace oatpp::async;
32 AsyncAxisController::AsyncAxisController(
33 std::shared_ptr<ObjectMapper> &objectMapper) :
36 addTag(*
this,
"axis");
39 void AsyncAxisController::addParams(
40 const std::shared_ptr<oatpp::web::server::api::Endpoint::Info> &info)
42 info->pathParams.add<String>(
"id").addExample(
"Grbl axis X",
43 String(
"grbl://1/axis/X"));
46 auto ¶m = info->queryParams.add<String>(
"unit")
47 .addExample(
"mm", String(
"mm"))
48 .addExample(
"steps", String(
"steps"));
50 param.required =
false;
51 param.description =
"request unit";
55 Action AsyncAxisController::getPosition::act()
57 const std::string unit = request->getQueryParameter(
"unit").getValue(
"mm");
58 auto deviceStore(controller->deviceStore.lock());
61 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
62 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
65 smc::from_string<smc::units::Unit>(unit));
66 return smc::debug::wait(future.share())
67 .callbackTo(&getPosition::onResult);
70 controller->createResponse(Status::CODE_500,
"no deviceStore"));
73 Action AsyncAxisController::getPosition::onResult(
77 controller->createDtoResponse(Status::CODE_200, Float64(value.value)));
80 Action AsyncAxisController::putPosition::act()
83 ->readBodyToDtoAsync<Float64>(controller->getDefaultObjectMapper())
84 .callbackTo(&putPosition::onMoveTo);
87 Action AsyncAxisController::putPosition::onMoveTo(
const Float64 &position)
89 const std::string unit = request->getQueryParameter(
"unit").getValue(
"mm");
90 auto deviceStore(controller->deviceStore.lock());
93 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
94 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
96 auto future = axis->
moveTo(
98 position.getValue(std::nan(
"invalid"))});
100 if (future.wait_for(std::chrono::milliseconds(0)) !=
101 std::future_status::timeout)
105 return _return(controller->createResponse(Status::CODE_200,
"done"));
109 controller->createResponse(Status::CODE_500,
"no deviceStore"));
112 Action AsyncAxisController::postPosition::act()
115 ->readBodyToDtoAsync<Float64>(controller->getDefaultObjectMapper())
116 .callbackTo(&postPosition::onMoveBy);
118 Action AsyncAxisController::postPosition::onMoveBy(
const Float64 &position)
120 const std::string unit = request->getQueryParameter(
"unit").getValue(
"mm");
121 auto deviceStore(controller->deviceStore.lock());
124 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
125 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
127 auto future = axis->
moveBy(
129 position.getValue(std::nan(
"invalid"))});
131 if (future.wait_for(std::chrono::milliseconds(0)) !=
132 std::future_status::timeout)
136 return _return(controller->createResponse(Status::CODE_200,
"done"));
139 controller->createResponse(Status::CODE_500,
"no deviceStore"));
142 Action AsyncAxisController::putCurrentPosition::act()
145 ->readBodyToDtoAsync<Float64>(controller->getDefaultObjectMapper())
146 .callbackTo(&putCurrentPosition::onSetCurrentPosition);
149 Action AsyncAxisController::putCurrentPosition::onSetCurrentPosition(
150 const Float64 &position)
152 const std::string unit = request->getQueryParameter(
"unit").getValue(
"mm");
153 auto deviceStore(controller->deviceStore.lock());
156 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
157 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
161 position.getValue(std::nan(
"invalid"))});
162 return smc::debug::wait(future.share())
163 .next(_return(controller->createResponse(Status::CODE_200,
"done")));
166 controller->createResponse(Status::CODE_500,
"no deviceStore"));
169 Action AsyncAxisController::putStop::act()
171 auto deviceStore(controller->deviceStore.lock());
174 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
175 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
177 auto future = axis->
stop();
178 return smc::debug::wait(future.share())
179 .next(_return(controller->createResponse(Status::CODE_200,
"done")));
182 controller->createResponse(Status::CODE_500,
"no deviceStore"));
185 Action AsyncAxisController::putPause::act()
187 auto deviceStore(controller->deviceStore.lock());
190 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
191 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
193 auto future = axis->
pause();
194 return smc::debug::wait(future.share())
195 .next(_return(controller->createResponse(Status::CODE_200,
"done")));
198 controller->createResponse(Status::CODE_500,
"no deviceStore"));
201 Action AsyncAxisController::putResume::act()
203 auto deviceStore(controller->deviceStore.lock());
206 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
207 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
209 auto future = axis->
resume();
210 return smc::debug::wait(future.share())
211 .next(_return(controller->createResponse(Status::CODE_200,
"done")));
214 controller->createResponse(Status::CODE_500,
"no deviceStore"));
217 Action AsyncAxisController::postTakeReference::act()
220 ->readBodyToDtoAsync<Float64>(controller->getDefaultObjectMapper())
221 .callbackTo(&postTakeReference::onTakeReference);
224 Action AsyncAxisController::postTakeReference::onTakeReference(
225 const Float64 &timeout)
227 auto deviceStore(controller->deviceStore.lock());
230 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
231 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
233 auto future = axis->
takeReference(std::chrono::milliseconds(timeout));
235 if (future.wait_for(std::chrono::milliseconds(0)) !=
236 std::future_status::timeout)
242 controller->createResponse(Status::CODE_200,
"homing started"));
245 controller->createResponse(Status::CODE_500,
"no deviceStore"));
248 Action AsyncAxisController::getState::act()
250 auto deviceStore(controller->deviceStore.lock());
253 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
254 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
258 return smc::debug::wait(future.share()).callbackTo(&getState::onResult);
261 controller->createResponse(Status::CODE_500,
"no deviceStore"));
264 Action AsyncAxisController::getState::onResult(
const smc::Axis::State &state)
266 return _return(controller->createDtoResponse(
virtual std::future< void > resume() const
Resume paused motion.
virtual std::future< void > takeReference(const std::chrono::milliseconds &timeout=std::chrono::seconds{ 120}) const
Start a homing sequence.
virtual std::future< units::value_t > getPosition(units::unit_t unit) const =0
Get current position of this axis.
virtual std::future< void > moveBy(const units::Value &distance) const =0
Move this axis by given distance.
virtual std::future< void > stop() const =0
Stop any ongoing motion, flush the motion-queue.
virtual std::future< void > setActualPosition(const units::Value &position) const
Set current axis position.
virtual std::future< State > getState() const =0
Get the current axis state.
virtual std::future< void > pause() const
Pause ongoing motion, prevent queued motions from running.
virtual std::future< void > moveTo(const units::Value &position) const =0
Move this axis to given position.
const std::string & to_string(Axis::State state)
convert State to string
main motion-lib namespace