diff --git a/AppleWin-VS2022.vcxproj b/AppleWin-VS2022.vcxproj index 090328646..0eabce316 100644 --- a/AppleWin-VS2022.vcxproj +++ b/AppleWin-VS2022.vcxproj @@ -34,7 +34,6 @@ - @@ -195,9 +194,6 @@ NotUsing - - NotUsing - NotUsing diff --git a/AppleWin-VS2022.vcxproj.filters b/AppleWin-VS2022.vcxproj.filters index 30b5de531..1f0f7bc67 100644 --- a/AppleWin-VS2022.vcxproj.filters +++ b/AppleWin-VS2022.vcxproj.filters @@ -282,7 +282,6 @@ - @@ -647,7 +646,6 @@ - diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 6223dd4f4..8b803b83f 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -137,7 +137,6 @@ set(SOURCE_FILES devrelay/commands/Open.cpp devrelay/commands/ReadBlock.cpp devrelay/commands/Read.cpp - devrelay/commands/Reset.cpp devrelay/commands/Status.cpp devrelay/commands/WriteBlock.cpp devrelay/commands/Write.cpp @@ -255,7 +254,6 @@ set(HEADER_FILES devrelay/commands/Open.h devrelay/commands/ReadBlock.h devrelay/commands/Read.h - devrelay/commands/Reset.h devrelay/commands/Status.h devrelay/commands/WriteBlock.h devrelay/commands/Write.h diff --git a/source/SmartPortOverSlip.cpp b/source/SmartPortOverSlip.cpp index c9b783253..d47a8109a 100644 --- a/source/SmartPortOverSlip.cpp +++ b/source/SmartPortOverSlip.cpp @@ -45,7 +45,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "devrelay/commands/Open.h" #include "devrelay/commands/ReadBlock.h" #include "devrelay/commands/Read.h" -#include "devrelay/commands/Reset.h" #include "devrelay/commands/Status.h" #include "devrelay/commands/WriteBlock.h" #include "devrelay/commands/Write.h" @@ -70,7 +69,6 @@ SmartPortOverSlip::SmartPortOverSlip(const UINT slot) : Card(CT_SmartPortOverSli active_instances++; LogFileOutput("SmartPortOverSlip ctor, slot: %d\n", slot); - // SmartPortOverSlip::Reset(true); } SmartPortOverSlip::~SmartPortOverSlip() @@ -82,15 +80,6 @@ SmartPortOverSlip::~SmartPortOverSlip() void SmartPortOverSlip::Reset(const bool powerCycle) { LogFileOutput("SmartPortOverSlip Bridge Initialization, reset called\n"); - if (powerCycle) - { - // send RESET to all devices - const auto connections = GetCommandListener().get_all_connections(); - for (const auto &id_and_connection : connections) - { - reset(id_and_connection.first, id_and_connection.second); - } - } } void SmartPortOverSlip::handle_smartport_call() @@ -146,38 +135,35 @@ void SmartPortOverSlip::handle_smartport_call() break; case CMD_READ_BLOCK: // TODO: fix the fact params_loc has changed from +4 to +2 - read_block(device_id, connection, sp_payload_loc, params_loc + 2); + read_block(device_id, connection, sp_payload_loc, param_count, params_loc + 2); break; case CMD_WRITE_BLOCK: // TODO: fix the fact params_loc has changed from +4 to +2 - write_block(device_id, connection, sp_payload_loc, params_loc + 2); + write_block(device_id, connection, sp_payload_loc, param_count, params_loc + 2); break; case CMD_FORMAT: - format(device_id, connection); + format(device_id, connection, param_count); break; case CMD_CONTROL: // TODO: fix the fact params_loc has changed from +4 to +2 control(device_id, connection, sp_payload_loc, param_count, params_loc); break; case CMD_INIT: - init(device_id, connection); + init(device_id, connection, param_count); break; case CMD_OPEN: - open(device_id, connection); + open(device_id, connection, param_count); break; case CMD_CLOSE: - close(device_id, connection); + close(device_id, connection, param_count); break; case CMD_READ: // TODO: fix the fact params_loc has changed from +4 to +2 - read(device_id, connection, sp_payload_loc, params_loc + 2); + read(device_id, connection, sp_payload_loc, param_count, params_loc + 2); break; case CMD_WRITE: // TODO: fix the fact params_loc has changed from +4 to +2 - write(device_id, connection, sp_payload_loc, params_loc + 2); - break; - case CMD_RESET: - reset(device_id, connection); + write(device_id, connection, sp_payload_loc, param_count, params_loc + 2); break; default: break; @@ -334,7 +320,7 @@ void SmartPortOverSlip::handle_prodos_read(uint8_t drive_num, std::pair(std::move(response)); } -void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const WORD params_loc) +void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc) { - ReadRequest request(Requestor::next_request_number(), unit_number); + ReadRequest request(Requestor::next_request_number(), params_count, unit_number); request.set_byte_count_from_ptr(mem, params_loc); request.set_address_from_ptr(mem, params_loc + 2); // move along by byte_count size. would be better to get its size rather than hard code it here. auto response = Requestor::send_request(request, connection); @@ -472,9 +458,9 @@ void SmartPortOverSlip::read(const BYTE unit_number, Connection *connection, con }); } -void SmartPortOverSlip::write(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const WORD params_loc) +void SmartPortOverSlip::write(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc) { - WriteRequest request(Requestor::next_request_number(), unit_number); + WriteRequest request(Requestor::next_request_number(), params_count, unit_number); request.set_byte_count_from_ptr(mem, params_loc); request.set_address_from_ptr(mem, params_loc + 2); // move along by byte_count size. would be better to get its size rather than hard code it here. const auto byte_count = request.get_byte_count(); @@ -489,7 +475,7 @@ void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection { const BYTE status_code = mem[params_loc + 2]; const BYTE network_unit = params_count > 3 ? mem[params_loc + 3] : 0; - auto response = status(unit_number, connection, status_code, network_unit); + auto response = status(unit_number, connection, params_count, status_code, network_unit); handle_response(std::move(response), [sp_payload_loc](const StatusResponse *sr) { const auto response_size = sr->get_data().size(); memcpy(mem + sp_payload_loc, sr->get_data().data(), response_size); @@ -506,16 +492,16 @@ void SmartPortOverSlip::status_sp(const BYTE unit_number, Connection *connection }); } -std::unique_ptr SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit) +std::unique_ptr SmartPortOverSlip::status(const BYTE unit_number, Connection *connection, const BYTE params_count, const BYTE status_code, const BYTE network_unit) { // see https://www.1000bit.it/support/manuali/apple/technotes/smpt/tn.smpt.2.html - const StatusRequest request(Requestor::next_request_number(), unit_number, status_code, network_unit); + const StatusRequest request(Requestor::next_request_number(), params_count, unit_number, status_code, network_unit); return Requestor::send_request(request, connection); } std::unique_ptr SmartPortOverSlip::status_pd(const BYTE unit_number, Connection *connection, const BYTE status_code) { - auto response = status(unit_number, connection, status_code, 0); + auto response = status(unit_number, connection, status_code, 3, 0); // Cast the Response to a StatusResponse. We need to release ownership. As ChatGPT explains: /* @@ -534,42 +520,35 @@ void SmartPortOverSlip::control(const BYTE unit_number, Connection *connection, uint8_t *start_ptr = &mem[sp_payload_loc]; std::vector payload(start_ptr, start_ptr + length); - const ControlRequest request(Requestor::next_request_number(), unit_number, control_code, network_unit, payload); + const ControlRequest request(Requestor::next_request_number(), params_count, unit_number, control_code, network_unit, payload); auto response = Requestor::send_request(request, connection); handle_simple_response(std::move(response)); } -void SmartPortOverSlip::init(const BYTE unit_number, Connection *connection) +void SmartPortOverSlip::init(const BYTE unit_number, Connection *connection, const BYTE params_count) { - const InitRequest request(Requestor::next_request_number(), unit_number); + const InitRequest request(Requestor::next_request_number(), params_count, unit_number); auto response = Requestor::send_request(request, connection); handle_simple_response(std::move(response)); } -void SmartPortOverSlip::open(const BYTE unit_number, Connection *connection) +void SmartPortOverSlip::open(const BYTE unit_number, Connection *connection, const BYTE params_count) { - const OpenRequest request(Requestor::next_request_number(), unit_number); + const OpenRequest request(Requestor::next_request_number(), params_count, unit_number); auto response = Requestor::send_request(request, connection); handle_simple_response(std::move(response)); } -void SmartPortOverSlip::close(const BYTE unit_number, Connection *connection) +void SmartPortOverSlip::close(const BYTE unit_number, Connection *connection, const BYTE params_count) { - const CloseRequest request(Requestor::next_request_number(), unit_number); + const CloseRequest request(Requestor::next_request_number(), params_count, unit_number); auto response = Requestor::send_request(request, connection); handle_simple_response(std::move(response)); } -void SmartPortOverSlip::reset(const BYTE unit_number, Connection *connection) -{ - const ResetRequest request(Requestor::next_request_number(), unit_number); - auto response = Requestor::send_request(request, connection); - handle_simple_response(std::move(response)); -} - -void SmartPortOverSlip::format(const BYTE unit_number, Connection *connection) +void SmartPortOverSlip::format(const BYTE unit_number, Connection *connection, const BYTE params_count) { - const FormatRequest request(Requestor::next_request_number(), unit_number); + const FormatRequest request(Requestor::next_request_number(), params_count, unit_number); auto response = Requestor::send_request(request, connection); handle_simple_response(std::move(response)); } diff --git a/source/SmartPortOverSlip.h b/source/SmartPortOverSlip.h index c30af6977..008a3cdb2 100644 --- a/source/SmartPortOverSlip.h +++ b/source/SmartPortOverSlip.h @@ -32,20 +32,20 @@ class SmartPortOverSlip : public Card static void device_count(WORD sp_payload_loc); void handle_smartport_call(); void handle_prodos_call(); - void control(BYTE unit_number, Connection *connection, WORD sp_payload_loc, const BYTE params_count, const WORD params_loc); - void init(BYTE unit_number, Connection *connection); - void open(BYTE unit_number, Connection *connection); - void close(BYTE unit_number, Connection *connection); - void format(BYTE unit_number, Connection *connection); - void reset(BYTE unit_number, Connection *connection); - void read_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc); - void write_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc); - void read(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc); - void write(BYTE unit_number, Connection *connection, WORD sp_payload_loc, WORD params_loc); - - std::unique_ptr status(BYTE unit_number, Connection *connection, const BYTE status_code, const BYTE network_unit); - std::unique_ptr status_pd(const BYTE unit_number, Connection *connection, const BYTE status_code); - void status_sp(const BYTE unit_number, Connection *connection, const WORD sp_payload_loc, const BYTE params_count, const WORD params_loc); + void control(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); + void init(BYTE unit_number, Connection *connection, BYTE params_count); + void open(BYTE unit_number, Connection *connection, BYTE params_count); + void close(BYTE unit_number, Connection *connection, BYTE params_count); + void format(BYTE unit_number, Connection *connection, BYTE params_count); + void reset(BYTE unit_number, Connection *connection, BYTE params_count); + void read_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); + void write_block(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); + void read(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); + void write(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); + + std::unique_ptr status(BYTE unit_number, Connection *connection, BYTE params_count, BYTE status_code, BYTE network_unit); + std::unique_ptr status_pd(BYTE unit_number, Connection *connection, BYTE status_code); + void status_sp(BYTE unit_number, Connection *connection, WORD sp_payload_loc, BYTE params_count, WORD params_loc); void handle_prodos_status(uint8_t drive_num, std::pair disk_devices); void handle_prodos_read(uint8_t drive_num, std::pair disk_devices); diff --git a/source/devrelay/commands/Close.cpp b/source/devrelay/commands/Close.cpp index 9d990af40..71dcc3fdd 100644 --- a/source/devrelay/commands/Close.cpp +++ b/source/devrelay/commands/Close.cpp @@ -3,14 +3,16 @@ #include #include "Close.h" -CloseRequest::CloseRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_CLOSE, device_id) {} +CloseRequest::CloseRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_CLOSE, param_count, device_id) {} std::vector CloseRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Close.h b/source/devrelay/commands/Close.h index 4e179b87a..bb41691d8 100644 --- a/source/devrelay/commands/Close.h +++ b/source/devrelay/commands/Close.h @@ -9,7 +9,7 @@ class CloseRequest : public Request { public: - CloseRequest(uint8_t request_sequence_number, uint8_t device_id); + CloseRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; void create_command(uint8_t* output_data) const override; diff --git a/source/devrelay/commands/Control.cpp b/source/devrelay/commands/Control.cpp index 1b39307ca..f6d1d1eef 100644 --- a/source/devrelay/commands/Control.cpp +++ b/source/devrelay/commands/Control.cpp @@ -3,8 +3,8 @@ #include #include "Control.h" -ControlRequest::ControlRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector &data) - : Request(request_sequence_number, CMD_CONTROL, device_id), control_code_(control_code), network_unit_(network_unit), data_(std::move(data)) +ControlRequest::ControlRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector &data) + : Request(request_sequence_number, CMD_CONTROL, param_count, device_id), control_code_(control_code), network_unit_(network_unit), data_(std::move(data)) { } @@ -13,9 +13,12 @@ std::vector ControlRequest::serialize() const std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.push_back(this->get_control_code()); request_data.push_back(this->get_network_unit()); + request_data.resize(11); request_data.insert(request_data.end(), get_data().begin(), get_data().end()); return request_data; } diff --git a/source/devrelay/commands/Control.h b/source/devrelay/commands/Control.h index c4cf25dc3..95fc0d71e 100644 --- a/source/devrelay/commands/Control.h +++ b/source/devrelay/commands/Control.h @@ -9,7 +9,7 @@ class ControlRequest : public Request { public: - ControlRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector &data); + ControlRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id, const uint8_t control_code, const uint8_t network_unit, std::vector &data); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; diff --git a/source/devrelay/commands/Format.cpp b/source/devrelay/commands/Format.cpp index 06a8929f2..8935491d9 100644 --- a/source/devrelay/commands/Format.cpp +++ b/source/devrelay/commands/Format.cpp @@ -3,14 +3,16 @@ #include #include "Format.h" -FormatRequest::FormatRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_FORMAT, device_id) {} +FormatRequest::FormatRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_FORMAT, param_count, device_id) {} std::vector FormatRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Format.h b/source/devrelay/commands/Format.h index ca3f24ed8..1b56e38d2 100644 --- a/source/devrelay/commands/Format.h +++ b/source/devrelay/commands/Format.h @@ -9,7 +9,7 @@ class FormatRequest : public Request { public: - FormatRequest(const uint8_t request_sequence_number, const uint8_t device_id); + FormatRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; void create_command(uint8_t* output_data) const override; diff --git a/source/devrelay/commands/Init.cpp b/source/devrelay/commands/Init.cpp index 071c21ce8..278b8cf0a 100644 --- a/source/devrelay/commands/Init.cpp +++ b/source/devrelay/commands/Init.cpp @@ -3,14 +3,16 @@ #include #include "Init.h" -InitRequest::InitRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_INIT, device_id) {} +InitRequest::InitRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_INIT, param_count, device_id) {} std::vector InitRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Init.h b/source/devrelay/commands/Init.h index b8b17e818..4a6b8b1dd 100644 --- a/source/devrelay/commands/Init.h +++ b/source/devrelay/commands/Init.h @@ -9,7 +9,7 @@ class InitRequest : public Request { public: - InitRequest(uint8_t request_sequence_number, uint8_t device_id); + InitRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; void create_command(uint8_t* output_data) const override; diff --git a/source/devrelay/commands/Open.cpp b/source/devrelay/commands/Open.cpp index bf8a39fc0..90d35be01 100644 --- a/source/devrelay/commands/Open.cpp +++ b/source/devrelay/commands/Open.cpp @@ -3,14 +3,16 @@ #include #include "Open.h" -OpenRequest::OpenRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_OPEN, device_id) {} +OpenRequest::OpenRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_OPEN, param_count, device_id) {} std::vector OpenRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Open.h b/source/devrelay/commands/Open.h index 25685464a..e56eaeb6b 100644 --- a/source/devrelay/commands/Open.h +++ b/source/devrelay/commands/Open.h @@ -9,7 +9,7 @@ class OpenRequest : public Request { public: - OpenRequest(uint8_t request_sequence_number, uint8_t device_id); + OpenRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; void create_command(uint8_t* output_data) const override; diff --git a/source/devrelay/commands/Read.cpp b/source/devrelay/commands/Read.cpp index 72b7ab02f..0155a05ff 100644 --- a/source/devrelay/commands/Read.cpp +++ b/source/devrelay/commands/Read.cpp @@ -3,16 +3,19 @@ #include #include "Read.h" -ReadRequest::ReadRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_READ, device_id), byte_count_(), address_() {} +ReadRequest::ReadRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_READ, param_count, device_id), byte_count_(), address_() {} std::vector ReadRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.insert(request_data.end(), get_byte_count().begin(), get_byte_count().end()); request_data.insert(request_data.end(), get_address().begin(), get_address().end()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Read.h b/source/devrelay/commands/Read.h index 8a0b64ff7..dea481f75 100644 --- a/source/devrelay/commands/Read.h +++ b/source/devrelay/commands/Read.h @@ -12,7 +12,7 @@ class ReadRequest : public Request { public: - ReadRequest(uint8_t request_sequence_number, uint8_t device_id); + ReadRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; diff --git a/source/devrelay/commands/ReadBlock.cpp b/source/devrelay/commands/ReadBlock.cpp index 326329e1d..2e51a38a0 100644 --- a/source/devrelay/commands/ReadBlock.cpp +++ b/source/devrelay/commands/ReadBlock.cpp @@ -3,15 +3,18 @@ #include "ReadBlock.h" #include -ReadBlockRequest::ReadBlockRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_READ_BLOCK, device_id), block_number_{} {} +ReadBlockRequest::ReadBlockRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_READ_BLOCK, param_count, device_id), block_number_{} {} std::vector ReadBlockRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.insert(request_data.end(), block_number_.begin(), block_number_.end()); + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/ReadBlock.h b/source/devrelay/commands/ReadBlock.h index 6561f88f2..01e00f40a 100644 --- a/source/devrelay/commands/ReadBlock.h +++ b/source/devrelay/commands/ReadBlock.h @@ -11,7 +11,7 @@ class ReadBlockRequest : public Request { public: - ReadBlockRequest(uint8_t request_sequence_number, uint8_t device_id); + ReadBlockRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; const std::array &get_block_number() const; diff --git a/source/devrelay/commands/Reset.cpp b/source/devrelay/commands/Reset.cpp deleted file mode 100644 index 85ef963c1..000000000 --- a/source/devrelay/commands/Reset.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifdef DEV_RELAY_SLIP - -#include -#include "Reset.h" - -ResetRequest::ResetRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_RESET, device_id) {} - -std::vector ResetRequest::serialize() const -{ - std::vector request_data; - request_data.push_back(this->get_request_sequence_number()); - request_data.push_back(this->get_command_number()); - request_data.push_back(this->get_device_id()); - return request_data; -} - -std::unique_ptr ResetRequest::deserialize(const std::vector &data) const -{ - if (data.size() < 2) - { - std::cerr << "Not enough data to deserialize ResetResponse" << std::endl; - return nullptr; - } - - auto response = std::make_unique(data[0], data[1]); - return response; -} - -void ResetRequest::create_command(uint8_t* cmd_data) const -{ - init_command(cmd_data); -} - -std::unique_ptr ResetRequest::create_response(uint8_t source, uint8_t status, const uint8_t* data, uint16_t num) const -{ - std::unique_ptr response = std::make_unique(get_request_sequence_number(), status); - return response; -} - -ResetResponse::ResetResponse(const uint8_t request_sequence_number, const uint8_t status) : Response(request_sequence_number, status) {} - -std::vector ResetResponse::serialize() const -{ - std::vector data; - data.push_back(this->get_request_sequence_number()); - data.push_back(this->get_status()); - return data; -} - - -#endif diff --git a/source/devrelay/commands/Reset.h b/source/devrelay/commands/Reset.h deleted file mode 100644 index 51e532a0f..000000000 --- a/source/devrelay/commands/Reset.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include - -#include "../types/Request.h" -#include "../types/Response.h" - -class ResetRequest : public Request -{ -public: - ResetRequest(uint8_t request_sequence_number, uint8_t device_id); - std::vector serialize() const override; - std::unique_ptr deserialize(const std::vector &data) const override; - void create_command(uint8_t* output_data) const override; - void copy_payload(uint8_t* data) const override {} - size_t payload_size() const override { return 0; }; - std::unique_ptr create_response(uint8_t source, uint8_t status, const uint8_t* data, uint16_t num) const override; -}; - -class ResetResponse : public Response -{ -public: - explicit ResetResponse(uint8_t request_sequence_number, uint8_t status); - std::vector serialize() const override; -}; diff --git a/source/devrelay/commands/Status.cpp b/source/devrelay/commands/Status.cpp index 52eaf008a..b6a5b4cfc 100644 --- a/source/devrelay/commands/Status.cpp +++ b/source/devrelay/commands/Status.cpp @@ -5,7 +5,7 @@ #include "Status.h" -StatusRequest::StatusRequest(const uint8_t request_sequence_number, const uint8_t device_id, const uint8_t status_code, const uint8_t network_unit) : Request(request_sequence_number, CMD_STATUS, device_id), status_code_(status_code), network_unit_(network_unit) +StatusRequest::StatusRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id, const uint8_t status_code, const uint8_t network_unit) : Request(request_sequence_number, CMD_STATUS, param_count, device_id), status_code_(status_code), network_unit_(network_unit) { } @@ -14,10 +14,12 @@ std::vector StatusRequest::serialize() const std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.push_back(this->get_status_code()); request_data.push_back(this->get_network_unit()); - + request_data.resize(11); return request_data; } diff --git a/source/devrelay/commands/Status.h b/source/devrelay/commands/Status.h index ebaa33af8..b012b1f9b 100644 --- a/source/devrelay/commands/Status.h +++ b/source/devrelay/commands/Status.h @@ -9,7 +9,7 @@ class StatusRequest : public Request { public: - StatusRequest(uint8_t request_sequence_number, uint8_t device_id, uint8_t status_code, uint8_t network_unit); + StatusRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id, uint8_t status_code, uint8_t network_unit); virtual std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; diff --git a/source/devrelay/commands/Write.cpp b/source/devrelay/commands/Write.cpp index 68599238c..0fa5a9ecf 100644 --- a/source/devrelay/commands/Write.cpp +++ b/source/devrelay/commands/Write.cpp @@ -3,16 +3,19 @@ #include #include "Write.h" -WriteRequest::WriteRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_WRITE, device_id), byte_count_(), address_() {} +WriteRequest::WriteRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_WRITE, param_count, device_id), byte_count_(), address_() {} std::vector WriteRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.insert(request_data.end(), get_byte_count().begin(), get_byte_count().end()); request_data.insert(request_data.end(), get_address().begin(), get_address().end()); + request_data.resize(11); request_data.insert(request_data.end(), get_data().begin(), get_data().end()); return request_data; } diff --git a/source/devrelay/commands/Write.h b/source/devrelay/commands/Write.h index a114959c4..3432256ee 100644 --- a/source/devrelay/commands/Write.h +++ b/source/devrelay/commands/Write.h @@ -11,7 +11,7 @@ class WriteRequest : public Request { public: - WriteRequest(const uint8_t request_sequence_number, const uint8_t device_id); + WriteRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; diff --git a/source/devrelay/commands/WriteBlock.cpp b/source/devrelay/commands/WriteBlock.cpp index a76d8d962..59b21a4b5 100644 --- a/source/devrelay/commands/WriteBlock.cpp +++ b/source/devrelay/commands/WriteBlock.cpp @@ -4,17 +4,19 @@ #include #include "WriteBlock.h" -WriteBlockRequest::WriteBlockRequest(const uint8_t request_sequence_number, const uint8_t device_id) : Request(request_sequence_number, CMD_WRITE_BLOCK, device_id), block_number_{}, block_data_{} {} +WriteBlockRequest::WriteBlockRequest(const uint8_t request_sequence_number, const uint8_t param_count, const uint8_t device_id) : Request(request_sequence_number, CMD_WRITE_BLOCK, param_count, device_id), block_number_{}, block_data_{} {} std::vector WriteBlockRequest::serialize() const { std::vector request_data; request_data.push_back(this->get_request_sequence_number()); request_data.push_back(this->get_command_number()); + request_data.push_back(this->get_param_count()); request_data.push_back(this->get_device_id()); + request_data.resize(6); request_data.insert(request_data.end(), block_number_.begin(), block_number_.end()); + request_data.resize(11); request_data.insert(request_data.end(), block_data_.begin(), block_data_.end()); - return request_data; } diff --git a/source/devrelay/commands/WriteBlock.h b/source/devrelay/commands/WriteBlock.h index 7c5b6ede6..00951b893 100644 --- a/source/devrelay/commands/WriteBlock.h +++ b/source/devrelay/commands/WriteBlock.h @@ -11,7 +11,7 @@ class WriteBlockRequest : public Request { public: - WriteBlockRequest(uint8_t request_sequence_number, uint8_t device_id); + WriteBlockRequest(uint8_t request_sequence_number, uint8_t param_count, uint8_t device_id); std::vector serialize() const override; std::unique_ptr deserialize(const std::vector &data) const override; const std::array &get_block_number() const; diff --git a/source/devrelay/service/Listener.cpp b/source/devrelay/service/Listener.cpp index 822fc7634..69b641ebf 100644 --- a/source/devrelay/service/Listener.cpp +++ b/source/devrelay/service/Listener.cpp @@ -195,7 +195,7 @@ void Listener::create_connection(unsigned int socket) while (still_scanning && connection_info_map_.size() < 254) { LogFileOutput("SmartPortOverSlip listener sending request for device_id: %d\n", device_id); - InitRequest request(Requestor::next_request_number(), device_id); + InitRequest request(Requestor::next_request_number(), 1, device_id); const auto response = Requestor::send_request(request, conn.get()); const auto init_response = dynamic_cast(response.get()); if (init_response == nullptr) @@ -294,7 +294,7 @@ std::pair Listener::first_two_disk_devices(std::function response = Requestor::send_request(request, id_and_connection.second); diff --git a/source/devrelay/types/Command.h b/source/devrelay/types/Command.h index 9167f66ba..09a691169 100644 --- a/source/devrelay/types/Command.h +++ b/source/devrelay/types/Command.h @@ -14,8 +14,7 @@ enum CMD_OPEN = 6, CMD_CLOSE = 7, CMD_READ = 8, - CMD_WRITE = 9, - CMD_RESET = 10 + CMD_WRITE = 9 }; class Command diff --git a/source/devrelay/types/Request.cpp b/source/devrelay/types/Request.cpp index 2ef756fa4..df2adb810 100644 --- a/source/devrelay/types/Request.cpp +++ b/source/devrelay/types/Request.cpp @@ -11,15 +11,16 @@ #include "../commands/Open.h" #include "../commands/Read.h" #include "../commands/ReadBlock.h" -#include "../commands/Reset.h" #include "../commands/Status.h" #include "../commands/Write.h" #include "../commands/WriteBlock.h" -Request::Request(const uint8_t request_sequence_number, const uint8_t command_number, const uint8_t device_id) : Command(request_sequence_number), command_number_(command_number), device_id_(device_id) {} +Request::Request(const uint8_t request_sequence_number, const uint8_t command_number, const uint8_t param_count, const uint8_t device_id) : Command(request_sequence_number), command_number_(command_number), param_count_(param_count), device_id_(device_id) {} uint8_t Request::get_command_number() const { return command_number_; } +uint8_t Request::get_param_count() const { return param_count_; } + uint8_t Request::get_device_id() const { return device_id_; } // All Request subclasses when writing to the command data will first initialise it and set command value @@ -35,76 +36,69 @@ std::unique_ptr Request::from_packet(const std::vector& packet switch(command) { case CMD_STATUS: { - uint8_t network_unit = packet.size() > 4 ? packet[4] : 0; - request = std::make_unique(packet[0], packet[2], packet[3], network_unit); + request = std::make_unique(packet[0], packet[2], packet[3], packet[6], packet[7]); break; } case CMD_CONTROL: { - uint8_t network_unit = packet.size() > 4 ? packet[4] : 0; - // +7 = 3 for "header", 1 for control code, 1 for network unit, 2 for length bytes we need to skip - std::vector payload(packet.begin() + 7, packet.end()); - request = std::make_unique(packet[0], packet[2], packet[3], network_unit, payload); + // +2 for control list length bytes we need to skip + std::vector payload(packet.begin() + 11+2, packet.end()); + request = std::make_unique(packet[0], packet[2], packet[3], packet[6], packet[7], payload); break; } case CMD_READ_BLOCK: { - auto readBlockRequest = std::make_unique(packet[0], packet[2]); - readBlockRequest->set_block_number_from_ptr(packet.data(), 3); + auto readBlockRequest = std::make_unique(packet[0], packet[2], packet[3]); + readBlockRequest->set_block_number_from_ptr(packet.data(), 6); request = std::move(readBlockRequest); break; } case CMD_WRITE_BLOCK: { - auto writeBlockRequest = std::make_unique(packet[0], packet[2]); - writeBlockRequest->set_block_number_from_ptr(packet.data(), 3); - writeBlockRequest->set_block_data_from_ptr(packet.data(), 6); + auto writeBlockRequest = std::make_unique(packet[0], packet[2], packet[3]); + writeBlockRequest->set_block_number_from_ptr(packet.data(), 6); + writeBlockRequest->set_block_data_from_ptr(packet.data(), 11); request = std::move(writeBlockRequest); break; } case CMD_FORMAT: { - request = std::make_unique(packet[0], packet[2]); + request = std::make_unique(packet[0], packet[2], packet[3]); break; } case CMD_INIT: { - request = std::make_unique(packet[0], packet[2]); + request = std::make_unique(packet[0], packet[2], packet[3]); break; } case CMD_OPEN: { - request = std::make_unique(packet[0], packet[2]); + request = std::make_unique(packet[0], packet[2], packet[3]); break; } case CMD_CLOSE: { - request = std::make_unique(packet[0], packet[2]); + request = std::make_unique(packet[0], packet[2], packet[3]); break; } case CMD_READ: { - auto readRequest = std::make_unique(packet[0], packet[2]); - readRequest->set_byte_count_from_ptr(packet.data(), 3); - readRequest->set_address_from_ptr(packet.data(), 5); + auto readRequest = std::make_unique(packet[0], packet[2], packet[3]); + readRequest->set_byte_count_from_ptr(packet.data(), 6); + readRequest->set_address_from_ptr(packet.data(), 8); request = std::move(readRequest); break; } case CMD_WRITE: { - auto writeRequest = std::make_unique(packet[0], packet[2]); - writeRequest->set_byte_count_from_ptr(packet.data(), 3); - writeRequest->set_address_from_ptr(packet.data(), 5); - writeRequest->set_data_from_ptr(packet.data(), 8, packet.size() - 8); + auto writeRequest = std::make_unique(packet[0], packet[2], packet[3]); + writeRequest->set_byte_count_from_ptr(packet.data(), 6); + writeRequest->set_address_from_ptr(packet.data(), 8); + writeRequest->set_data_from_ptr(packet.data(), 11, packet.size() - 11); request = std::move(writeRequest); break; } - case CMD_RESET: { - request = std::make_unique(packet[0], packet[2]); - break; - } - default: { std::ostringstream oss; oss << "Unknown command: %d" << command; diff --git a/source/devrelay/types/Request.h b/source/devrelay/types/Request.h index e623cc39b..d4b033b86 100644 --- a/source/devrelay/types/Request.h +++ b/source/devrelay/types/Request.h @@ -13,12 +13,13 @@ class Response; class Request : public Command { public: - Request(const uint8_t request_sequence_number, const uint8_t command_number, const uint8_t device_id); + Request(const uint8_t request_sequence_number, const uint8_t command_number, const uint8_t param_count, const uint8_t device_id); std::vector serialize() const override = 0; virtual std::unique_ptr deserialize(const std::vector &data) const = 0; uint8_t get_command_number() const; + uint8_t get_param_count() const; uint8_t get_device_id() const; // Create the subclass specific Request type from the packet data @@ -37,5 +38,6 @@ class Request : public Command private: uint8_t command_number_ = 0; + uint8_t param_count_ = 0; uint8_t device_id_ = 0; };