@@ -28,6 +28,27 @@ const std::string API_ROOT{"/api/v1"};
2828const auto sessionsEndpoint = API_ROOT + " /sessions" ;
2929const 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+
3152class DeviceGate ::Impl {
3253 public:
3354 Impl () = default ;
@@ -63,6 +84,24 @@ DeviceGate::DeviceGate(const DeviceInfo& deviceInfo) : deviceInfo(deviceInfo) {
6384bool 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
155276bool 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