Skip to content

Commit 1f362b0

Browse files
author
Filippo Mutta
committed
Finalised GATE via USB.
1 parent 6784c4f commit 1f362b0

File tree

1 file changed

+232
-21
lines changed

1 file changed

+232
-21
lines changed

src/device/DeviceGate.cpp

Lines changed: 232 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ const std::string API_ROOT{"/api/v1"};
2828
const auto sessionsEndpoint = API_ROOT + "/sessions";
2929
const int DEFAULT_PORT{11492};
3030

31+
enum USBRequestID_t {
32+
RESPONSE_OK,
33+
RESPONSE_ERROR,
34+
CREATE_SESSION,
35+
START_SESSION,
36+
UPLOAD_FWP,
37+
STOP_SESSION,
38+
DESTROY_SESSION,
39+
DELETE_SESSION,
40+
IS_OKAY,
41+
GET_VERSION,
42+
GET_STATE,
43+
GET_FILE,
44+
};
45+
46+
struct USBRequest_t {
47+
uint16_t RequestNum;
48+
uint32_t RequestSize;
49+
}__attribute__((packed));
50+
51+
3152
class DeviceGate::Impl {
3253
public:
3354
Impl() = default;
@@ -63,6 +84,24 @@ DeviceGate::DeviceGate(const DeviceInfo& deviceInfo) : deviceInfo(deviceInfo) {
6384
bool DeviceGate::isOkay() {
6485
if(auto res = pimpl->cli->Get("/api/v1/status")) {
6586
return nlohmann::json::parse(res->body)["status"].get<bool>();
87+
} else {
88+
USBRequest_t request;
89+
request.RequestNum = IS_OKAY;
90+
request.RequestSize = 0;
91+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
92+
93+
XLinkPlatformGateRead(&request, sizeof(request));
94+
if(request.RequestNum == RESPONSE_ERROR) {
95+
return false;
96+
}
97+
98+
char *respBuffer = new char[request.RequestSize];
99+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
100+
101+
bool result = nlohmann::json::parse(respBuffer)["status"].get<bool>();
102+
delete[] respBuffer;
103+
104+
return result;
66105
}
67106

68107
return false;
@@ -73,6 +112,25 @@ Version DeviceGate::getVersion() {
73112
if(res && res->status == 200) {
74113
auto versionStr = nlohmann::json::parse(res->body)["version_gate"].get<std::string>();
75114
return Version{versionStr};
115+
} else {
116+
USBRequest_t request;
117+
request.RequestNum = GET_VERSION;
118+
request.RequestSize = 0;
119+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
120+
121+
XLinkPlatformGateRead(&request, sizeof(request));
122+
if(request.RequestNum == RESPONSE_ERROR) {
123+
return Version{0, 0, 0};
124+
}
125+
126+
char *respBuffer = new char[request.RequestSize];
127+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
128+
129+
auto result = nlohmann::json::parse(respBuffer)["version_gate"].get<std::string>();
130+
delete[] respBuffer;
131+
132+
return Version{result};
133+
76134
}
77135
return Version{0, 0, 0};
78136
}
@@ -86,6 +144,27 @@ DeviceGate::VersionInfo DeviceGate::getAllVersion() {
86144
info.gate = result.value("version_gate", "");
87145
info.os = result.value("version_os", "");
88146
return info;
147+
} else {
148+
USBRequest_t request;
149+
request.RequestNum = GET_VERSION;
150+
request.RequestSize = 0;
151+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
152+
153+
XLinkPlatformGateRead(&request, sizeof(request));
154+
if(request.RequestNum == RESPONSE_ERROR) {
155+
return {};
156+
}
157+
158+
char *respBuffer = new char[request.RequestSize];
159+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
160+
auto result = nlohmann::json::parse(respBuffer);
161+
delete[] respBuffer;
162+
163+
VersionInfo info;
164+
info.gate = result.value("version_gate", "");
165+
info.os = result.value("version_os", "");
166+
return info;
167+
89168
}
90169
return {};
91170
}
@@ -147,25 +226,54 @@ bool DeviceGate::createSession(bool exclusive) {
147226
sessionCreated = true;
148227
return true;
149228
} else {
150-
spdlog::warn("DeviceGate createSession not successful - got no response");
229+
USBRequest_t request;
230+
request.RequestNum = CREATE_SESSION;
231+
request.RequestSize = createSessionBody.dump().size();
232+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
233+
XLinkPlatformGateWrite((void*)createSessionBody.dump().c_str(), createSessionBody.dump().size());
234+
235+
XLinkPlatformGateRead(&request, sizeof(request));
236+
char *respBuffer = new char[request.RequestSize];
237+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
238+
auto resp = nlohmann::json::parse(respBuffer);
239+
delete[] respBuffer;
240+
spdlog::debug("DeviceGate createSession response: {}", resp.dump());
241+
242+
// Retrieve sessionId
243+
sessionId = resp["id"];
244+
bool fwpExists = resp["fwp_exists"].get<bool>();
245+
246+
if(!fwpExists) {
247+
std::vector<uint8_t> package;
248+
std::string path;
249+
if(!path.empty()) {
250+
std::ifstream fwStream(path, std::ios::binary);
251+
if(!fwStream.is_open()) throw std::runtime_error(fmt::format("Cannot flash bootloader, binary at path: {} doesn't exist", path));
252+
package = std::vector<std::uint8_t>(std::istreambuf_iterator<char>(fwStream), {});
253+
} else {
254+
package = platform == X_LINK_RVC3 ? Resources::getInstance().getDeviceRVC3Fwp() : Resources::getInstance().getDeviceRVC4Fwp();
255+
}
256+
257+
nlohmann::json uploadFwpBody = {{"sessionId", sessionId},
258+
{"file", package}};
259+
request.RequestNum = UPLOAD_FWP;
260+
request.RequestSize = uploadFwpBody.dump().size();
261+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
262+
XLinkPlatformGateWrite((void*)uploadFwpBody.dump().c_str(), uploadFwpBody.dump().size());
263+
264+
XLinkPlatformGateRead(&request, sizeof(request));
265+
if(request.RequestNum == RESPONSE_ERROR) {
266+
spdlog::warn("DeviceGate upload fwp not successful - got no response");
267+
return false;
268+
}
269+
}
270+
sessionCreated = true;
271+
return true;
151272
}
152273
return false;
153274
}
154275

155276
bool DeviceGate::startSession() {
156-
struct request_t {
157-
uint16_t RequestNum;
158-
uint32_t RequestSize;
159-
}__attribute__((packed));
160-
request_t request;
161-
request.RequestNum = 1;
162-
request.RequestSize = 0;
163-
164-
XLinkPlatformGateWrite(&request, sizeof(request));
165-
XLinkPlatformGateRead(&request, sizeof(request));
166-
int requestNum = request.RequestNum;
167-
spdlog::warn("Request num: {}", requestNum);
168-
169277
std::string url = fmt::format("{}/{}/start", sessionsEndpoint, sessionId);
170278
if(auto res = pimpl->cli->Post(url.c_str())) {
171279
if(res->status != 200) {
@@ -175,7 +283,19 @@ bool DeviceGate::startSession() {
175283
spdlog::debug("DeviceGate start fwp successful");
176284
return true;
177285
} else {
178-
spdlog::debug("DeviceGate start fwp not successful - got no response");
286+
USBRequest_t request;
287+
request.RequestNum = START_SESSION;
288+
request.RequestSize = sessionId.size();
289+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
290+
XLinkPlatformGateWrite((void*)sessionId.c_str(), sessionId.size());
291+
292+
XLinkPlatformGateRead(&request, sizeof(request));
293+
if(request.RequestNum == RESPONSE_ERROR) {
294+
spdlog::debug("DeviceGate start fwp not successful - got no response");
295+
return false;
296+
}
297+
spdlog::debug("DeviceGate start fwp successful");
298+
return true;
179299
}
180300

181301
return false;
@@ -204,7 +324,19 @@ bool DeviceGate::stopSession() {
204324
spdlog::debug("DeviceGate stopSession successful");
205325
return true;
206326
} else {
207-
spdlog::error("DeviceGate stopSession not successful - got no response");
327+
USBRequest_t request;
328+
request.RequestNum = STOP_SESSION;
329+
request.RequestSize = sessionId.size();
330+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
331+
XLinkPlatformGateWrite((void*)sessionId.c_str(), sessionId.size());
332+
333+
XLinkPlatformGateRead(&request, sizeof(request));
334+
if(request.RequestNum == RESPONSE_ERROR) {
335+
spdlog::error("DeviceGate stopSession not successful - got no response");
336+
return false;
337+
}
338+
spdlog::debug("DeviceGate stopSession successful");
339+
return true;
208340
}
209341

210342
return false;
@@ -230,7 +362,19 @@ bool DeviceGate::destroySession() {
230362
spdlog::debug("DeviceGate destroySession successful");
231363
return true;
232364
} else {
233-
spdlog::error("DeviceGate destroySession not successful - got no response");
365+
USBRequest_t request;
366+
request.RequestNum = DESTROY_SESSION;
367+
request.RequestSize = sessionId.size();
368+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
369+
XLinkPlatformGateWrite((void*)sessionId.c_str(), sessionId.size());
370+
371+
XLinkPlatformGateRead(&request, sizeof(request));
372+
if(request.RequestNum == RESPONSE_ERROR) {
373+
spdlog::error("DeviceGate destroySession not successful - got no response");
374+
return false;
375+
}
376+
spdlog::debug("DeviceGate destroySession successful");
377+
return true;
234378
}
235379
return false;
236380
}
@@ -250,7 +394,19 @@ bool DeviceGate::deleteSession() {
250394
spdlog::debug("DeviceGate deleteSession successful");
251395
return true;
252396
} else {
253-
spdlog::error("DeviceGate deleteSession not successful - got no response");
397+
USBRequest_t request;
398+
request.RequestNum = DELETE_SESSION;
399+
request.RequestSize = sessionId.size();
400+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
401+
XLinkPlatformGateWrite((void*)sessionId.c_str(), sessionId.size());
402+
403+
XLinkPlatformGateRead(&request, sizeof(request));
404+
if(request.RequestNum == RESPONSE_ERROR) {
405+
spdlog::error("DeviceGate deleteSession not successful - got no response");
406+
return false;
407+
}
408+
spdlog::debug("DeviceGate deleteSession successful");
409+
return true;
254410
}
255411
return false;
256412
}
@@ -289,7 +445,42 @@ DeviceGate::SessionState DeviceGate::getState() {
289445
}
290446
return sessionState;
291447
} else {
292-
spdlog::warn("DeviceGate getState not successful - got no response");
448+
USBRequest_t request;
449+
request.RequestNum = GET_STATE;
450+
request.RequestSize = sessionId.size();
451+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
452+
XLinkPlatformGateWrite((void*)sessionId.c_str(), sessionId.size());
453+
454+
XLinkPlatformGateRead(&request, sizeof(request));
455+
if(request.RequestNum == RESPONSE_ERROR) {
456+
spdlog::warn("DeviceGate getState not successful - got no response");
457+
return SessionState::ERROR_STATE;
458+
}
459+
460+
char *respBuffer = new char[request.RequestSize];
461+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
462+
auto resp = nlohmann::json::parse(respBuffer);
463+
delete[] respBuffer;
464+
spdlog::trace("DeviceGate getState response: {}", resp.dump());
465+
466+
std::string sessionStateStr = resp["state"];
467+
if(sessionStateStr == "CREATED") {
468+
sessionState = SessionState::CREATED;
469+
} else if(sessionStateStr == "RUNNING") {
470+
sessionState = SessionState::RUNNING;
471+
} else if(sessionStateStr == "STOPPED") {
472+
sessionState = SessionState::STOPPED;
473+
} else if(sessionStateStr == "STOPPING") {
474+
sessionState = SessionState::STOPPING;
475+
} else if(sessionStateStr == "CRASHED") {
476+
sessionState = SessionState::CRASHED;
477+
} else if(sessionStateStr == "DESTROYED") {
478+
sessionState = SessionState::DESTROYED;
479+
} else {
480+
spdlog::warn("DeviceGate getState not successful - unknown session state: {}", sessionStateStr);
481+
sessionState = SessionState::ERROR_STATE;
482+
}
483+
return sessionState;
293484
}
294485
return SessionState::ERROR_STATE;
295486
}
@@ -309,8 +500,28 @@ std::optional<std::vector<uint8_t>> DeviceGate::getFile(const std::string& fileU
309500
return std::nullopt;
310501
}
311502
} else {
312-
spdlog::warn("File download not successful - got no response");
313-
return std::nullopt;
503+
USBRequest_t request;
504+
request.RequestNum = GET_FILE;
505+
request.RequestSize = fileUrl.size();
506+
XLinkPlatformGateWrite(&request, sizeof(USBRequest_t));
507+
XLinkPlatformGateWrite((void*)fileUrl.c_str(), fileUrl.size());
508+
509+
XLinkPlatformGateRead(&request, sizeof(request));
510+
if(request.RequestNum == RESPONSE_ERROR) {
511+
spdlog::warn("File download not successful - got no response");
512+
return std::nullopt;
513+
}
514+
515+
char *respBuffer = new char[request.RequestSize];
516+
XLinkPlatformGateRead(respBuffer, request.RequestSize);
517+
auto resp = nlohmann::json::parse(respBuffer);
518+
delete[] respBuffer;
519+
520+
filename = resp["filename"].get<std::string>();
521+
std::vector<uint8_t> fileData(resp["data"]);
522+
523+
spdlog::debug("File download successful. Filename: {}", filename);
524+
return fileData;
314525
}
315526
}
316527

0 commit comments

Comments
 (0)