19#include "../../forms/RateLimiterForm.h"
25 m_width = m_height = 36.0;
26 Node* nodeIn =
new Node(m_position + wxPoint2DDouble(-18, 0), Node::NodeType::NODE_IN, m_borderSize);
27 nodeIn->StartMove(m_position);
28 Node* nodeOut =
new Node(m_position + wxPoint2DDouble(18, 0), Node::NodeType::NODE_OUT, m_borderSize);
29 nodeOut->SetAngle(180.0);
30 nodeOut->StartMove(m_position);
31 m_nodeList.push_back(nodeIn);
32 m_nodeList.push_back(nodeOut);
35RateLimiter::~RateLimiter()
37 for (
auto& node : m_nodeList) if (node) delete node;
76 gc->SetPen(*wxTRANSPARENT_PEN);
77 gc->SetBrush(wxBrush(m_selectionColour));
78 double borderSize = (m_borderSize * 2.0 + 1.0) / scale;
79 gc->DrawRectangle(m_position.m_x - m_width / 2 - borderSize / 2, m_position.m_y - m_height / 2 - borderSize / 2, m_width + borderSize, m_height + borderSize);
81 gc->SetPen(*wxBLACK_PEN);
82 gc->SetBrush(*wxWHITE_BRUSH);
83 gc->DrawRectangle(m_position.m_x - m_width / 2, m_position.m_y - m_height / 2, m_width, m_height);
86 gc->SetBrush(*wxTRANSPARENT_BRUSH);
87 wxPoint2DDouble axis[4];
88 axis[0] = m_position + wxPoint2DDouble(-13, 0);
89 axis[1] = m_position + wxPoint2DDouble(13, 0);
90 axis[2] = m_position + wxPoint2DDouble(0, -13);
91 axis[3] = m_position + wxPoint2DDouble(0, 13);
92 gc->StrokeLines(2, &axis[0]);
93 gc->StrokeLines(2, &axis[2]);
95 gc->SetPen(wxPen(wxColour(0, 77, 255, 255), 2));
96 wxPoint2DDouble limSymbol[2];
97 limSymbol[0] = m_position + wxPoint2DDouble(10, -10);
98 limSymbol[1] = m_position + wxPoint2DDouble(-10, 10);
99 gc->StrokeLines(2, limSymbol);
101 gc->SetPen(*wxTRANSPARENT_PEN);
102 gc->SetBrush(*wxBLACK_BRUSH);
109 form.CenterOnParent();
110 if (form.ShowModal() == wxID_OK) {
122 if (m_angle >= 360.0)
124 else if (m_angle < 0)
129 for (
auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
131 node->Rotate(clockwise);
135void RateLimiter::UpdatePoints()
137 if (m_angle == 0.0) {
138 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
139 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(18, 0));
141 else if (m_angle == 90.0) {
142 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, -18));
143 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, 18));
145 else if (m_angle == 180.0) {
146 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(18, 0));
147 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(-18, 0));
149 else if (m_angle == 270.0) {
150 m_nodeList[0]->SetPosition(m_position + wxPoint2DDouble(0, 18));
151 m_nodeList[1]->SetPosition(m_position + wxPoint2DDouble(0, -18));
161 double rate = (input[0] - m_output) / timeStep;
163 bool reachLimit =
false;
164 if (rate > m_upLimit) {
168 else if (rate < m_lowLimit) {
174 m_output += rate * timeStep;
187rapidxml::xml_node<>* RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
189 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"RateLimiter");
190 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
192 SaveCADProperties(doc, elementNode);
193 SaveControlNodes(doc, elementNode);
196 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
197 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
198 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
199 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
204bool RateLimiter::OpenElement(rapidxml::xml_node<>* elementNode)
206 if (!OpenCADProperties(elementNode))
return false;
207 if (!OpenControlNodes(elementNode))
return false;
210 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
211 m_lowLimit = XMLParser::GetNodeValueDouble(elementNode,
"LowerLimit");
virtual void StartMove(wxPoint2DDouble position)
Update the element attributes related to the movement.
Base class of all elements of the program. This class is responsible for manage graphical and his dat...
Node of a control element. This class manages the user interaction with the connection and control el...
Limits the rising and/or falling rate.
virtual void Rotate(bool clockwise=true)
Rotate the element.
virtual void DrawDC(wxPoint2DDouble translation, double scale, wxGraphicsContext *gc) const
Draw the element using GDI+.
virtual Element * GetCopy()
Get a the element copy.
virtual bool Solve(double *input, double timeStep)
Calculate the rate and limits it if exceeds.
virtual bool ShowForm(wxWindow *parent, Element *element)
Show element data form.