Browse Source

Add cooling timer

Neal Wilson 9 years ago
parent
commit
f1e7200353
2 changed files with 131 additions and 0 deletions
  1. 13
    0
      config/Windows/productionroaster.xml
  2. 118
    0
      src/typica.w

+ 13
- 0
config/Windows/productionroaster.xml View File

612
 					scale.open(3);
612
 					scale.open(3);
613
 					window.scales.push(scale);
613
 					window.scales.push(scale);
614
 				}
614
 				}
615
+                                else if(driverReference.driver == "coolingtimer")
616
+                                {
617
+                                    var coolingTimer = new TimerDisplay;
618
+                                    coolingTimer.setDisplayFormat("mm:ss");
619
+                                    var decorator = new WidgetDecorator(coolingTimer, configModel.data(driverIndex, 0), 2);
620
+                                    indicatorPanel.addWidget(decorator);
621
+                                    coolingTimer.setTimerMode(1);
622
+                                    coolingTimer.setAutoReset(true);
623
+                                    var timeValue = new QTime();
624
+                                    timeValue = timeValue.fromString(driverReference.reset, "mm:ss");
625
+                                    coolingTimer.setResetValue(timeValue);
626
+                                    stop.clicked.connect(coolingTimer.startTimer);
627
+                                }
615
 			}
628
 			}
616
 		}
629
 		}
617
 		for(var i = 1; i < tabControls.length; i++)
630
 		for(var i = 1; i < tabControls.length; i++)

+ 118
- 0
src/typica.w View File

10673
         s = nt;
10673
         s = nt;
10674
         emit valueChanged(s);
10674
         emit valueChanged(s);
10675
     }
10675
     }
10676
+} else {
10677
+    stopTimer();
10676
 }
10678
 }
10677
 
10679
 
10678
 @ The clock mode is the simplest case as it just needs to find out if the time
10680
 @ The clock mode is the simplest case as it just needs to find out if the time
10867
 QScriptValue constructTimerDisplay(QScriptContext *context,
10869
 QScriptValue constructTimerDisplay(QScriptContext *context,
10868
                                    QScriptEngine *engine);
10870
                                    QScriptEngine *engine);
10869
 void setTimerDisplayProperties(QScriptValue value, QScriptEngine *engine);
10871
 void setTimerDisplayProperties(QScriptValue value, QScriptEngine *engine);
10872
+QScriptValue TimerDisplay_setTimerMode(QScriptContext *context, QScriptEngine *engine);
10870
 
10873
 
10871
 @ The engine must be informed of the script constructor.
10874
 @ The engine must be informed of the script constructor.
10872
 
10875
 
10888
 void setTimerDisplayProperties(QScriptValue value, QScriptEngine *engine)
10891
 void setTimerDisplayProperties(QScriptValue value, QScriptEngine *engine)
10889
 {
10892
 {
10890
     setQLCDNumberProperties(value, engine);
10893
     setQLCDNumberProperties(value, engine);
10894
+    value.setProperty("setTimerMode", engine->newFunction(TimerDisplay_setTimerMode));
10895
+}
10896
+
10897
+@ A new feature in \pn{} 1.6.4 benefits from having the ability to set the
10898
+timer mode from a script. Rather than exposing the |enum| responsible for this
10899
+to the host environment, a new function is provided to allow integer based
10900
+setting.
10901
+
10902
+@<Functions for scripting@>=
10903
+QScriptValue TimerDisplay_setTimerMode(QScriptContext *context, QScriptEngine *)
10904
+{
10905
+    TimerDisplay *self = getself<TimerDisplay *>(context);
10906
+    if(self)
10907
+    {
10908
+        switch(argument<int>(0, context))
10909
+        {
10910
+            case 0:
10911
+                self->setMode(TimerDisplay::CountUp);
10912
+                break;
10913
+            case 1:
10914
+                self->setMode(TimerDisplay::CountDown);
10915
+                break;
10916
+            case 2:
10917
+                self->setMode(TimerDisplay::Clock);
10918
+                break;
10919
+            default:
10920
+                break;
10921
+        }
10922
+    }
10923
+    return QScriptValue();
10891
 }
10924
 }
10892
 
10925
 
10893
 
10926
 
16004
     @<Add annotation control node inserters@>@;
16037
     @<Add annotation control node inserters@>@;
16005
     addAnnotationControlButton->setMenu(annotationMenu);
16038
     addAnnotationControlButton->setMenu(annotationMenu);
16006
     layout->addWidget(addAnnotationControlButton);
16039
     layout->addWidget(addAnnotationControlButton);
16040
+    
16041
+    QPushButton *timersButton = new QPushButton(tr("Extra Timers"));
16042
+    QMenu *timersMenu = new QMenu;
16043
+    NodeInserter *coolingTimerInserter = new NodeInserter(tr("Cooling Timer"), tr("Cooling Timer"), "coolingtimer");
16044
+    NodeInserter *rangeTimerInserter = new NodeInserter(tr("Range Timer"), tr("Range Timer"), "rangetimer");
16045
+    NodeInserter *multirangeTimerInserter = new NodeInserter(tr("Multi-Range Timer"), tr("Multi-Range Timer"), "multirangetimer");
16046
+    timersMenu->addAction(coolingTimerInserter);
16047
+    timersMenu->addAction(rangeTimerInserter);
16048
+    timersMenu->addAction(multirangeTimerInserter);
16049
+    connect(coolingTimerInserter, SIGNAL(triggered(QString, QString)),
16050
+            this, SLOT(insertChildNode(QString, QString)));
16051
+    connect(rangeTimerInserter, SIGNAL(triggered(QString, QString)),
16052
+            this, SLOT(insertChildNode(QString, QString)));
16053
+    connect(multirangeTimerInserter, SIGNAL(triggered(QString, QString)),
16054
+            this, SLOT(insertChildNode(QString, QString)));
16055
+    timersButton->setMenu(timersMenu);
16056
+    layout->addWidget(timersButton);
16057
+    
16007
     QPushButton *advancedButton = new QPushButton(tr("Advanced Features"));
