24 #ifndef ASYNCGPIOCONTROLLER_HPP__
25 #define ASYNCGPIOCONTROLLER_HPP__
31 #include <ccut/async.hpp>
32 #include <ccut/utils.hpp>
33 #include <logger/Logger.hpp>
34 #include <oatpp/core/macro/component.hpp>
35 #include <oatpp/web/protocol/http/incoming/Request.hpp>
37 #include "Exception.hpp"
38 #include "FutureCoroutine.hpp"
40 #include "SmcController.hpp"
41 #include "device/Axis.hpp"
42 #include "device/DeviceBase.hpp"
43 #include "device/DeviceStore.hpp"
44 #include "platform/PlatformFactory.hpp"
45 #include "util/serialize.hpp"
47 #include OATPP_CODEGEN_BEGIN(ApiController)
57 addTag(*
this,
"gpio");
60 void addParams(
const std::shared_ptr<oatpp::web::server::api::Endpoint::Info>& info)
62 info->pathParams.add<String>(
"id")
63 .addExample(
"Gpio id", String(
"mfe://1/gpio/limit"));
66 ENDPOINT_INFO(getIoValue)
68 info->summary =
"get gpio value";
69 info->addResponse<UInt64>(Status::CODE_200,
"application/json")
70 .addExample(
"example", UInt64(1234));
73 ENDPOINT_ASYNC(
"GET",
"/gpio/{id}/value", getIoValue)
76 ENDPOINT_ASYNC_INIT(getIoValue)
79 auto deviceStore(controller->deviceStore.lock());
82 smc::Gpio::Shared device = deviceStore->getDevice<
smc::Gpio>(
83 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
86 return smc::debug::wait(future.share())
87 .callbackTo(&getIoValue::onResult);
89 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
95 controller->createDtoResponse(Status::CODE_200, UInt64(value.
value)));
99 ENDPOINT_INFO(getIoSize)
101 info->summary =
"get gpio size (in bits)";
102 info->addResponse<UInt64>(Status::CODE_200,
"application/json")
103 .addExample(
"example", UInt32(16));
106 ENDPOINT_ASYNC(
"GET",
"/gpio/{id}/size", getIoSize)
109 ENDPOINT_ASYNC_INIT(getIoSize)
110 Action act()
override
112 auto deviceStore(controller->deviceStore.lock());
115 smc::Gpio::Shared device = deviceStore->getDevice<
smc::Gpio>(
116 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
119 return smc::debug::wait(future.share())
120 .callbackTo(&getIoSize::onResult);
122 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
128 controller->createDtoResponse(Status::CODE_200, UInt32(value.
size)));
132 ENDPOINT_INFO(putIoValue)
134 info->summary =
"set gpio value";
135 info->addResponse(Status::CODE_200,
"application/json");
136 info->addConsumes<UInt64>(
"application/json")
137 .addExample(
"gpio value", UInt64(1234));
140 auto ¶m = info->queryParams.add<UInt32>(
"size")
141 .addExample(
"size", UInt32(32));
143 param.required =
false;
144 param.description =
"request unit";
148 ENDPOINT_ASYNC(
"PUT",
"/gpio/{id}/value", putIoValue)
151 ENDPOINT_ASYNC_INIT(putIoValue)
152 Action act()
override
155 ->readBodyToDtoAsync<UInt64>(
156 controller->getDefaultObjectMapper())
157 .callbackTo(&putIoValue::onSetIoState);
160 Action onSetIoState(
const UInt64 &value)
162 size_t size = getQueryParameter<uint32_t>(request,
"size",
sizeof(smc::units::io_port_t::value_type));
163 auto deviceStore(controller->deviceStore.lock());
166 smc::Gpio::Shared device = deviceStore->getDevice<
smc::Gpio>(
167 ccut::urldecode(request->getPathVariable(
"id").getValue(
"")));
170 return smc::debug::wait(future.share())
172 controller->createResponse(Status::CODE_200,
"done")));
174 return _return(controller->createResponse(Status::CODE_500,
"no deviceStore"));
181 #include OATPP_CODEGEN_END(ApiController)
virtual std::future< void > setIoState(const units::io_port_t &state) const =0
Set state of this IO.
virtual std::future< units::io_port_t > getIoState() const =0
Get current state of this GPIO.
value_type value
port value
size_type size
size in bits