qpidctrl  0.7.1
qptc10device.cpp
Go to the documentation of this file.
1 #include "qptc10device.h"
2 #include "qpidcontroller.h"
3 #include "qextserialport.h"
4 #include <QTcpSocket>
5 #include "qcepmutexlocker.h"
6 #include "qpiddebug.h"
7 #include "qptc10simulator.h"
8 #include <QCoreApplication>
9 #include <QThread>
10 #include "qpidcommport.h"
11 
12 QPTC10Device::QPTC10Device(QPidControllerWPtr ctrl, QcepSettingsSaverWPtr saver, QString deviceName) :
13  QPidDevice(ctrl, saver, PTC10Device, deviceName, 1000, 2000),
14  m_ObjectNamer(this, "ptc10"),
15  m_ChannelList(QcepSettingsSaverWPtr(), this, "channelList", "", "Channel List"),
16  m_Channels(QcepSettingsSaverWPtr(), this, "channels", QStringList(), "Channel List"),
17  m_InputChannels(QcepSettingsSaverWPtr(), this, "inputChannels", QStringList(), "Input Channel List"),
18  m_OutputChannels(QcepSettingsSaverWPtr(), this, "outputChannels", QStringList(), "Output Channel List"),
19  m_UnitsList(QcepSettingsSaverWPtr(), this, "unitsList", "", "Channel Units List"),
20  m_ChannelUnits(QcepSettingsSaverWPtr(), this, "channelUnits", QStringList(), "Channel Units List"),
21  m_ChannelValues(QcepSettingsSaverWPtr(), this, "channelValues", QcepDoubleList(), "Channel Values"),
22  m_InputChannel(saver, this, "inputChannel", -1, "Input Channel Number"),
23  m_InputUnits(QcepSettingsSaverWPtr(), this, "inputUnits", "", "Input Units"),
24  m_OutputChannel(saver, this, "outputChannel", -1, "Output Channel Number"),
25  m_OutputUnits(QcepSettingsSaverWPtr(), this, "outputUnits", "", "Output Units")
26 {
27  connect(prop_InputChannel(), SIGNAL(valueChanged(int,int)), this, SLOT(onInputChannelChanged()));
28  connect(prop_InputUnits(), SIGNAL(valueChanged(QString,int)), this, SLOT(onInputChannelChanged()));
29  connect(prop_OutputChannel(),SIGNAL(valueChanged(int,int)), this, SLOT(onOutputChannelChanged()));
30  connect(prop_OutputUnits(), SIGNAL(valueChanged(QString,int)), this, SLOT(onOutputChannelChanged()));
31 }
32 
34 {
36 
39 }
40 
42 {
44 }
45 
47 {
49 }
50 
52 {
54 }
55 
56 void QPTC10Device::writeSettings(QSettings *set, QString section)
57 {
58  QPidDevice::writeSettings(set, section+"/ptc10");
59 
60  QcepProperty::writeSettings(this, &staticMetaObject, section+"/ptc10", set);
61 }
62 
63 void QPTC10Device::readSettings(QSettings *set, QString section)
64 {
65  QPidDevice::readSettings(set, section+"/ptc10");
66 
67  QcepProperty::readSettings(this, &staticMetaObject, section+"/ptc10", set);
68 }
69 
71 {
72  if (m_DeviceDialog == NULL) {
74  }
75 
76  if (m_DeviceDialog) {
77  m_DeviceDialog->show();
78  m_DeviceDialog->raise();
79  }
80 }
81 
83 {
84  QStringList chans = get_InputChannels();
85 
86  return chans.value(get_InputChannel());
87 }
88 
90 {
91  QStringList chans = get_OutputChannels();
92 
93  return chans.value(get_OutputChannel());
94 }
95 
97 {
98  QStringList chans = get_Channels();
99  QStringList units = get_ChannelUnits();
100  QString chan = inputChannelName();
101 
102  int indx = chans.indexOf(chan);
103 
104  return units.value(indx);
105 }
106 
108 {
109  QStringList chans = get_Channels();
110  QStringList units = get_ChannelUnits();
111  QString chan = outputChannelName();
112 
113  int indx = chans.indexOf(chan);
114 
115  return units.value(indx);
116 }
117 
119 {
120  if (qcepDebug(DEBUG_PTC10)) {
121  printMessage("Readout Initial");
122  }
123 
124 // QString res = immediateQuery("Channel.list");
125 
126 // printMessage(tr("Channel List : %1").arg(res));
127 
128  sendCommand("system.com.verbose medium");
129 
133 }
134 
136 {
137  if (qcepDebug(DEBUG_PTC10)) {
138  printMessage("Readout Polling");
139  }
140 
142 
143  if (ctl) {
144  QString res = sendQuery("getOutput.names");
145 
146  if (res != get_ChannelList()) {
147  parseChannelList(res);
148  }
149 
150  res = sendQuery("getOutput.units");
151 
152  if (res != get_UnitsList()) {
153  parseUnitsList(res);
154  }
155 
156  res = sendQuery("getOutput");
157  parseOutputValues(res);
158 
159  if (outputChannelName().length()) {
160  queryProperty(tr("\"%1.PID.Mode?\"").arg(this->outputChannelName()), ctl->prop_LoopEnabled());
161  queryProperty(tr("\"%1.PID.Setpoint?\"").arg(this->outputChannelName()), ctl->prop_SetPoint());
162  queryProperty(tr("\"%1.PID.RampT?\"").arg(this->outputChannelName()), ctl->prop_RampPoint());
163  queryProperty(tr("\"%1.PID.Ramp?\"").arg(this->outputChannelName()), ctl->prop_RampRate(), 60.0);
164  queryProperty(tr("\"%1?\"").arg(this->outputChannelName()), ctl->prop_OutputLevel());
165  queryProperty(tr("outputEnable?"), ctl->prop_Enabled());
166  }
167 
168  if (inputChannelName().length()) {
169  queryProperty(tr("\"%1?\"").arg(this->inputChannelName()), ctl->prop_Temperature());
170  }
171  }
172 }
173 
175 {
176  printMessage("Readout Timeout");
177 
179 }
180 
182 {
183  if (qcepDebug(DEBUG_PTC10)) {
184  printMessage(tr("parseChannelList(\"%1\")").arg(chans.trimmed()));
185  }
186 
187  if (chans != get_ChannelList()) {
188  set_ChannelList(chans);
189  }
190 
191  QStringList channels, outputChannels, inputChannels;
192 
193  QStringList chs = chans.split(", ", QString::SkipEmptyParts);
194 
195  foreach(QString ch, chs) {
196  QString cht = ch.trimmed();
197  QString res = sendQuery(tr("\"%1.PID.Mode?\"").arg(cht));
198 
199  channels.append(ch.trimmed());
200 
201  if (res.startsWith("Error")) {
202  inputChannels.append(cht);
203  } else {
204  outputChannels.append(cht);
205  }
206  }
207 
208  set_Channels(channels);
209  set_InputChannels(inputChannels);
210  set_OutputChannels(outputChannels);
211 
212  QStringList res;
213  res.append("Epoch");
214  res.append("Day");
215  res.append("Hours");
216  res.append("Minutes");
217  res.append("Seconds");
218  res.append("Temperature");
219  res.append("Output");
220  res.append("Set Point");
221  res.append("Ramp Point");
222  res.append(channels);
223 
224  emit graphedChannelNames(res);
225  emit loggedChannelNames(res);
226 
227  if(qcepDebug(DEBUG_PTC10)) {
228  printMessage(chans.trimmed());
229  }
230 }
231 
233 {
234  if (QThread::currentThread() != thread()) {
235  QMetaObject::invokeMethod(this, "updateChannelList", Qt::BlockingQueuedConnection);
236  } else {
237  if (commPort()->successfullyConnected()) {
238  QString res = sendQuery("getOutput.names");
239 
240  parseChannelList(res);
241 
242  res = sendQuery("getOutput.units");
243 
244  parseUnitsList(res);
245  }
246  }
247 }
248 
250 {
251  if (str != get_UnitsList()) {
252  set_UnitsList(str);
253  }
254 
255  QStringList units;
256  QStringList us = str.split(", ");
257 
258  foreach(QString u, us) {
259  units.append(u.trimmed());
260  }
261 
262  set_ChannelUnits(units);
263 
264  if(qcepDebug(DEBUG_PTC10)) {
265  printMessage(tr("parseUnitsList: %1").arg(str.trimmed()));
266  }
267 }
268 
270 {
271  QcepDoubleList vals;
272  QStringList vs = str.split(", ");
273 
274  foreach(QString v, vs) {
275  vals.append(v.toDouble());
276  }
277 
278  set_ChannelValues(vals);
279 
280  if(qcepDebug(DEBUG_PTC10)) {
281  printMessage(tr("parseOutputValues: %1").arg(str.trimmed()));
282  }
283 }
284 
285 void QPTC10Device::queryProperty(QString qry, QcepDoubleProperty *property, double scale)
286 {
287  if (qcepDebug(DEBUG_PTC10)) {
288  printMessage(tr("sendQuery %1").arg(qry));
289  }
290 
291  QString res = sendQuery(qry);
292 
293  if (property) {
294  property->setValue(res.toDouble()*scale);
295  }
296 }
297 
298 void QPTC10Device::queryProperty(QString qry, QcepBoolProperty *property)
299 {
300  if (qcepDebug(DEBUG_PTC10)) {
301  printMessage(tr("sendQuery %1").arg(qry));
302  }
303 
304  QString res = sendQuery(qry);
305 
306  if (property) {
307  property->setValue(!res.startsWith("Off"));
308  }
309 }
310 
311 void QPTC10Device::queryProperty(QString qry, QcepStringProperty *property)
312 {
313  if (qcepDebug(DEBUG_PTC10)) {
314  printMessage(tr("sendQuery %1").arg(qry));
315  }
316 
317  QString res = sendQuery(qry);
318 
319  if (property) {
320  property->setValue(res.trimmed());
321  }
322 }
323 
324 QString QPTC10Device::sendQuery(QString cmd)
325 {
326  if (qcepDebug(DEBUG_PTC10)) {
327  printMessage(tr("query:%1").arg(cmd.trimmed()));
328  }
329 
330  if (QThread::currentThread() != thread()) {
331  printMessage("Thread error");
332  }
333 
334  QString res;
335 
336  if (commPort()) {
337  commPort()->readAll();
338  commPort()->write(qPrintable(cmd+"\n"));
339  commPort()->waitForBytesWritten(1000);
340 
341  while (commPort()->waitForReadyRead(1000)) {
342  if (commPort()->canReadLine()) {
343  res = commPort()->readLine(10000);
344 
345  if (qcepDebug(DEBUG_PTC10)) {
346  printMessage(tr("reply:%1").arg(res.trimmed()));
347  }
348 
349  return res;
350  }
351  }
352  }
353 
354  return res;
355 }
356 
357 void QPTC10Device::sendCommand(QString cmd)
358 {
359  if (qcepDebug(DEBUG_PTC10)) {
360  printMessage(tr("cmmnd:%1").arg(cmd));
361  }
362 
363  if (QThread::currentThread() != thread()) {
364  printMessage("Thread error");
365  }
366 
367  if (commPort()) {
368  commPort()->write(qPrintable(cmd+"\n"));
369  commPort()->waitForBytesWritten(1000);
370  }
371 }
372 
373 void QPTC10Device::changeSetPoint(double setPoint)
374 {
375  sendCommand(tr("\"%1.PID.Setpoint\" %2").arg(this->outputChannelName()).arg(setPoint));
376 }
377 
379 {
380  sendCommand(tr("\"%1.PID.Ramp\" %2").arg(this->outputChannelName()).arg(rate/60.0)); // Convert ramp rate to degC/sec
381 }
382 
383 void QPTC10Device::changeProportional(double /*prop*/)
384 {
385 }
386 
387 void QPTC10Device::changeIntegral(double /*integ*/)
388 {
389 }
390 
391 void QPTC10Device::changeDerivative(double /*deriv*/)
392 {
393 }
394 
395 void QPTC10Device::enable(bool on)
396 {
397  QString onStr = (on ? "On" : "Off");
398 
399  printMessage("Outputs "+onStr);
400 
401  sendCommand(tr("outputEnable %1").arg(onStr));
402 }
403 
405 {
406  QString onStr = (on ? "On" : "Off");
407 
408  printMessage("PID Loop "+onStr);
409 
410  sendCommand(tr("\"%1.PID.Mode\" %2").arg(this->outputChannelName()).arg(onStr));
411 }
412 
414 {
415  return true;
416 }
417 
419 {
420 }
421 
423 {
424  QcepDoubleList vals;
426  QDateTime ts(QDateTime::currentDateTime());
427 
428  vals.append(ts.toTime_t());
429  vals.append(ts.date().day());
430  vals.append(ts.time().hour());
431  vals.append(ts.time().minute());
432  vals.append(ts.time().second());
433 
434  if (ctl) {
435  vals.append(ctl->get_Temperature());
436  vals.append(ctl->get_OutputLevel());
437  vals.append(ctl->get_SetPoint());
438  vals.append(ctl->get_RampPoint());
439  } else {
440  vals.append(0);
441  vals.append(0);
442  vals.append(0);
443  vals.append(0);
444  }
445 
446  vals.append(get_ChannelValues());
447 
448  emit graphedChannelValues(vals);
449 }
450 
452 {
453  QcepDoubleList vals;
455  QDateTime ts(QDateTime::currentDateTime());
456 
457  vals.append(ts.toTime_t());
458  vals.append(ts.date().day());
459  vals.append(ts.time().hour());
460  vals.append(ts.time().minute());
461  vals.append(ts.time().second());
462 
463  if (ctl) {
464  vals.append(ctl->get_Temperature());
465  vals.append(ctl->get_OutputLevel());
466  vals.append(ctl->get_SetPoint());
467  vals.append(ctl->get_RampPoint());
468  } else {
469  vals.append(0);
470  vals.append(0);
471  vals.append(0);
472  vals.append(0);
473  }
474 
475  vals.append(get_ChannelValues());
476 
477  emit loggedChannelValues(vals);
478 }
479 
480 void QPTC10Device::ptc10test(QString cmd)
481 {
482  printMessage("PTC10 Test");
483 
484  commPort()->write(qPrintable(cmd+"\n"));
485 
486  while (commPort()->waitForReadyRead(1000)) {
487  if (commPort()->canReadLine()) {
488  break;
489  }
490  }
491 
492  QString r1 = commPort()->readLine(1000);
493 }
QString inputChannelUnits()
QString inputChannelName()
void readoutPolling()
void queryProperty(QString qry, QcepDoubleProperty *property, double scale=1.0)
QPidControllerWPtr controller() const
Definition: qpiddevice.cpp:316
void onInputChannelChanged()
virtual void writeSettings(QSettings *set, QString section)
Definition: qpiddevice.cpp:366
void configurationDialog()
QWeakPointer< QPidController > QPidControllerWPtr
QPidObjectNamer m_ObjectNamer
Definition: qptc10device.h:56
void flushCommandQueue()
Definition: qpiddevice.cpp:472
virtual void readSettings(QSettings *set, QString section)
void graphedChannelValues(QcepDoubleList values)
void readoutInitial()
QSharedPointer< QPidController > QPidControllerPtr
QcepStringList inputChannels
Definition: qptc10device.h:83
void graphedChannelNames(QStringList names)
QString sendQuery(QString cmd)
void onOutputChannelChanged()
void enable(bool on)
void changeDerivative(double deriv)
void parseOutputValues(QString chans)
virtual int canReadLine()
Definition: qpiddevice.cpp:545
void loggedChannelNames(QStringList names)
void updateChannelList()
void changeSetPoint(double setPoint)
void changeRampRate(double rate)
QString outputChannelName()
virtual int waitForReadyRead(int tmout=0)
Definition: qpiddevice.cpp:535
QcepStringList channels
Definition: qptc10device.h:80
virtual void writeSettings(QSettings *set, QString section)
void changeIntegral(double integ)
QString outputChannelUnits()
void parseChannelList(QString chans)
void sendCommand(QString cmd)
QPTC10DeviceDialogPtr m_DeviceDialog
Definition: qptc10device.h:126
QPTC10Device(QPidControllerWPtr ctrl, QcepSettingsSaverWPtr saver, QString deviceName)
QPidCommPortPtr commPort()
Definition: qpiddevice.cpp:121
void onGraphingTimeout()
bool canAutoTune()
QSharedPointer< QPTC10DeviceDialog > QPTC10DeviceDialogPtr
void readoutTimeout()
virtual void readSettings(QSettings *set, QString section)
Definition: qpiddevice.cpp:375
virtual void start()
Definition: qpiddevice.cpp:139
void parseUnitsList(QString chans)
void inputChannelChanged(QString name, QString units)
QSharedPointer< QPTC10Device > QPTC10DevicePtr
virtual void stop()
Definition: qpiddevice.cpp:189
void loopEnable(bool on)
void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())
Definition: qpiddevice.cpp:321
void outputChannelChanged(QString name, QString units)
void changeProportional(double prop)
QcepStringList outputChannels
Definition: qptc10device.h:86
QString deviceName
Definition: qpiddevice.h:133
void ptc10test(QString cmd)
void onLoggingTimeout()
void loggedChannelValues(QcepDoubleList values)