Get rid of SUM_TYPE abstraction
I couldn't understand it -- maybe it was needed for something before our refactoring too place, but now it's ridiculous. 400 SLoC + complaint about C++ => object.function()
This commit is contained in:
@@ -126,34 +126,4 @@ namespace detail {
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SUM_TYPE_UNION_MEMBER0(type, var) type var;
|
|
||||||
#define SUM_TYPE_UNION_MEMBER(name, tuple) SUM_TYPE_UNION_MEMBER0 tuple
|
|
||||||
|
|
||||||
#define SUM_TYPE_ENUM_MEMBER0(type, var) var,
|
|
||||||
#define SUM_TYPE_ENUM_MEMBER(name, tuple) SUM_TYPE_ENUM_MEMBER0 tuple
|
|
||||||
|
|
||||||
#define SUM_TYPE_CONSTRUCTOR0(name, type, val) \
|
|
||||||
name(type&& arg) \
|
|
||||||
: tag(Tag::val) \
|
|
||||||
{ \
|
|
||||||
value.val = std::move(arg); \
|
|
||||||
}
|
|
||||||
#define SUM_TYPE_CONSTRUCTOR(name, tuple) SUM_TYPE_CONSTRUCTOR0 LPAREN name, TUPLE tuple)
|
|
||||||
|
|
||||||
#define SUM_TYPE(name, ...) \
|
|
||||||
class name { \
|
|
||||||
public: \
|
|
||||||
union { \
|
|
||||||
FOR_EACH(SUM_TYPE_UNION_MEMBER, name, __VA_ARGS__) \
|
|
||||||
} value; \
|
|
||||||
enum class Tag { \
|
|
||||||
void_, \
|
|
||||||
FOR_EACH(SUM_TYPE_ENUM_MEMBER, name, __VA_ARGS__) \
|
|
||||||
} tag; \
|
|
||||||
\
|
|
||||||
name() \
|
|
||||||
: tag(Tag::void_) \
|
|
||||||
{ \
|
|
||||||
} \
|
|
||||||
FOR_EACH(SUM_TYPE_CONSTRUCTOR, name, __VA_ARGS__) \
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -16,18 +16,6 @@ class RATGDOComponent;
|
|||||||
|
|
||||||
namespace protocol {
|
namespace protocol {
|
||||||
|
|
||||||
struct QueryStatus {
|
|
||||||
};
|
|
||||||
struct QueryOpenings {
|
|
||||||
};
|
|
||||||
|
|
||||||
// a poor man's sum-type, because C++
|
|
||||||
SUM_TYPE(Args,
|
|
||||||
(QueryStatus, query_status),
|
|
||||||
(QueryOpenings, query_openings), )
|
|
||||||
|
|
||||||
SUM_TYPE(Result, )
|
|
||||||
|
|
||||||
class Protocol {
|
class Protocol {
|
||||||
public:
|
public:
|
||||||
virtual void setup(RATGDOComponent* ratgdo, Scheduler* scheduler, InternalGPIOPin* rx_pin, InternalGPIOPin* tx_pin);
|
virtual void setup(RATGDOComponent* ratgdo, Scheduler* scheduler, InternalGPIOPin* rx_pin, InternalGPIOPin* tx_pin);
|
||||||
@@ -42,7 +30,8 @@ namespace protocol {
|
|||||||
virtual void lock_action(LockAction action);
|
virtual void lock_action(LockAction action);
|
||||||
virtual void door_action(DoorAction action);
|
virtual void door_action(DoorAction action);
|
||||||
|
|
||||||
virtual protocol::Result call(protocol::Args args);
|
virtual void query_status() {}
|
||||||
|
virtual void query_openings() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -295,16 +295,11 @@ void RATGDOComponent::set_distance_measurement(int16_t distance)
|
|||||||
this->last_distance_measurement = distance;
|
this->last_distance_measurement = distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result RATGDOComponent::call_protocol(Args args)
|
void RATGDOComponent::query_status() { this->protocol_->query_status(); }
|
||||||
{
|
|
||||||
return this->protocol_->call(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RATGDOComponent::query_status() { this->protocol_->call(QueryStatus { }); }
|
|
||||||
|
|
||||||
void RATGDOComponent::query_openings()
|
void RATGDOComponent::query_openings()
|
||||||
{
|
{
|
||||||
this->protocol_->call(QueryOpenings { });
|
this->protocol_->query_openings();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RATGDOComponent::sync()
|
void RATGDOComponent::sync()
|
||||||
|
|||||||
@@ -35,8 +35,7 @@ typedef Parented<RATGDOComponent> RATGDOClient;
|
|||||||
const float DOOR_POSITION_UNKNOWN = -1.0;
|
const float DOOR_POSITION_UNKNOWN = -1.0;
|
||||||
const float DOOR_DELTA_UNKNOWN = -2.0;
|
const float DOOR_DELTA_UNKNOWN = -2.0;
|
||||||
|
|
||||||
using protocol::Args;
|
|
||||||
using protocol::Result;
|
|
||||||
|
|
||||||
class RATGDOComponent : public Component {
|
class RATGDOComponent : public Component {
|
||||||
public:
|
public:
|
||||||
@@ -83,7 +82,7 @@ public:
|
|||||||
void set_output_gdo_pin(InternalGPIOPin* pin) { this->output_gdo_pin_ = pin; }
|
void set_output_gdo_pin(InternalGPIOPin* pin) { this->output_gdo_pin_ = pin; }
|
||||||
void set_input_gdo_pin(InternalGPIOPin* pin) { this->input_gdo_pin_ = pin; }
|
void set_input_gdo_pin(InternalGPIOPin* pin) { this->input_gdo_pin_ = pin; }
|
||||||
|
|
||||||
Result call_protocol(Args args);
|
|
||||||
|
|
||||||
void received(const DoorState door_state);
|
void received(const DoorState door_state);
|
||||||
void received(const LightState light_state);
|
void received(const LightState light_state);
|
||||||
|
|||||||
@@ -192,16 +192,7 @@ namespace secplus2 {
|
|||||||
this->door_command(action);
|
this->door_command(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result Secplus2::call(Args args)
|
|
||||||
{
|
|
||||||
using Tag = Args::Tag;
|
|
||||||
if (args.tag == Tag::query_status) {
|
|
||||||
this->send_command(CommandType::GET_STATUS);
|
|
||||||
} else if (args.tag == Tag::query_openings) {
|
|
||||||
this->send_command(CommandType::GET_OPENINGS);
|
|
||||||
}
|
|
||||||
return { };
|
|
||||||
}
|
|
||||||
|
|
||||||
void Secplus2::door_command(DoorAction action)
|
void Secplus2::door_command(DoorAction action)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -81,7 +81,8 @@ namespace secplus2 {
|
|||||||
void lock_action(LockAction action);
|
void lock_action(LockAction action);
|
||||||
void door_action(DoorAction action);
|
void door_action(DoorAction action);
|
||||||
|
|
||||||
Result call(Args args);
|
void query_status() override;
|
||||||
|
void query_openings() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void increment_rolling_code_counter(int delta = 1);
|
void increment_rolling_code_counter(int delta = 1);
|
||||||
@@ -114,8 +115,7 @@ namespace secplus2 {
|
|||||||
|
|
||||||
void door_command(DoorAction action);
|
void door_command(DoorAction action);
|
||||||
|
|
||||||
void query_status();
|
|
||||||
void query_openings();
|
|
||||||
|
|
||||||
void print_packet(const esphome::LogString* prefix, const WirePacket& packet) const;
|
void print_packet(const esphome::LogString* prefix, const WirePacket& packet) const;
|
||||||
optional<Command> decode_packet(const WirePacket& packet) const;
|
optional<Command> decode_packet(const WirePacket& packet) const;
|
||||||
|
|||||||
Reference in New Issue
Block a user