24 #ifndef ASYNCCONFIGCONTROLLER_HPP__
25 #define ASYNCCONFIGCONTROLLER_HPP__
27 #include <ccut/utils.hpp>
28 #include <oatpp/core/macro/component.hpp>
30 #include "FutureCoroutine.hpp"
32 #include "SmcController.hpp"
33 #include "device/DeviceBase.hpp"
34 #include "device/DeviceStore.hpp"
36 #include OATPP_CODEGEN_BEGIN(ApiController)
46 addTag(*
this,
"config");
49 void addParams(
const std::shared_ptr<oatpp::web::server::api::Endpoint::Info>& info)
51 info->pathParams.add<String>(
"id")
52 .addExample(
"Grbl axis X", String(
"grbl://1/axis/X"));
55 ENDPOINT_INFO(getConfigList)
57 info->summary =
"get device configuration parameters";
58 info->addResponse<List<String>>(Status::CODE_200,
"application/json");
61 ENDPOINT_ASYNC(
"GET",
"/config/{id}", getConfigList)
64 ENDPOINT_ASYNC_INIT(getConfigList)
67 auto deviceStore(controller->deviceStore.lock());
70 smc::DeviceBase::Shared device = deviceStore->getDevice(
71 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
73 auto future = device->listConfig();
74 return smc::debug::wait(future.share())
75 .callbackTo(&getConfigList::onResult);
77 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
80 Action onResult(
const std::set<std::string> &value)
82 oatpp::UnorderedSet<String> ret{oatpp::UnorderedSet<String>::createShared()};
83 ret->insert(value.begin(), value.end());
85 controller->createDtoResponse(Status::CODE_200, ret));
89 ENDPOINT_INFO(getConfig)
91 info->summary =
"get configuration parameter value";
92 info->addResponse<String>(Status::CODE_200,
"application/json");
94 info->pathParams.add<String>(
"name")
95 .addExample(
"Axis travel resolution", String(
"axis travel resolution"));
97 ENDPOINT_ASYNC(
"GET",
"/config/{id}/{name}", getConfig)
100 ENDPOINT_ASYNC_INIT(getConfig)
101 Action act()
override
103 auto deviceStore(controller->deviceStore.lock());
106 smc::DeviceBase::Shared device = deviceStore->getDevice(
107 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
108 const std::string name =
109 ccut::urldecode(request->getPathVariable(
"name").getValue(
""));
111 auto future = device->getConfig(name);
112 return smc::debug::wait(future.share())
113 .callbackTo(&getConfig::onResult);
115 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
118 Action onResult(
const std::string &value)
121 controller->createDtoResponse(Status::CODE_200, String{value}));
125 ENDPOINT_INFO(putConfig)
127 info->summary =
"set a configuration parameter value";
128 info->addResponse<String>(Status::CODE_200,
"application/json");
130 info->pathParams.add<String>(
"name")
131 .addExample(
"Axis travel resolution", String(
"axis travel resolution"));
132 info->addConsumes<String>(
"application/json")
133 .addExample(
"sample value", String(
"250"));
135 ENDPOINT_ASYNC(
"PUT",
"/config/{id}/{name}", putConfig)
138 ENDPOINT_ASYNC_INIT(putConfig)
139 Action act()
override
141 return request->readBodyToDtoAsync<String>(
142 controller->getDefaultObjectMapper())
143 .callbackTo(&putConfig::onBody);
146 Action onBody(
const String &value)
148 auto deviceStore(controller->deviceStore.lock());
151 smc::DeviceBase::Shared device = deviceStore->getDevice(
152 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
153 const std::string name =
154 ccut::urldecode(request->getPathVariable(
"name").getValue(
""));
156 auto future = device->setConfig(name, value.getValue(
""));
157 return smc::debug::wait(future.share())
158 .next(_return(controller->createResponse(Status::CODE_200,
"done")));
160 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
167 #include OATPP_CODEGEN_END(ApiController)