Fotobot
Get data from your photovoltaic plant
linescontroller.cpp
Go to the documentation of this file.
1 
7 #include "linescontroller.h"
8 #include "invertorscontroller.h"
9 #include "static.h"
10 #include <QVariant>
11 #include <QDateTime>
12 
14  qRegisterMetaType<DBT_LINES>();
15  connect(this, SIGNAL(saveLine(DBT_LINES)), Static::db, SLOT(saveLine(DBT_LINES)), Qt::BlockingQueuedConnection);
16  connect(this, SIGNAL(deleteLine(int)), Static::db, SLOT(deleteLine(int)), Qt::QueuedConnection);
17  qRegisterMetaType<DBT_INVERTORS>();
18  connect(this, SIGNAL(saveInvertor(DBT_INVERTORS)), Static::db, SLOT(saveInvertor(DBT_INVERTORS)), Qt::QueuedConnection);
19 }
20 
21 void LinesController::servicePrivate(HttpRequest& request) {
22  QByteArray action = request.getParameter("action");
23  if(action.startsWith("add")) {
24  actionAdd(request); return;
25  } else if(action.startsWith("edit")) {
26  actionEdit(request); return;
27  } else if(action.startsWith("delete")) {
28  actionDelete(request); return;
29  }
30 
33  QList<DBT_LINES> lines = Static::db->lines();
34  write(QString("<h2>%1</h2>\n").arg(tr("Lines")));
35  write(QString("<a href=\"/lines?action=add\">%1</a>\n").arg(tr("Add a line")));
36  write("<table>\n");
37  write(QString("<tr><th></th><th>%1</th><th>%2</th><th>%3</th><th>%4</th><th>%5</th><th>%6</th><th>%7</th><th>%8</th></tr>\n").arg(tr("Line"), tr("Device"), tr("IP address"), tr("Description"), tr("Serial Number Format"), tr("Speed"), tr("Retries"), tr("Timeout [ms]")));
38 
39  QList<DBT_LINES>::const_iterator i;
40  for(i = lines.constBegin(); i != lines.constEnd(); ++i) {
41  const DBT_LINES& l = *i;
42  write(QString("<tr><td>"
43  "<a href=\"/lines?action=edit&id=%1\">%9</a> "
44  "<a href=\"/lines?action=delete&id=%1\">%10</a>"
45  "</td>"
46  "<td>%1</td><td>%2</td><td>%3</td><td>%4</td><td>%5</td><td>%6</td><td>%7</td><td>%8</td>"
47  "</tr>\n")
48  .arg(l.line) // 1
49  .arg(l.device) // 2
50  .arg(l.hostname + ":" + QString::number(l.portnumber) )
51  .arg(l.description ) // 4
52  .arg(l.sn_format) // 5
53  .arg(l.speed) // 6
54  .arg(l.retries) // 7
55  .arg(l.timeout) // 8
56  .arg(tr("Edit")) // 9
57  .arg(tr("Delete")) // 10
58  );
59  }
60 
61  write("</table>\n");
62 }
63 
65  QString s;
66  s.append(QString("<input type=\"hidden\" name=\"id\" value=\"%1\" />\n").arg(line.line));
67  QString i ("<tr><td><label for=\"%2\">%1</label>: </td><td><input type=\"text\" name=\"%2\" value=\"%3\" /></td></tr>\n");
68  s.append(i.arg(tr("Description"), "description", line.description));
69  s.append(i.arg(tr("Serial Number Format"), "sn_format", line.sn_format));
70 
71  QString sel;
72  sel += QString("<option value=\"%1\" %2>%3</option>")
73  .arg(DBT_LINES::Fronius)
74  .arg((line.type == DBT_LINES::Fronius)?"selected=\"selected\"" : "")
75  .arg("Fronius (interfacebox)")
76  ;
77  sel += QString("<option value=\"%1\" %2>%3</option>")
78  .arg(DBT_LINES::ModbusTCP)
79  .arg((line.type == DBT_LINES::ModbusTCP)?"selected=\"selected\"" : "")
80  .arg("Modbus TCP")
81  ;
82  s.append(QString("<tr><td>%1</td><td><select id=\"type\" name=\"type\">%2</select></td>")
83  .arg(tr("Type"))
84  .arg(sel)
85  );
86 
87  s.append(i.arg(tr("Device"), "device", line.device));
88  s.append(i.arg(tr("Hostname"), "hostname", line.hostname));
89  s.append(i.arg(tr("Port number"), "portnumber", QString::number(line.portnumber)));
90  // speed selectbox
91  s.append(QString("<tr><td><label for=\"%2\">%1</label>: </td><td><select id=\"%2\" name=\"%2\">\n").arg(tr("Speed"), "speed"));
92  QList<int> speeds;
93  speeds << 110 << 300 << 600 << 1200 << 2400 << 4800 << 9600 << 19200 << 38400 << 57600 << 115200;
94  QList<int>::const_iterator ii;
95  for(ii = speeds.constBegin(); ii != speeds.constEnd(); ++ii) {
96  int sp = *ii;
97  s.append(QString("<option value=\"%1\" %2>%1</option>\n")
98  .arg(sp).arg((sp == line.speed) ? "selected=\"selected\"" : ""));
99  }
100  s.append("</select></td></tr>\n");
101 
102  s.append(i.arg(tr("Retries"), "retries").arg(line.retries));
103  s.append(i.arg(tr("Timeout [ms]"), "timeout").arg(line.timeout));
104  return s;
105 }
106 
107 void LinesController::readForm(DBT_LINES& line, HttpRequest& request) {
108  line.line = request.getParameter("id").toInt();
109  line.device = request.getParameter("device");
110  line.description = request.getParameter("description");
111  line.sn_format = request.getParameter("sn_format");
112  QByteArray p = request.getParameter("speed");
113  line.speed = (p.isEmpty()) ? 9600 : p.toInt();
114  p = request.getParameter("retries");
115  line.retries = (p.isEmpty()) ? 5 : p.toInt();
116  p = request.getParameter("timeout");
117  line.timeout = (p.isEmpty()) ? 3000 : p.toInt();
118  p = request.getParameter("type");
119  line.type = (DBT_LINES::Type)(
120  (p.isEmpty()) ? DBT_LINES::Fronius : p.toInt()
121  );
122  line.hostname = request.getParameter("hostname");
123  line.portnumber = request.getParameter("portnumber").toInt();
124 }
125 
129 void LinesController::actionAdd(HttpRequest& request) {
130  QByteArray action = request.getParameter("action");
132  write(QString("<h3>%1</h3>\n").arg(tr("Add a line")));
133  write("<form method=\"post\">\n"
134  "<input type=\"hidden\" name=\"action\" value=\"add2\" />\n");
135  DBT_LINES line;
136  readForm(line, request);
137  write("<table class=\"formTable\">");
138  write(getEditFormContents(line));
139 
141  write(QString("<tr><td><h4>%1</h4></td><td></td></tr>").arg(tr("Generate Invertors")));
142  DBT_INVERTORS invertor;
143  InvertorsController::readForm(invertor, request);
144  if(invertor.address < 1) invertor.address = 1;
145  write(InvertorsController::getEditFormContents(request, invertor, true));
146  write("</table>");
147 
148  write(QString("<input type=\"submit\" value=\"%1\">\n"
149  "</form>\n").arg(tr("Add")));
150  if(action == "add2") {
152  line.line = 0;
153  invertor.invertor = 0;
155  if(true) {
156  invertor.line = Static::db->saveLine(line);
157 
159  QByteArray generate = request.getParameter("generate");
160  int gen = (generate.isEmpty()) ? 0 : generate.toInt();
161  for(int j = 0; j < gen; j++) {
162  emit saveInvertor(invertor);
163  ++invertor.address; // do addresses have to be unique only in 1 line?
164  }
165 
166  QString location = QString("/lines?message=%1").arg(percentEncode(tr("Line added.")));
167  redirect(location);
168  } else {
169  write(QString("<p>%1</p>").arg(tr("Line definition invalid.")));
170  }
171  }
172 }
173 
177 void LinesController::actionEdit(HttpRequest& request) {
178  QByteArray action = request.getParameter("action");
179  DBT_LINES line;
181  write(QString("<h3>%1</h3>\n").arg(tr("Edit a line")));
182  write("<form method=\"post\">\n"
183  "<input type=\"hidden\" name=\"action\" value=\"edit2\" />\n");
184  if(action == "edit") {
185  QByteArray id = request.getParameter("id");
186  int idi = id.toInt();
187  if(id.isEmpty() || idi < 1) {
188  redirect(QString("/lines?message=%1").arg(percentEncode(tr("Error: Invalid line ID."))));
189  return;
190  }
191  QList<DBT_LINES> lines = Static::db->lines(idi);
192  if(lines.empty()) {
193  redirect(QString("/lines?message=%1").arg(percentEncode(tr("Error: no such line found."))));
194  return;
195  }
196  write("<table class=\"formTable\">");
197  write(getEditFormContents(lines.at(0)));
198  write("</table>");
199  } else {
200  readForm(line, request);
201  write("<table class=\"formTable\">");
202  write(getEditFormContents(line));
203  write("</table>");
204  }
205  write(QString("<input type=\"submit\" value=\"%1\">\n"
206  "</form>\n").arg(tr("Edit")));
207  if(action == "edit2") {
210  if(line.line > 0 && true) {
211  emit saveLine(line);
212  QString location = QString("/lines?message=%1").arg(percentEncode(tr("Line edited.")));
213  redirect(location);
214  } else {
215  write(QString("<p>%1</p>").arg(tr("Error: Line definition invalid.")));
216  }
217  }
218 }
219 
223 void LinesController::actionDelete(HttpRequest& request) {
224  write(QString("<h3>%1</h3>\n").arg(tr("Delete a line")));
225  QString location;
226  QByteArray id = request.getParameter("id");
227  int idi = id.toInt();
228  if(!id.isEmpty() && idi > 0) {
229  emit deleteLine(idi);
230  location = QString("/lines?message=%1").arg(percentEncode(tr("Line deleted.")));
231  } else {
232  location = QString("/lines?message=%1").arg(percentEncode(tr("Error: Invalid line ID. Line not deleted.")));
233  }
234  redirect(location);
235 }
QList< DBT_LINES > lines(int line=0)
Returns list of communications lines.
Definition: database.cpp:380
void servicePrivate(HttpRequest &request)
void actionEdit(HttpRequest &request)
static QString getEditFormContents(const DBT_LINES &line=DBT_LINES())
void actionAdd(HttpRequest &request)
static QString getEditFormContents(HttpRequest &request, DBT_INVERTORS line=DBT_INVERTORS(), bool generator=false)
static void readForm(DBT_INVERTORS &invertor, HttpRequest &request)
int saveLine(QSqlDatabase &, DBT_LINES)
Insert or update LINE.
Definition: database.cpp:857
static void readForm(DBT_LINES &line, HttpRequest &request)
void actionDelete(HttpRequest &request)
Class describing database table LINES.
Class describing database table INVERTORS.