diff --git a/rdm/controller.cpp b/rdm/controller.cpp index a3dd042..6178f26 100644 --- a/rdm/controller.cpp +++ b/rdm/controller.cpp @@ -50,7 +50,7 @@ Controller::~Controller() * @brief Controller::rxDiscoveryResponse * @param message */ -void Controller::rxDiscoveryResponse(__attribute__((unused)) const Message* message) +void Controller::rxDiscoveryResponse(__attribute__((unused)) const MsgPtr message) { } @@ -60,7 +60,7 @@ void Controller::rxDiscoveryResponse(__attribute__((unused)) const Message* mess * @brief Controller::rxGetResponse * @param message */ -void Controller::rxGetResponse(__attribute__((unused)) const Message* message) +void Controller::rxGetResponse(__attribute__((unused)) const MsgPtr message) { } @@ -70,7 +70,7 @@ void Controller::rxGetResponse(__attribute__((unused)) const Message* message) * @brief Controller::rxSetResponse * @param message */ -void Controller::rxSetResponse(__attribute__((unused)) const Message* message) +void Controller::rxSetResponse(__attribute__((unused)) const MsgPtr message) { } diff --git a/rdm/controller.h b/rdm/controller.h index 7c8a71a..4f5c105 100644 --- a/rdm/controller.h +++ b/rdm/controller.h @@ -39,9 +39,9 @@ public: ~Controller(); protected: - virtual void rxDiscoveryResponse(const Message* message); - virtual void rxGetResponse(const Message* message); - virtual void rxSetResponse(const Message* message); + virtual void rxDiscoveryResponse(const MsgPtr message); + virtual void rxGetResponse(const MsgPtr message); + virtual void rxSetResponse(const MsgPtr message); private: uint8_t next_transaction_; diff --git a/rdm/device.cpp b/rdm/device.cpp index f8969e0..5599272 100644 --- a/rdm/device.cpp +++ b/rdm/device.cpp @@ -263,7 +263,7 @@ void Device::addProductDetailId(uint16_t id) * @param message * @param response */ -void Device::get(const Message *message, Message *response) +void Device::get(const MsgPtr message, MsgPtr response) { if (!actionPrep_(message, response)) return; @@ -276,7 +276,7 @@ void Device::get(const Message *message, Message *response) * @param message * @param response */ -void Device::set(const Message *message, Message *response) +void Device::set(const MsgPtr message, MsgPtr response) { if (!actionPrep_(message, response)) return; @@ -288,7 +288,7 @@ void Device::set(const Message *message, Message *response) * @brief Device::actionPrep * @return */ -bool Device::actionPrep_(const Message *message, Message *response) +bool Device::actionPrep_(const MsgPtr message, MsgPtr response) { if (!parameters_.count(message->propertyID)) { @@ -311,7 +311,7 @@ bool Device::actionPrep_(const Message *message, Message *response) * @param message * @param response */ -void Device::actionGetSupportedParameters(const Message *message, Message *response) +void Device::actionGetSupportedParameters(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -346,7 +346,7 @@ void Device::actionGetSupportedParameters(const Message *message, Message *respo * @param message * @param response */ -void Device::actionGetDeviceInfo(const Message *message, Message *response) +void Device::actionGetDeviceInfo(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -370,7 +370,7 @@ void Device::actionGetDeviceInfo(const Message *message, Message *response) * @param message * @param response */ -void Device::actionGetProductDetailIdList(const Message *message, Message *response) +void Device::actionGetProductDetailIdList(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -391,7 +391,7 @@ void Device::actionGetProductDetailIdList(const Message *message, Message *respo * @param message * @param response */ -void Device::actionGetDevModelDescription(const Message *message, Message *response) +void Device::actionGetDevModelDescription(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -411,7 +411,7 @@ void Device::actionGetDevModelDescription(const Message *message, Message *respo * @param message * @param response */ -void Device::actionGetManufacturerLabel(const Message *message, Message *response) +void Device::actionGetManufacturerLabel(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -432,7 +432,7 @@ void Device::actionGetManufacturerLabel(const Message *message, Message *respons * @param message * @param response */ -void Device::actionGetLanguage(const Message *message, Message *response) +void Device::actionGetLanguage(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -449,7 +449,7 @@ void Device::actionGetLanguage(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSetLanguage(const Message *message, Message *response) +void Device::actionSetLanguage(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(2, response)) return; @@ -473,7 +473,7 @@ void Device::actionSetLanguage(const Message *message, Message *response) * @param message * @param response */ -void Device::actionGetSoftwareVersionLabel(const Message *message, Message *response) +void Device::actionGetSoftwareVersionLabel(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -494,7 +494,7 @@ void Device::actionGetSoftwareVersionLabel(const Message *message, Message *resp * @param message * @param response */ -void Device::actionGetDmxPersonality(const Message *message, Message *response) +void Device::actionGetDmxPersonality(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -510,7 +510,7 @@ void Device::actionGetDmxPersonality(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSetDmxPersonality(const Message *message, Message *response) +void Device::actionSetDmxPersonality(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(1, response)) return; @@ -534,7 +534,7 @@ void Device::actionSetDmxPersonality(const Message *message, Message *response) * @param message * @param response */ -void Device::actionGetDmxPersonalityDesc(const Message *message, Message *response) +void Device::actionGetDmxPersonalityDesc(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(1, response)) return; @@ -563,7 +563,7 @@ void Device::actionGetDmxPersonalityDesc(const Message *message, Message *respon * @param message * @param response */ -void Device::actionGetDmxStartAddress(const Message *message, Message *response) +void Device::actionGetDmxStartAddress(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -581,7 +581,7 @@ void Device::actionGetDmxStartAddress(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSetDmxStartAddress(const Message *message, Message *response) +void Device::actionSetDmxStartAddress(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(2, response)) return; @@ -602,7 +602,7 @@ void Device::actionSetDmxStartAddress(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSensorDispatch(const Message *message, Message *response) +void Device::actionSensorDispatch(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(1, response)) return; @@ -662,7 +662,7 @@ void Device::actionSensorDispatch(const Message *message, Message *response) * @param message * @param response */ -void Device::actionGetIdentifyDevice(const Message *message, Message *response) +void Device::actionGetIdentifyDevice(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -677,7 +677,7 @@ void Device::actionGetIdentifyDevice(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSetIdentifyDevice(const Message *message, Message *response) +void Device::actionSetIdentifyDevice(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(1, response)) return; @@ -692,7 +692,7 @@ void Device::actionSetIdentifyDevice(const Message *message, Message *response) * @param message * @param response */ -void Device::actionSetResetDevice(const Message *message, Message *response) +void Device::actionSetResetDevice(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(1, response)) return; diff --git a/rdm/device.h b/rdm/device.h index 0afc15c..e7654b0 100644 --- a/rdm/device.h +++ b/rdm/device.h @@ -47,8 +47,8 @@ public: uint16_t subDeviceCount() const; void addProductDetailId(uint16_t); - void get(const Message* message, Message* response); - void set(const Message* message, Message* response); + void get(const MsgPtr message, MsgPtr response); + void set(const MsgPtr message, MsgPtr response); virtual void identify(bool state) { identifying_ = state; } virtual void reset(bool hard) { (void)hard; } @@ -64,25 +64,25 @@ protected: std::vector sensors_; std::list product_detail_list_; - bool actionPrep_(const Message *message, Message *response); + bool actionPrep_(const MsgPtr message, MsgPtr response); - void actionGetSupportedParameters (const Message *message, Message *response); - void actionGetDeviceInfo (const Message *message, Message *response); - void actionGetProductDetailIdList (const Message *message, Message *response); - void actionGetDevModelDescription (const Message *message, Message *response); - void actionGetManufacturerLabel (const Message *message, Message *response); - void actionGetLanguage (const Message *message, Message *response); - void actionSetLanguage (const Message *message, Message *response); - void actionGetSoftwareVersionLabel(const Message *message, Message *response); - void actionGetDmxPersonality (const Message *message, Message *response); - void actionSetDmxPersonality (const Message *message, Message *response); - void actionGetDmxPersonalityDesc (const Message *message, Message *response); - void actionGetDmxStartAddress (const Message *message, Message *response); - void actionSetDmxStartAddress (const Message *message, Message *response); - void actionSensorDispatch (const Message *message, Message *response); - void actionGetIdentifyDevice (const Message *message, Message *response); - void actionSetIdentifyDevice (const Message *message, Message *response); - void actionSetResetDevice (const Message *message, Message *response); + void actionGetSupportedParameters (const MsgPtr message, MsgPtr response); + void actionGetDeviceInfo (const MsgPtr message, MsgPtr response); + void actionGetProductDetailIdList (const MsgPtr message, MsgPtr response); + void actionGetDevModelDescription (const MsgPtr message, MsgPtr response); + void actionGetManufacturerLabel (const MsgPtr message, MsgPtr response); + void actionGetLanguage (const MsgPtr message, MsgPtr response); + void actionSetLanguage (const MsgPtr message, MsgPtr response); + void actionGetSoftwareVersionLabel(const MsgPtr message, MsgPtr response); + void actionGetDmxPersonality (const MsgPtr message, MsgPtr response); + void actionSetDmxPersonality (const MsgPtr message, MsgPtr response); + void actionGetDmxPersonalityDesc (const MsgPtr message, MsgPtr response); + void actionGetDmxStartAddress (const MsgPtr message, MsgPtr response); + void actionSetDmxStartAddress (const MsgPtr message, MsgPtr response); + void actionSensorDispatch (const MsgPtr message, MsgPtr response); + void actionGetIdentifyDevice (const MsgPtr message, MsgPtr response); + void actionSetIdentifyDevice (const MsgPtr message, MsgPtr response); + void actionSetResetDevice (const MsgPtr message, MsgPtr response); private: Device* parent_; diff --git a/rdm/message.cpp b/rdm/message.cpp index 14ee93e..8ca27a6 100644 --- a/rdm/message.cpp +++ b/rdm/message.cpp @@ -303,7 +303,7 @@ uint16_t Message::checksum() const * @param response * @return */ -bool Message::requiredLength(const size_t length, Message *response) const +bool Message::requiredLength(const size_t length, MsgPtr response) const { if (data_.size() != length) { diff --git a/rdm/message.h b/rdm/message.h index 6bc4dff..94f6100 100644 --- a/rdm/message.h +++ b/rdm/message.h @@ -24,12 +24,17 @@ #pragma once #include +#include #include + #include "rdm.h" #include "uid.h" namespace RDM { +struct Message; +using MsgPtr = std::shared_ptr; + struct Message { Message(); @@ -68,7 +73,7 @@ struct Message const std::vector* data() const { return &data_; } uint8_t length() const { return data_.size(); } uint16_t checksum() const; - bool requiredLength(const size_t length, Message* response) const; + bool requiredLength(const size_t length, MsgPtr response) const; template void appendData(const T & val) @@ -117,7 +122,8 @@ private: } return sum; } -}; +}; // struct Message + } // namespace RDM diff --git a/rdm/parameter.cpp b/rdm/parameter.cpp index 1c5773c..9cbd31b 100644 --- a/rdm/parameter.cpp +++ b/rdm/parameter.cpp @@ -46,7 +46,7 @@ Parameter::~Parameter() * @param message * @param response */ -void Parameter::disc(const Message *message, Message *response) const +void Parameter::disc(const MsgPtr message, MsgPtr response) const { if (!discover_) { @@ -64,8 +64,7 @@ void Parameter::disc(const Message *message, Message *response) const * @param ack * @param nak */ -void Parameter::get(__attribute__((unused)) const Message* message, - Message* response) const +void Parameter::get(const MsgPtr message, MsgPtr response) const { if (!getter_){ response->nak(NR_UNSUPPORTED_COMMAND_CLASS); @@ -82,8 +81,7 @@ void Parameter::get(__attribute__((unused)) const Message* message, * @param ack * @param nak */ -void Parameter::set(__attribute__((unused)) const Message* message, - Message* response) const +void Parameter::set(const MsgPtr message, MsgPtr response) const { if (!setter_) { diff --git a/rdm/parameter.h b/rdm/parameter.h index d5f014f..e14b2df 100644 --- a/rdm/parameter.h +++ b/rdm/parameter.h @@ -30,7 +30,7 @@ namespace RDM { -using PidAction = std::function; +using PidAction = std::function; /** * @brief The Parameter class @@ -41,9 +41,9 @@ public: Parameter(); ~Parameter(); - void disc(const Message* message, Message* response) const; - void get(const Message* message, Message* response) const; - void set(const Message* message, Message* response) const; + void disc(const MsgPtr message, MsgPtr response) const; + void get(const MsgPtr message, MsgPtr response) const; + void set(const MsgPtr message, MsgPtr response) const; void discAction(const PidAction action) { getter_ = action; }; void getAction(const PidAction action) { getter_ = action; }; diff --git a/rdm/responder.cpp b/rdm/responder.cpp index 852d36d..1e6d8b5 100644 --- a/rdm/responder.cpp +++ b/rdm/responder.cpp @@ -105,16 +105,13 @@ void Responder::send(__attribute__((unused)) const std::vector &data) * @brief Responder::send * @param message */ -void Responder::send(Message *response) +void Responder::send(MsgPtr response) { if (!response) return; if (response->do_no_send) - { - delete response; return; - } // 6.2.8.2 Message Count field for Responder Generated Messages // If a responder has more than 255 messages queued, then the Message Count @@ -125,7 +122,6 @@ void Responder::send(Message *response) std::vector data; response->write(data); send(data); - delete response; } @@ -135,9 +131,8 @@ void Responder::send(Message *response) */ void Responder::receive(const std::vector &data) { - auto message = new Message(data); + auto message = MsgPtr(new Message(data)); receive(message); - delete message; } @@ -145,7 +140,7 @@ void Responder::receive(const std::vector &data) * @brief Responder::receive * @param message */ -void Responder::receive(const Message *message) +void Responder::receive(const MsgPtr message) { if (message->short_message) { @@ -184,7 +179,7 @@ void Responder::receive(const Message *message) message->commandClass == SET_COMMAND_RESPONSE) return; - auto response = new Message(); + auto response = MsgPtr(new Message()); response->source = id; response->destination = message->source; response->subDevice = message->subDevice; @@ -205,7 +200,6 @@ void Responder::receive(const Message *message) rxSet(message, response); break; default: - delete response; return; } @@ -217,16 +211,10 @@ void Responder::receive(const Message *message) /// responders shall not send a response. if (message->destination.isBroadcast() && message->commandClass != DISCOVERY_COMMAND) - { - delete response; - return; - } + return; if (response->do_no_send) - { - delete response; - return; - } + return; send(response); } @@ -250,7 +238,7 @@ void Responder::reset(bool hard) * @brief Responder::rxDiscovery * @param message */ -void Responder::rxDiscovery(const Message *message, Message* response) +void Responder::rxDiscovery(const MsgPtr message, MsgPtr response) { if (message->subDevice != 0) { @@ -269,7 +257,7 @@ void Responder::rxDiscovery(const Message *message, Message* response) * @brief Responder::rxGet * @param message */ -void Responder::rxGet(const Message *message, Message* response) +void Responder::rxGet(const MsgPtr message, MsgPtr response) { // 9.2.2 Using Sub-Devices // Broadcast GET commands sent to the SUB_DEVICE_ALL_CALL Sub-Device ID are @@ -302,7 +290,7 @@ void Responder::rxGet(const Message *message, Message* response) * @brief Responder::rxSet * @param message */ -void Responder::rxSet(const Message *message, Message* response) +void Responder::rxSet(const MsgPtr message, MsgPtr response) { if (message->subDevice == 0) { @@ -314,13 +302,11 @@ void Responder::rxSet(const Message *message, Message* response) { for (auto& [num, dev] : sub_devices_) { - Message * rsp = new Message(*response); + auto rsp = MsgPtr(new Message()); rsp->subDevice = num; dev->set(message, rsp); - if (message->destination.isBroadcast()) - delete rsp; - else - queued_messages_.push(rsp); + if (!message->destination.isBroadcast()) + send(rsp); } response->do_no_send = true; return; @@ -341,7 +327,7 @@ void Responder::rxSet(const Message *message, Message* response) * @param message * @param response */ -void Responder::actionDiscoverUniqueBranch(const Message *message, Message *response) +void Responder::actionDiscoverUniqueBranch(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(12, response)) return; @@ -379,7 +365,7 @@ void Responder::actionDiscoverUniqueBranch(const Message *message, Message *resp * @param message * @param response */ -void Responder::actionDiscoveryMute(const Message *message, Message *response) +void Responder::actionDiscoveryMute(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -396,7 +382,7 @@ void Responder::actionDiscoveryMute(const Message *message, Message *response) * @param message * @param response */ -void Responder::actionDiscoveryUnmute(const Message *message, Message *response) +void Responder::actionDiscoveryUnmute(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -413,7 +399,7 @@ void Responder::actionDiscoveryUnmute(const Message *message, Message *response) * @param message * @param response */ -void Responder::actionGetCommsStatus(const Message *message, Message *response) +void Responder::actionGetCommsStatus(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; @@ -430,7 +416,7 @@ void Responder::actionGetCommsStatus(const Message *message, Message *response) * @param message * @param response */ -void Responder::actionSetCommsStatus(const Message *message, Message *response) +void Responder::actionSetCommsStatus(const MsgPtr message, MsgPtr response) { if (!message->requiredLength(0, response)) return; diff --git a/rdm/responder.h b/rdm/responder.h index 98e474e..f3ceb70 100644 --- a/rdm/responder.h +++ b/rdm/responder.h @@ -54,18 +54,18 @@ public: protected: virtual void send(const std::vector& data); - virtual void send(Message* message); - virtual void receive(const Message* message); + virtual void send(MsgPtr message); + virtual void receive(const MsgPtr message); - virtual void rxDiscovery(const Message* message, Message* response); - virtual void rxGet(const Message* message, Message* response); - virtual void rxSet(const Message* message, Message* response); + virtual void rxDiscovery(const MsgPtr message, MsgPtr response); + virtual void rxGet(const MsgPtr message, MsgPtr response); + virtual void rxSet(const MsgPtr message, MsgPtr response); - void actionDiscoverUniqueBranch (const Message *message, Message *response); - void actionDiscoveryMute (const Message *message, Message *response); - void actionDiscoveryUnmute (const Message *message, Message *response); - void actionGetCommsStatus (const Message *message, Message *response); - void actionSetCommsStatus (const Message *message, Message *response); + void actionDiscoverUniqueBranch (const MsgPtr message, MsgPtr response); + void actionDiscoveryMute (const MsgPtr message, MsgPtr response); + void actionDiscoveryUnmute (const MsgPtr message, MsgPtr response); + void actionGetCommsStatus (const MsgPtr message, MsgPtr response); + void actionSetCommsStatus (const MsgPtr message, MsgPtr response); std::queue queued_messages_; diff --git a/rdm/sensor.cpp b/rdm/sensor.cpp index 517388f..57a0178 100644 --- a/rdm/sensor.cpp +++ b/rdm/sensor.cpp @@ -117,7 +117,7 @@ void Sensor::clearMemory() * @param message * @param response */ -void Sensor::actionGetSensorDefinition(uint8_t index, Message *response) +void Sensor::actionGetSensorDefinition(uint8_t index, MsgPtr response) { response->responseType = RESPONSE_TYPE_ACK; response->appendData(index); @@ -143,7 +143,7 @@ void Sensor::actionGetSensorDefinition(uint8_t index, Message *response) * @param message * @param response */ -void Sensor::actionGetSensorValue(uint8_t index, Message *response) +void Sensor::actionGetSensorValue(uint8_t index, MsgPtr response) { response->responseType = RESPONSE_TYPE_ACK; response->appendData(index); @@ -159,7 +159,7 @@ void Sensor::actionGetSensorValue(uint8_t index, Message *response) * @param message * @param response */ -void Sensor::actionSetSensorValue(uint8_t index, Message *response) +void Sensor::actionSetSensorValue(uint8_t index, MsgPtr response) { clearMemory(); @@ -189,7 +189,7 @@ void Sensor::actionSetSensorValue(uint8_t index, Message *response) * @param message * @param response */ -void Sensor::actionSetRecordSensors(Message *response) +void Sensor::actionSetRecordSensors(MsgPtr response) { save(); response->responseType = RESPONSE_TYPE_ACK; diff --git a/rdm/sensor.h b/rdm/sensor.h index dabb27e..6c29671 100644 --- a/rdm/sensor.h +++ b/rdm/sensor.h @@ -69,10 +69,10 @@ public: int16_t maximum() const; // PID behaviors - void actionGetSensorDefinition (uint8_t index, Message *response); - void actionGetSensorValue (uint8_t index, Message *response); - void actionSetSensorValue (uint8_t index, Message *response); - void actionSetRecordSensors (Message *response); + void actionGetSensorDefinition (uint8_t index, MsgPtr response); + void actionGetSensorValue (uint8_t index, MsgPtr response); + void actionSetSensorValue (uint8_t index, MsgPtr response); + void actionSetRecordSensors (MsgPtr response); private: int16_t min_;