16058
     QPushButton *advancedButton = new QPushButton(tr("Advanced Features"));
16008
     QMenu *advancedMenu = new QMenu;
16059
     QMenu *advancedMenu = new QMenu;
16009
     NodeInserter *linearsplineinserter = new NodeInserter(tr("Linear Spline Interpolated Series"), tr("Linear Spline Interpolated Series"), "linearspline");
16060
     NodeInserter *linearsplineinserter = new NodeInserter(tr("Linear Spline Interpolated Series"), tr("Linear Spline Interpolated Series"), "linearspline");
16015
     @<Add node inserters to advanced features menu@>@;
16066
     @<Add node inserters to advanced features menu@>@;
16016
     advancedButton->setMenu(advancedMenu);
16067
     advancedButton->setMenu(advancedMenu);
16017
     layout->addWidget(advancedButton);
16068
     layout->addWidget(advancedButton);
16069
+    
16018
     QHBoxLayout *idLayout = new QHBoxLayout;
16070
     QHBoxLayout *idLayout = new QHBoxLayout;
16019
     QLabel *idLabel = new QLabel(tr("Machine ID for database:"));
16071
     QLabel *idLabel = new QLabel(tr("Machine ID for database:"));
16020
     idLayout->addWidget(idLabel);
16072
     idLayout->addWidget(idLabel);
19155
 @<Register device configuration widgets@>=
19207
 @<Register device configuration widgets@>=
19156
 app.registerDeviceConfigurationWidget("linearspline", LinearSplineInterpolationConfWidget::staticMetaObject);
19208
 app.registerDeviceConfigurationWidget("linearspline", LinearSplineInterpolationConfWidget::staticMetaObject);
19157
 
19209
 
19210
+@* Additional Timers.
19211
+
19212
+\noindent \pn{} 1.6.4 adds support for more timer indicators than just the
19213
+default batch timer. Three new timer types are supported. The first is a
19214
+cooling timer. This is a timer that is initially set to 0, but at the end of a
19215
+batch this is set to a configured time and starts counting down. There are no
19216
+data logging requirements and this is purely a convenience feature, but one
19217
+that supports product and personnel safety best practices as it helps to
19218
+eliminate the practice of a person reaching into the cooling tray as it
19219
+agitates to test if the coffee has cooled.
19220
+
19221
+@<Class declarations@>=
19222
+class CoolingTimerConfWidget : public BasicDeviceConfigurationWidget
19223
+{
19224
+    @[Q_OBJECT@]@/
19225
+    public:@/
19226
+        @[Q_INVOKABLE@]@, CoolingTimerConfWidget(DeviceTreeModel *model,
19227
+                                                 const QModelIndex &index);
19228
+    @[private slots@]:@/
19229
+        void updateResetTime(QTime time);
19230
+};
19231
+
19232
+@ The only configurable detail is the vaue the timer should reset to. For this
19233
+a |QTimeEdit| is fine.
19234
+
19235
+@<CoolingTimerConfWidget implementation@>=
19236
+CoolingTimerConfWidget::CoolingTimerConfWidget(DeviceTreeModel *model,
19237
+                                               const QModelIndex &index)
19238
+: BasicDeviceConfigurationWidget(model, index)
19239
+{
19240
+    QHBoxLayout *layout = new QHBoxLayout;
19241
+    QLabel *label = new QLabel(tr("Cooling Time: "));
19242
+    QTimeEdit *editor = new QTimeEdit;
19243
+    editor->setDisplayFormat("mm:ss");
19244
+    @<Get device configuration data for current node@>@;
19245
+    for(int i = 0; i < configData.size(); i++)
19246
+    {
19247
+        node = configData.at(i).toElement();
19248
+        if(node.attribute("name") == "reset")
19249
+        {
19250
+            editor->setTime(QTime::fromString(node.attribute("value"), "mm:ss"));
19251
+        }
19252
+    }
19253
+    updateResetTime(editor->time());
19254
+    connect(editor, SIGNAL(timeChanged(QTime)),
19255
+            this, SLOT(updateResetTime(QTime)));
19256
+    layout->addWidget(label);
19257
+    layout->addWidget(editor);
19258
+    setLayout(layout);
19259
+}
19260
+
19261
+void CoolingTimerConfWidget::updateResetTime(QTime time)
19262
+{
19263
+    updateAttribute("reset", time.toString("mm:ss"));
19264
+}
19265
+
19266
+@ The widget is registered with the configuration system.
19267
+@<Register device configuration widgets@>=
19268
+app.registerDeviceConfigurationWidget("coolingtimer",
19269
+CoolingTimerConfWidget::staticMetaObject);
19270
+
19271
+@ The implementation chunk for now is in the main source file.
19272
+
19273
+@<Class implementations@>=
19274
+@<CoolingTimerConfWidget implementation@>
19275
+
19158
 @* Profile Translation Configuration Widget.
19276
 @* Profile Translation Configuration Widget.
19159
 
19277
 
19160
 \noindent Configuring profile translation requires knowing which column to use
19278
 \noindent Configuring profile translation requires knowing which column to use

Loading…
Cancel
Save