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;
186rapidxml::xml_node<>* RateLimiter::SaveElement(rapidxml::xml_document<>& doc, rapidxml::xml_node<>* elementListNode)
188 auto elementNode = XMLParser::AppendNode(doc, elementListNode,
"RateLimiter");
189 XMLParser::SetNodeAttribute(doc, elementNode,
"ID", m_elementID);
191 SaveCADProperties(doc, elementNode);
192 SaveControlNodes(doc, elementNode);
195 auto upLimit = XMLParser::AppendNode(doc, elementNode,
"UpperLimit");
196 XMLParser::SetNodeValue(doc, upLimit, m_upLimit);
197 auto lowLimit = XMLParser::AppendNode(doc, elementNode,
"LowerLimit");
198 XMLParser::SetNodeValue(doc, lowLimit, m_lowLimit);
203bool RateLimiter::OpenElement(rapidxml::xml_node<>* elementNode)
205 if (!OpenCADProperties(elementNode))
return false;
206 if (!OpenControlNodes(elementNode))
return false;
209 m_upLimit = XMLParser::GetNodeValueDouble(elementNode,
"UpperLimit");
210 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, wxWindow *workspace=nullptr)
Show element data form.