24 #ifndef APICONTROLLER_HPP__
25 #define APICONTROLLER_HPP__
30 #include <ccut/async.hpp>
31 #include <ccut/utils.hpp>
32 #include <logger/Logger.hpp>
33 #include <oatpp/core/macro/codegen.hpp>
34 #include <oatpp/core/macro/component.hpp>
35 #include <oatpp/web/server/api/ApiController.hpp>
37 #include "Exception.hpp"
38 #include "device/Axis.hpp"
39 #include "device/DeviceBase.hpp"
40 #include "device/DeviceStore.hpp"
41 #include "platform/PlatformFactory.hpp"
42 #include "util/serialize.hpp"
44 #include OATPP_CODEGEN_BEGIN(ApiController)
49 explicit ApiController(OATPP_COMPONENT(std::shared_ptr<ObjectMapper>,
51 oatpp::web::server::api::ApiController(objectMapper)
56 info->summary =
"api-docs redirection";
57 info->addResponse<List<String>>(Status::CODE_302,
"");
59 ENDPOINT(
"GET",
"/", root)
61 auto ret = createResponse(Status::CODE_302);
62 ret->putHeader(
"Location",
"/api-docs/ui");
66 ENDPOINT_INFO(devicesTypes)
68 info->summary =
"List device types";
69 info->addResponse<List<String>>(Status::CODE_200,
"application/json")
70 .addExample(
"example",
71 List<String>{
"axis",
"position",
"gpio",
"trigger"});
73 ENDPOINT(
"GET",
"/devices/types", devicesTypes)
75 auto deviceStore(m_deviceStore.lock());
76 List<String> ret{List<String>::createShared()};
79 std::set<smc::DeviceType> deviceTypes =
80 smc::getEnumValues<smc::DeviceType>();
81 std::transform(deviceTypes.cbegin(), deviceTypes.cend(),
82 std::inserter(*ret, ret->begin()),
85 return createDtoResponse(Status::CODE_200, ret);
88 ENDPOINT_INFO(devices)
90 info->summary =
"List available devices";
91 info->addResponse<List<String>>(Status::CODE_200,
"application/json")
92 .addExample(
"example",
93 List<String>{
"grbl://1/platform",
"grbl://1/axis/X",
94 "grbl://1/axis/Y",
"grbl://1/axis/Z",
95 "grbl://1/axis/A",
"grbl://1/axis/B",
97 auto ¶m = info->queryParams.add<String>(
"type")
98 .addExample(
"fetch all", String())
99 .addExample(
"trigger", String(
"trigger"))
100 .addExample(
"axis", String(
"axis"))
101 .addExample(
"platform", String(
"platform"));
102 param.description =
"device type filter, accepted values are listed in "
103 "`GET /devices/types`";
104 param.required =
false;
106 ENDPOINT(
"GET",
"/devices", devices, QUERIES(QueryParams, queryParams))
108 const std::string deviceType = queryParams.get(
"type").getValue(
"");
109 oatpp::UnorderedSet<String> ret{
110 oatpp::UnorderedSet<String>::createShared()};
112 auto deviceStore(m_deviceStore.lock());
115 std::set<smc::DeviceId> devices = deviceType.empty() ?
116 deviceStore->getDeviceList() :
117 deviceStore->getDeviceList(
118 smc::from_string<smc::DeviceType>(deviceType));
119 ret->insert(devices.begin(), devices.end());
121 return createDtoResponse(Status::CODE_200, ret);
125 "/axis/{id}/position",
128 BODY_DTO(Float64, position))
130 auto deviceStore(m_deviceStore.lock());
133 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
134 ccut::urldecode(
id.getValue(
"")));
136 return createResponse(Status::CODE_404,
"No such axis");
139 return createResponse(Status::CODE_200,
"done");
141 return createResponse(Status::CODE_500,
"no deviceStore");
144 ENDPOINT(
"GET",
"/axis/{id}/position", getPosition, PATH(String,
id))
146 auto deviceStore(m_deviceStore.lock());
149 smc::Axis::Shared axis = deviceStore->getDevice<
smc::Axis>(
150 ccut::urldecode(
id.getValue(
"")));
152 return createResponse(Status::CODE_404,
"No such axis");
153 return createDtoResponse(
155 Float64(ccut::wait(axis->getPosition(smc::units::mm)).value));
157 return createResponse(Status::CODE_500,
"no deviceStore");
160 std::weak_ptr<smc::internal::PlatformFactory> m_platformFactory;
161 std::weak_ptr<smc::internal::DeviceStore> m_deviceStore;
164 #include OATPP_CODEGEN_END(ApiController)
DeviceType
List of possible device types supported.