update cmd client
This commit is contained in:
@@ -190,8 +190,8 @@ private:
|
||||
std::vector<BYTE> depth_data; ///< 深度数据
|
||||
|
||||
public:
|
||||
virtual void Startup(EngineConfig&& config) override {
|
||||
IEngine::Startup(std::move(config));
|
||||
virtual void startup(EngineConfig&& config) override {
|
||||
IEngine::startup(std::move(config));
|
||||
|
||||
// 创建Win32窗口并显示
|
||||
if (this->config.headless) {
|
||||
@@ -320,8 +320,8 @@ public:
|
||||
//frameCount = 0;
|
||||
}
|
||||
|
||||
virtual bool Tick() override {
|
||||
if (IEngine::Tick()) return true;
|
||||
virtual bool tick() override {
|
||||
if (IEngine::tick()) return true;
|
||||
|
||||
// Event loop
|
||||
if (EventLoop()) return true;
|
||||
@@ -368,8 +368,8 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual void Shutdown() override {
|
||||
IEngine::Shutdown();
|
||||
virtual void shutdown() override {
|
||||
IEngine::shutdown();
|
||||
|
||||
//if (hPipe != INVALID_HANDLE_VALUE) {
|
||||
// CloseHandle(hPipe);
|
||||
|
||||
@@ -4,66 +4,72 @@
|
||||
|
||||
namespace basalt::presenter::cmd_client {
|
||||
|
||||
CommandClient::CommandClient() : m_PipeOperator(BSTEXT("ed0e3f1f-d214-4880-9562-640bce15e72e")), m_Status(ClientStatus::Ready) {}
|
||||
CmdClient::CmdClient() : m_PipeOperator(BSTEXT("ed0e3f1f-d214-4880-9562-640bce15e72e")), m_Status(CmdClientStatus::Ready) {}
|
||||
|
||||
CommandClient::~CommandClient() {}
|
||||
CmdClient::~CmdClient() {}
|
||||
|
||||
HandshakePayload CommandClient::WaitHandshake() {
|
||||
if (m_Status != ClientStatus::Ready) {
|
||||
HandshakePayload CmdClient::wait_handshake() {
|
||||
if (m_Status != CmdClientStatus::Ready) {
|
||||
throw std::runtime_error("unexcpected client status");
|
||||
}
|
||||
|
||||
// Wait for handshake request from Trainer (code 0x61)
|
||||
ProtocolCode request_code;
|
||||
m_PipeOperator.Read(&request_code, sizeof(request_code));
|
||||
m_PipeOperator.read_pod(request_code);
|
||||
if (request_code != ProtocolCode::HANDSHAKE_REQUEST) {
|
||||
throw std::runtime_error("unexpcted handshake code");
|
||||
}
|
||||
// Accept payload
|
||||
HandshakePayload handshake_payload;
|
||||
m_PipeOperator.Read(&handshake_payload, sizeof(HandshakePayload));
|
||||
m_PipeOperator.read_pod(handshake_payload);
|
||||
|
||||
// Send handshake response (code 0x62) back to Trainer
|
||||
ProtocolCode response_code = ProtocolCode::HANDSHAKE_RESPONSE;
|
||||
m_PipeOperator.Write(&response_code, sizeof(response_code));
|
||||
m_PipeOperator.write_pod(response_code);
|
||||
|
||||
// Set status and return
|
||||
m_Status = ClientStatus::Running;
|
||||
m_Status = CmdClientStatus::Running;
|
||||
return handshake_payload;
|
||||
}
|
||||
|
||||
bool CommandClient::Tick(bool actively_stop) {
|
||||
if (m_Status != ClientStatus::Running) {
|
||||
bool CmdClient::tick(bool actively_stop) {
|
||||
if (m_Status != CmdClientStatus::Running) {
|
||||
throw std::runtime_error("unexcpected client status");
|
||||
}
|
||||
|
||||
// If actively stop, send actively stop code to Trainer first
|
||||
if (actively_stop) {
|
||||
ProtocolCode sent_code = ProtocolCode::STOP_REQUEST;
|
||||
m_PipeOperator.Write(&sent_code, sizeof(sent_code));
|
||||
ProtocolCode actively_stop_code = ProtocolCode::STOP_REQUEST;
|
||||
m_PipeOperator.write_pod(actively_stop_code);
|
||||
}
|
||||
|
||||
// Send data ready code to Trainer
|
||||
ProtocolCode sent_code = ProtocolCode::DATA_READY;
|
||||
m_PipeOperator.Write(&sent_code, sizeof(sent_code));
|
||||
ProtocolCode data_ready_code = ProtocolCode::DATA_READY;
|
||||
m_PipeOperator.write_pod(data_ready_code);
|
||||
|
||||
// Process the response from Trainer
|
||||
while (true) {
|
||||
ProtocolCode recv_code;
|
||||
m_PipeOperator.Read(&recv_code, sizeof(recv_code));
|
||||
m_PipeOperator.read_pod(recv_code);
|
||||
|
||||
switch (recv_code) {
|
||||
case ProtocolCode::DATA_RECEIVED:
|
||||
case ProtocolCode::DATA_RECEIVED: {
|
||||
// Normal response, continue processing
|
||||
return false; // Not stopping
|
||||
case Basalt::Presenter::ProtocolCode::STOP:
|
||||
}
|
||||
case ProtocolCode::STOP_REQUEST: {
|
||||
// Trainer wants to stop
|
||||
m_Status = ClientStatus::Stop;
|
||||
// We sent response first
|
||||
ProtocolCode stop_response_code = ProtocolCode::STOP_RESPONSE;
|
||||
m_PipeOperator.write_pod(stop_response_code);
|
||||
// Set status and return.
|
||||
m_Status = CmdClientStatus::Stop;
|
||||
return true; // Should stop
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error("unexpected code when running");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Basalt::Presenter
|
||||
} // namespace basalt::presenter::cmd_client
|
||||
@@ -12,7 +12,7 @@ namespace basalt::presenter::cmd_client {
|
||||
DATA_RECEIVED = 0x02, ///< Trainer -> Presenter
|
||||
ACTIVELY_STOP = 0x21, ///< Presenter-->Trainer
|
||||
STOP_REQUEST = 0X71, ///< Presenter<--Trainer
|
||||
STOP_RESPONSE = 0x72, //< Presenter-->Trainer
|
||||
STOP_RESPONSE = 0x72, ///< Presenter-->Trainer
|
||||
};
|
||||
|
||||
// Pixel kind values
|
||||
@@ -32,26 +32,26 @@ namespace basalt::presenter::cmd_client {
|
||||
#pragma pack(pop)
|
||||
|
||||
// Status
|
||||
enum class ClientStatus {
|
||||
enum class CmdClientStatus {
|
||||
Ready,
|
||||
Running,
|
||||
Stop,
|
||||
};
|
||||
|
||||
class CommandClient {
|
||||
class CmdClient {
|
||||
public:
|
||||
CommandClient();
|
||||
~CommandClient();
|
||||
CmdClient();
|
||||
~CmdClient();
|
||||
|
||||
public:
|
||||
// Wait for handshake from Trainer, send response with data properties
|
||||
HandshakePayload WaitHandshake();
|
||||
HandshakePayload wait_handshake();
|
||||
// Tick function called every frame to send data ready and wait for response
|
||||
bool Tick(bool actively_stop = false);
|
||||
bool tick(bool actively_stop = false);
|
||||
|
||||
private:
|
||||
Shared::PipeOperator m_PipeOperator;
|
||||
ClientStatus m_Status;
|
||||
shared::pipe_operator::PipeOperator m_PipeOperator;
|
||||
CmdClientStatus m_Status;
|
||||
};
|
||||
|
||||
} // namespace Basalt::Presenter
|
||||
} // namespace basalt::presenter::cmd_client
|
||||
@@ -50,4 +50,4 @@ namespace basalt::presenter::dll_loader {
|
||||
Handle m_Handle;
|
||||
};
|
||||
|
||||
} // namespace Basalt::Presenter
|
||||
} // namespace basalt::presenter::dll_loader
|
||||
|
||||
@@ -1,30 +1,32 @@
|
||||
#include "dll_loader.hpp"
|
||||
#include "command_client.hpp"
|
||||
#include "cmd_client.hpp"
|
||||
#include <basalt/char_types.hpp>
|
||||
#include <basalt/kernel.hpp>
|
||||
|
||||
namespace Presenter = ::Basalt::Presenter;
|
||||
namespace Kernel = ::Basalt::Shared::Kernel;
|
||||
namespace dll_loader = ::basalt::presenter::dll_loader;
|
||||
using dll_loader::DllKind;
|
||||
using dll_loader::DllLoader;
|
||||
|
||||
using ::basalt::presenter::cmd_client::CmdClient;
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
auto engine_dll = Presenter::DllLoader(Presenter::DllKind::Engine, BSTEXT("BasaltDirectX11Engine"));
|
||||
auto deliver_dll = Presenter::DllLoader(Presenter::DllKind::Deliver, BSTEXT("BasaltPipeDeliver"));
|
||||
auto engine_dll = DllLoader(DllKind::Engine, BSTEXT("BasaltDirectX11Engine"));
|
||||
auto deliver_dll = DllLoader(DllKind::Deliver, BSTEXT("BasaltPipeDeliver"));
|
||||
|
||||
auto client = Presenter::CommandClient();
|
||||
auto payload = client.WaitHandshake();
|
||||
auto client = CmdClient();
|
||||
auto payload = client.wait_handshake();
|
||||
|
||||
auto* engine = engine_dll.CreateInstance<Kernel::IEngine>();
|
||||
auto* deliver = deliver_dll.CreateInstance<Kernel::IDeliver>();
|
||||
//auto* engine = engine_dll.CreateInstance<Kernel::IEngine>();
|
||||
//auto* deliver = deliver_dll.CreateInstance<Kernel::IDeliver>();
|
||||
|
||||
Kernel::EngineConfig engine_config{.headless = false, .title = BSTEXT("Fuck You"), .width = payload.width, .height = payload.height};
|
||||
engine->Startup(std::move(engine_config));
|
||||
//Kernel::EngineConfig engine_config{.headless = false, .title = BSTEXT("Fuck You"), .width = payload.width, .height = payload.height};
|
||||
//engine->startup(std::move(engine_config));
|
||||
|
||||
while (true) {
|
||||
auto req_stop = engine->Tick();
|
||||
auto can_stop = client.Tick(req_stop);
|
||||
auto req_stop = false; //engine->tick();
|
||||
auto can_stop = client.tick(req_stop);
|
||||
if (can_stop) break;
|
||||
}
|
||||
|
||||
engine->Shutdown();
|
||||
engine_dll.DestroyInstance(engine);
|
||||
//engine->shutdown();
|
||||
//engine_dll.DestroyInstance(engine);
|
||||
}
|
||||
|
||||
@@ -5,23 +5,27 @@ namespace basalt::shared::deliver {
|
||||
|
||||
IDeliver::IDeliver() {}
|
||||
|
||||
IDeliver::~IDeliver() {}
|
||||
IDeliver::~IDeliver() {
|
||||
if (this->status != DeliverStatus::Stop) {
|
||||
this->shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
guid::Guid IDeliver::GetGuid() const {
|
||||
guid::Guid IDeliver::get_guid() const {
|
||||
throw std::logic_error("unimplemented function");
|
||||
}
|
||||
|
||||
void IDeliver::Startup(DeliverConfig &&config) {
|
||||
void IDeliver::startup(DeliverConfig &&config) {
|
||||
if (this->status != DeliverStatus::Ready) throw std::runtime_error("unexpected deliver status");
|
||||
this->config = std::move(config);
|
||||
this->status = DeliverStatus::Running;
|
||||
}
|
||||
|
||||
void IDeliver::Transmit() {
|
||||
void IDeliver::transmit() {
|
||||
if (this->status != DeliverStatus::Running) throw std::runtime_error("unexpected deliver status");
|
||||
}
|
||||
|
||||
void IDeliver::Shutdown() {
|
||||
void IDeliver::shutdown() {
|
||||
if (this->status != DeliverStatus::Running) throw std::runtime_error("unexpected deliver status");
|
||||
this->status = DeliverStatus::Stop;
|
||||
}
|
||||
|
||||
@@ -19,10 +19,10 @@ namespace basalt::shared::deliver {
|
||||
virtual ~IDeliver();
|
||||
|
||||
public:
|
||||
virtual guid::Guid GetGuid() const;
|
||||
virtual void Startup(DeliverConfig&& config);
|
||||
virtual void Transmit();
|
||||
virtual void Shutdown();
|
||||
virtual guid::Guid get_guid() const;
|
||||
virtual void startup(DeliverConfig&& config);
|
||||
virtual void transmit();
|
||||
virtual void shutdown();
|
||||
|
||||
protected:
|
||||
DeliverConfig config;
|
||||
|
||||
@@ -7,26 +7,26 @@ namespace basalt::shared::engine {
|
||||
|
||||
IEngine::~IEngine() {
|
||||
if (this->status != EngineStatus::Stop) {
|
||||
this->Shutdown();
|
||||
this->shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
guid::Guid IEngine::GetGuid() const {
|
||||
guid::Guid IEngine::get_guid() const {
|
||||
throw std::logic_error("unimplemented function");
|
||||
}
|
||||
|
||||
void IEngine::Startup(EngineConfig &&config) {
|
||||
void IEngine::startup(EngineConfig &&config) {
|
||||
if (this->status != EngineStatus::Ready) throw std::runtime_error("unexpected engine status");
|
||||
this->config = std::move(config);
|
||||
this->status = EngineStatus::Running;
|
||||
}
|
||||
|
||||
bool IEngine::Tick() {
|
||||
bool IEngine::tick() {
|
||||
if (this->status != EngineStatus::Running) throw std::runtime_error("unexpected engine status");
|
||||
return false;
|
||||
}
|
||||
|
||||
void IEngine::Shutdown() {
|
||||
void IEngine::shutdown() {
|
||||
if (this->status != EngineStatus::Running) throw std::runtime_error("unexpected engine status");
|
||||
this->status = EngineStatus::Stop;
|
||||
}
|
||||
|
||||
@@ -24,14 +24,14 @@ namespace basalt::shared::engine {
|
||||
virtual ~IEngine();
|
||||
|
||||
public:
|
||||
virtual guid::Guid GetGuid() const;
|
||||
virtual void Startup(EngineConfig&& config);
|
||||
virtual guid::Guid get_guid() const;
|
||||
virtual void startup(EngineConfig&& config);
|
||||
/**
|
||||
* @brief
|
||||
* @return True for active exit.
|
||||
*/
|
||||
virtual bool Tick();
|
||||
virtual void Shutdown();
|
||||
virtual bool tick();
|
||||
virtual void shutdown();
|
||||
|
||||
protected:
|
||||
EngineConfig config;
|
||||
|
||||
@@ -78,7 +78,7 @@ namespace basalt::shared::pipe_operator {
|
||||
return *this;
|
||||
}
|
||||
|
||||
void PipeOperator::Read(void *buffer, size_t size) {
|
||||
void PipeOperator::read(void *buffer, size_t size) {
|
||||
if (size == 0) {
|
||||
return; // 读取0字节直接返回
|
||||
}
|
||||
@@ -124,7 +124,7 @@ namespace basalt::shared::pipe_operator {
|
||||
#endif
|
||||
}
|
||||
|
||||
void PipeOperator::Write(const void *buffer, size_t size) {
|
||||
void PipeOperator::write(const void *buffer, size_t size) {
|
||||
if (size == 0) {
|
||||
return; // 写入0字节直接返回
|
||||
}
|
||||
|
||||
@@ -32,26 +32,26 @@ namespace basalt::shared::pipe_operator {
|
||||
PipeOperator& operator=(PipeOperator&& other) noexcept;
|
||||
|
||||
public:
|
||||
void Read(void* buffer, size_t size);
|
||||
void Write(const void* buffer, size_t size);
|
||||
void read(void* buffer, size_t size);
|
||||
void write(const void* buffer, size_t size);
|
||||
|
||||
template<typename TPod>
|
||||
void ReadPod(TPod& buffer) {
|
||||
Read(&buffer, sizeof(TPod));
|
||||
void read_pod(TPod& buffer) {
|
||||
read(&buffer, sizeof(TPod));
|
||||
}
|
||||
template<typename TPod>
|
||||
void WritePod(const TPod& buffer) {
|
||||
Write(&buffer, sizeof(TPod));
|
||||
void write_pod(const TPod& buffer) {
|
||||
write(&buffer, sizeof(TPod));
|
||||
}
|
||||
void ReadString(std::string& buffer) {
|
||||
void read_string(std::string& buffer) {
|
||||
size_t length = 0;
|
||||
ReadPod(length);
|
||||
read_pod(length);
|
||||
buffer.resize(length);
|
||||
Read(buffer.data(), length);
|
||||
read(buffer.data(), length);
|
||||
}
|
||||
void WriteString(std::string_view& buffer) {
|
||||
WritePod(buffer.size());
|
||||
Write(buffer.data(), buffer.size());
|
||||
void write_string(std::string_view& buffer) {
|
||||
write_pod(buffer.size());
|
||||
write(buffer.data(), buffer.size());
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -40,7 +40,7 @@ CODE_PACKER: struct.Struct = struct.Struct("=B")
|
||||
HANDSHAKE_REQUEST_PACKER: struct.Struct = struct.Struct("=BII")
|
||||
|
||||
|
||||
class CommandServer:
|
||||
class CmdServer:
|
||||
"""
|
||||
Command server implementation for the Trainer side according to the protocol.
|
||||
"""
|
||||
@@ -1,4 +1,4 @@
|
||||
from command_server import CommandServer, HandshakePayload, PixelKind
|
||||
from cmd_server import CmdServer, HandshakePayload, PixelKind
|
||||
from while_stopper import WhileStopper
|
||||
import logging
|
||||
import signal
|
||||
@@ -9,7 +9,7 @@ def receive_data() -> None:
|
||||
|
||||
|
||||
def main():
|
||||
server = CommandServer()
|
||||
server = CmdServer()
|
||||
|
||||
print('Please launch BasaltPresenter now.')
|
||||
print('Then press Enter to continue...')
|
||||
|
||||
Reference in New Issue
Block a user