Browse Source

Merge branch 'issue75' into development

Neal Wilson 11 years ago
parent
commit
71251ffa9f
6 changed files with 334 additions and 230 deletions
  1. 3
    3
      config/Windows/offline.xml
  2. 4
    4
      config/Windows/productionroaster.xml
  3. 2
    2
      config/Windows/profilehistory.xml
  4. 33
    31
      src/Typica.pro
  5. 134
    190
      src/typica.w
  6. 158
    0
      src/units.w

+ 3
- 3
config/Windows/offline.xml View File

62
 					QSettings.setValue("script/lastDir", dir(filename));
62
 					QSettings.setValue("script/lastDir", dir(filename));
63
 				}
63
 				}
64
 			});
64
 			});
65
-			var printMenu = findChildObject(this, 'print');			
65
+			var printMenu = findChildObject(this, 'print');
66
 			printMenu.triggered.connect(function() {
66
 			printMenu.triggered.connect(function() {
67
 				var exportWindow = createWindow("print");
67
 				var exportWindow = createWindow("print");
68
 				exportWindow.windowTitle = "Typica - Print";
68
 				exportWindow.windowTitle = "Typica - Print";
91
 			});
91
 			});
92
 			var showC = findChildObject(this, 'showC');
92
 			var showC = findChildObject(this, 'showC');
93
 			showC.triggered.connect(function() {
93
 			showC.triggered.connect(function() {
94
-				log.setDisplayUnits(TemperatureDisplay.Celsius);
94
+				log.setDisplayUnits(Units.Celsius);
95
 				graph.showC();
95
 				graph.showC();
96
 			});
96
 			});
97
 			var showF = findChildObject(this, 'showF');
97
 			var showF = findChildObject(this, 'showF');
98
 			showF.triggered.connect(function() {
98
 			showF.triggered.connect(function() {
99
-				log.setDisplayUnits(TemperatureDisplay.Fahrenheit);
99
+				log.setDisplayUnits(Units.Fahrenheit);
100
 				graph.showF();
100
 				graph.showF();
101
 			});
101
 			});
102
 			var v1 = findChildObject(this, 'ms');
102
 			var v1 = findChildObject(this, 'ms');

+ 4
- 4
config/Windows/productionroaster.xml View File

575
         showC.triggered.connect(function() {
575
         showC.triggered.connect(function() {
576
 			for(var i = 0; i < temperatureDisplays.length; i++)
576
 			for(var i = 0; i < temperatureDisplays.length; i++)
577
 			{
577
 			{
578
-				temperatureDisplays[i].setDisplayUnits(TemperatureDisplay.Celsius);
578
+				temperatureDisplays[i].setDisplayUnits(Units.Celsius);
579
 			}
579
 			}
580
-            log.setDisplayUnits(TemperatureDisplay.Celsius);
580
+            log.setDisplayUnits(Units.Celsius);
581
             graph.showC();
581
             graph.showC();
582
         });
582
         });
583
         var showF = findChildObject(this, 'showF');
583
         var showF = findChildObject(this, 'showF');
584
         showF.triggered.connect(function() {
584
         showF.triggered.connect(function() {
585
 			for(var i = 0; i < temperatureDisplays.length; i++)
585
 			for(var i = 0; i < temperatureDisplays.length; i++)
586
 			{
586
 			{
587
-				temperatureDisplays[i].setDisplayUnits(TemperatureDisplay.Fahrenheit);
587
+				temperatureDisplays[i].setDisplayUnits(Units.Fahrenheit);
588
 			}
588
 			}
589
-            log.setDisplayUnits(TemperatureDisplay.Fahrenheit);
589
+            log.setDisplayUnits(Units.Fahrenheit);
590
             graph.showF();
590
             graph.showF();
591
         });
591
         });
592
 		var clear = findChildObject(this, 'clear');
592
 		var clear = findChildObject(this, 'clear');

+ 2
- 2
config/Windows/profilehistory.xml View File

120
         v7.triggered.connect(log.LOD_1m);
120
         v7.triggered.connect(log.LOD_1m);
121
 		var showC = findChildObject(this, 'showC');
121
 		var showC = findChildObject(this, 'showC');
122
 		showC.triggered.connect(function() {
122
 		showC.triggered.connect(function() {
123
-			log.setDisplayUnits(TemperatureDisplay.Celsius);
123
+			log.setDisplayUnits(Units.Celsius);
124
 			graph.showC();
124
 			graph.showC();
125
 		});
125
 		});
126
 		var showF = findChildObject(this, 'showF');
126
 		var showF = findChildObject(this, 'showF');
127
 		showF.triggered.connect(function() {
127
 		showF.triggered.connect(function() {
128
-			log.setDisplayUnits(TemperatureDisplay.Fahrenheit);
128
+			log.setDisplayUnits(Units.Fahrenheit);
129
 			graph.showF();
129
 			graph.showF();
130
 		});
130
 		});
131
 	]]>
131
 	]]>

+ 33
- 31
src/Typica.pro View File

1
-######################################################################
2
-# Automatically generated by qmake (2.01a) Sat May 23 23:41:13 2009
3
-######################################################################
4
-
5
-QT += script
6
-QT += xml
7
-QT += sql
8
-QT += xmlpatterns
9
-QT += scripttools
10
-QT += webkit
11
-
12
-include(3rdparty/qextserialport/src/qextserialport.pri)
13
-
14
-TEMPLATE = app
15
-TARGET =
16
-DEPENDPATH += .
17
-
18
-# Input
19
-HEADERS += moc_typica.cpp \
20
-    helpmenu.h \
21
-    abouttypica.h
22
-SOURCES += typica.cpp \
23
-    helpmenu.cpp \
24
-    abouttypica.cpp
25
-
26
-RESOURCES += \
27
-    resources.qrc
28
-
29
-RC_FILE = typica.rc
30
-ICON = resources/icons/appicons/logo.icns
31
-QMAKE_INFO_PLIST = resources/Info.plist
1
+######################################################################
2
+# Automatically generated by qmake (2.01a) Sat May 23 23:41:13 2009
3
+######################################################################
4
+
5
+QT += script
6
+QT += xml
7
+QT += sql
8
+QT += xmlpatterns
9
+QT += scripttools
10
+QT += webkit
11
+
12
+include(3rdparty/qextserialport/src/qextserialport.pri)
13
+
14
+TEMPLATE = app
15
+TARGET =
16
+DEPENDPATH += .
17
+
18
+# Input
19
+HEADERS += moc_typica.cpp \
20
+    helpmenu.h \
21
+    abouttypica.h \
22
+    units.h
23
+SOURCES += typica.cpp \
24
+    helpmenu.cpp \
25
+    abouttypica.cpp \
26
+    units.cpp
27
+
28
+RESOURCES += \
29
+    resources.qrc
30
+
31
+RC_FILE = typica.rc
32
+ICON = resources/icons/appicons/logo.icns
33
+QMAKE_INFO_PLIST = resources/Info.plist

+ 134
- 190
src/typica.w View File

5749
 
5749
 
5750
 Measurement times are represented as instances of |QTime|.
5750
 Measurement times are represented as instances of |QTime|.
5751
 
5751
 
5752
-The declaration of |Measurement| is reasonably straightforward. Measurements
5752
+@i units.w
5753
+
5754
+@ We will require the |units.h| header.
5755
+
5756
+@<Header files to include@>=
5757
+#include "units.h"
5758
+
5759
+@ The declaration of |Measurement| is reasonably straightforward. Measurements
5753
 will often be passed around to a number of different objects through the signals
5760
 will often be passed around to a number of different objects through the signals
5754
 and slots mechanism of Qt. The simplest way to make this work is to provide a
5761
 and slots mechanism of Qt. The simplest way to make this work is to provide a
5755
 copy constructor and an assignment operator.
5762
 copy constructor and an assignment operator.
5762
 @<Class declarations@>=
5769
 @<Class declarations@>=
5763
 class Measurement@/
5770
 class Measurement@/
5764
 {
5771
 {
5765
-	public:@/
5766
-		enum TemperatureUnits
5767
-		{
5768
-			Fahrenheit = 10144,
5769
-			Celsius = 10143,
5770
-			Kelvin = 10325,
5771
-			Rankine = 10145
5772
-		};
5773
-	private:@/
5774
-		double theTemperature;
5775
-		QTime theTime;
5776
-		TemperatureUnits unit;
5777
 	public:@;
5772
 	public:@;
5778
 		Measurement(double temperature = 0, QTime time = QTime(),@|
5773
 		Measurement(double temperature = 0, QTime time = QTime(),@|
5779
-		            TemperatureUnits sc = Fahrenheit);
5774
+		            Units::Unit sc = Units::Fahrenheit);
5780
 		Measurement(double temperature);
5775
 		Measurement(double temperature);
5781
 		Measurement(const Measurement &x);
5776
 		Measurement(const Measurement &x);
5782
 		Measurement& operator=(Measurement &x);
5777
 		Measurement& operator=(Measurement &x);
5785
 		QTime time() const;
5780
 		QTime time() const;
5786
 		void setTemperature(double temperature);
5781
 		void setTemperature(double temperature);
5787
 		void setTime(QTime time);
5782
 		void setTime(QTime time);
5788
-		void setUnit(TemperatureUnits scale);
5789
-		TemperatureUnits scale();
5783
+		void setUnit(Units::Unit scale);
5784
+		Units::Unit scale();
5790
 		Measurement toFahrenheit();
5785
 		Measurement toFahrenheit();
5791
 		Measurement toCelsius();
5786
 		Measurement toCelsius();
5792
 		Measurement toKelvin();
5787
 		Measurement toKelvin();
5793
 		Measurement toRankine();
5788
 		Measurement toRankine();
5789
+	private:@/
5790
+		double theTemperature;
5791
+		QTime theTime;
5792
+		Units::Unit unit;
5794
 };
5793
 };
5795
 
5794
 
5796
 @ There are two constructors that can create |Measurement| objects. The
5795
 @ There are two constructors that can create |Measurement| objects. The
5801
 
5800
 
5802
 @<Measurement implementation@>=
5801
 @<Measurement implementation@>=
5803
 Measurement::Measurement(double temperature, QTime time,
5802
 Measurement::Measurement(double temperature, QTime time,
5804
-                         TemperatureUnits sc) :@;
5803
+                         Units::Unit sc) :@;
5805
 	@t\kern2em@>theTemperature(temperature), theTime(time), unit(sc)@;
5804
 	@t\kern2em@>theTemperature(temperature), theTime(time), unit(sc)@;
5806
 {
5805
 {
5807
 	/* Nothing has to be done here. */
5806
 	/* Nothing has to be done here. */
5809
 
5808
 
5810
 Measurement::Measurement(double temperature) :@;
5809
 Measurement::Measurement(double temperature) :@;
5811
 	@t\kern2em@>theTemperature(temperature), theTime(QTime::currentTime()),
5810
 	@t\kern2em@>theTemperature(temperature), theTime(QTime::currentTime()),
5812
-	unit(Fahrenheit)@;
5811
+	unit(Units::Fahrenheit)@;
5813
 {
5812
 {
5814
 	/* Nothing has to be done here. */
5813
 	/* Nothing has to be done here. */
5815
 }@;
5814
 }@;
5884
 method.
5883
 method.
5885
 
5884
 
5886
 @<Measurement implementation@>=
5885
 @<Measurement implementation@>=
5887
-void Measurement::setUnit(TemperatureUnits scale)
5886
+void Measurement::setUnit(Units::Unit scale)
5888
 {
5887
 {
5889
 	unit = scale;
5888
 	unit = scale;
5890
 }
5889
 }
5891
 
5890
 
5892
-Measurement::TemperatureUnits Measurement::scale()
5891
+Units::Unit Measurement::scale()
5893
 {
5892
 {
5894
 	return unit;
5893
 	return unit;
5895
 }
5894
 }
5896
 
5895
 
5897
 @ Four methods create a new |Measurement| from the object the method is called
5896
 @ Four methods create a new |Measurement| from the object the method is called
5898
-on representing the same measurement expressed in different units. The
5899
-conversion formul\ae{} come from Wikipedia.\nfnote{%
5900
-\pdfURL{Temperature Conversion}{%
5901
-http://en.wikipedia.org/%
5902
-w/index.php?title=Temperature_conversion&oldid=226047163}}
5903
-
5904
-The |toFahrenheit()| method converts a measurement to Fahrenheit.
5897
+on representing the same measurement expressed in different units. The value
5898
+conversions are handled in the |Units| class.
5905
 
5899
 
5906
 @<Measurement implementation@>=
5900
 @<Measurement implementation@>=
5907
 Measurement Measurement::toFahrenheit()
5901
 Measurement Measurement::toFahrenheit()
5908
 {
5902
 {
5909
-	switch(unit)
5910
-	{
5911
-		case Celsius:
5912
-			return Measurement(this->temperature() * 9 / 5 + 32, this->time(),
5913
-			                   Fahrenheit);
5914
-			break;
5915
-		case Kelvin:
5916
-			return Measurement(this->temperature() * 5 / 9 - 459.67,
5917
-			                   this->time(), Fahrenheit);
5918
-			break;
5919
-		case Rankine:
5920
-			return Measurement(this->temperature() - 459.67, this->time(),
5921
-			                   Fahrenheit);
5922
-			break;
5923
-		default:
5924
-			return Measurement(this->temperature(), this->time(), Fahrenheit);
5925
-			break;
5926
-	}
5903
+	return Measurement(Units::convertTemperature(this->temperature(),
5904
+	                                             this->unit, Units::Fahrenheit),
5905
+	                   this->time(), Units::Fahrenheit);
5927
 }
5906
 }
5928
 
5907
 
5929
-@ Similarly, the following converts to Celsius.
5930
-
5931
-@<Measurement implementation@>=
5932
 Measurement Measurement::toCelsius()
5908
 Measurement Measurement::toCelsius()
5933
 {
5909
 {
5934
-	switch(unit)
5935
-	{
5936
-		case Fahrenheit:
5937
-			return Measurement((this->temperature() - 32) * 5 / 9, this->time(),
5938
-			                   Celsius);
5939
-			break;
5940
-		case Kelvin:
5941
-			return Measurement(this->temperature() - 273.15, this->time(),
5942
-			                   Celsius);
5943
-			break;
5944
-		case Rankine:
5945
-			return Measurement((this->temperature() - 491.67) * 5 / 9,
5946
-			                   this->time(), Celsius);
5947
-			break;
5948
-		default:
5949
-			return Measurement(this->temperature(), this->time(), Celsius);
5950
-			break;
5951
-	}
5910
+	return Measurement(Units::convertTemperature(this->temperature(),
5911
+	                                             this->unit, Units::Celsius),
5912
+	                   this->time(), Units::Celsius);
5952
 }
5913
 }
5953
 
5914
 
5954
-@ For those who prefer absolute scales, a method is provided to convert to
5955
-Kelvin.
5956
-
5957
-@<Measurement implementation@>=
5958
 Measurement Measurement::toKelvin()
5915
 Measurement Measurement::toKelvin()
5959
 {
5916
 {
5960
-	switch(unit)
5961
-	{
5962
-		case Fahrenheit:
5963
-			return Measurement((this->temperature() + 459.67) * 5 / 9,
5964
-			                   this->time(), Kelvin);
5965
-			break;
5966
-		case Celsius:
5967
-			return Measurement(this->temperature() + 273.15, this->time(),
5968
-			                   Kelvin);
5969
-			break;
5970
-		case Rankine:
5971
-			return Measurement(this->temperature() * 5 / 9, this->time(),
5972
-			                   Kelvin);
5973
-			break;
5974
-		default:
5975
-			return Measurement(this->temperature(), this->time(), Kelvin);
5976
-			break;
5977
-	}
5917
+	return Measurement(Units::convertTemperature(this->temperature(),
5918
+	                                             this->unit, Units::Kelvin),
5919
+	                   this->time(), Units::Kelvin);
5978
 }
5920
 }
5979
 
5921
 
5980
-@ Finally, conversion to Rankine is also allowed.
5981
-
5982
-@<Measurement implementation@>=
5983
 Measurement Measurement::toRankine()
5922
 Measurement Measurement::toRankine()
5984
 {
5923
 {
5985
-	switch(unit)
5986
-	{
5987
-		case Fahrenheit:
5988
-			return Measurement(this->temperature() + 459.67, this->time(),
5989
-			                   Rankine);
5990
-			break;
5991
-		case Celsius:
5992
-			return Measurement((this->temperature() + 273.15) * 9 / 5,
5993
-			                   this->time(), Rankine);
5994
-			break;
5995
-		case Kelvin:
5996
-			return Measurement(this->temperature() * 9 / 5, this->time(),
5997
-			                   Rankine);
5998
-			break;
5999
-		default:
6000
-			return Measurement(this->temperature(), this->time(), Rankine);
6001
-			break;
6002
-	}
5924
+	return Measurement(Units::convertTemperature(this->temperature(),
5925
+	                                             this->unit, Units::Rankine),
5926
+	                   this->time(), Units::Rankine);
6003
 }
5927
 }
6004
 
5928
 
6005
 @** The Main Measurement Pipeline.
5929
 @** The Main Measurement Pipeline.
6068
 class DAQ : public QObject@;@/
5992
 class DAQ : public QObject@;@/
6069
 {@t\1@>@/
5993
 {@t\1@>@/
6070
 	Q_OBJECT@/
5994
 	Q_OBJECT@/
6071
-	Q_ENUMS(TemperatureUnits)@/
6072
 	Q_ENUMS(ThermocoupleType)@;@/
5995
 	Q_ENUMS(ThermocoupleType)@;@/
6073
 	DAQImplementation *imp;@/
5996
 	DAQImplementation *imp;@/
6074
 	@t\4@>private slots@t\kern-3pt@>:@/
5997
 	@t\4@>private slots@t\kern-3pt@>:@/
6080
 		@[Q_INVOKABLE@,@, void@]@, setClockRate(double Hz);@t\2\2@>@/
6003
 		@[Q_INVOKABLE@,@, void@]@, setClockRate(double Hz);@t\2\2@>@/
6081
 		@[Q_INVOKABLE@,@, void@]@, start();@t\2\2@>@/
6004
 		@[Q_INVOKABLE@,@, void@]@, start();@t\2\2@>@/
6082
 		@[Q_INVOKABLE@]@, void stop();
6005
 		@[Q_INVOKABLE@]@, void stop();
6083
-		enum TemperatureUnits@/
6084
-		{
6085
-			@!Fahrenheit = 10144,
6086
-			@!Celsius = 10143,
6087
-			@!Kelvin = 10325,
6088
-			@!Rankine = 10145
6089
-		};
6090
 		enum ThermocoupleType@/
6006
 		enum ThermocoupleType@/
6091
 		{
6007
 		{
6092
 			@!TypeJ = 10072,
6008
 			@!TypeJ = 10072,
6152
 int channels;
6068
 int channels;
6153
 bool ready;
6069
 bool ready;
6154
 QLibrary driver;
6070
 QLibrary driver;
6155
-QVector<Measurement::TemperatureUnits> unitMap;
6071
+QVector<Units::Unit> unitMap;
6156
 
6072
 
6157
 @ Most of the interesting work associated with the |DAQ| class is handled in
6073
 @ Most of the interesting work associated with the |DAQ| class is handled in
6158
 the |measure()| method of |DAQImplementation|. This function will block until a
6074
 the |measure()| method of |DAQImplementation|. This function will block until a
6375
 {
6291
 {
6376
 	Channel *retval = new Channel();
6292
 	Channel *retval = new Channel();
6377
 	imp->channelMap[imp->channels] = retval;
6293
 	imp->channelMap[imp->channels] = retval;
6378
-	imp->unitMap[imp->channels] = (Measurement::TemperatureUnits)units;
6294
+	imp->unitMap[imp->channels] = (Units::Unit)units;
6379
 	imp->channels++;
6295
 	imp->channels++;
6380
 	if(imp->ready)
6296
 	if(imp->ready)
6381
 	{
6297
 	{
6567
 QScriptValue DAQ_newChannel(QScriptContext *context, QScriptEngine *engine);
6483
 QScriptValue DAQ_newChannel(QScriptContext *context, QScriptEngine *engine);
6568
 void setDAQProperties(QScriptValue value, QScriptEngine *engine);
6484
 void setDAQProperties(QScriptValue value, QScriptEngine *engine);
6569
 
6485
 
6570
-@ First we make these functions known to the scripting engine.
6486
+@ First we make these functions known to the scripting engine. We also add
6487
+the values from |Units::Unit| as this was widely used in configurations
6488
+before this enumeration was removed from the |DAQ| class. As these properties
6489
+must be available without an instance, the properties must be added here.
6571
 
6490
 
6572
 @<Set up the scripting engine@>=
6491
 @<Set up the scripting engine@>=
6573
 constructor = engine->newFunction(constructDAQ);
6492
 constructor = engine->newFunction(constructDAQ);
6574
 value = engine->newQMetaObject(&DAQ::staticMetaObject, constructor);
6493
 value = engine->newQMetaObject(&DAQ::staticMetaObject, constructor);
6494
+value.setProperty("Fahrenheit", Units::Fahrenheit);
6495
+value.setProperty("Celsius", Units::Celsius);
6496
+value.setProperty("Kelvin", Units::Kelvin);
6497
+value.setProperty("Rankine", Units::Rankine);
6575
 engine->globalObject().setProperty("DAQ", value);
6498
 engine->globalObject().setProperty("DAQ", value);
6576
 
6499
 
6577
 @ When creating a new |DAQ|, we make sure that it is owned by the script engine.
6500
 @ When creating a new |DAQ|, we make sure that it is owned by the script engine.
7223
 class TemperatureDisplay : public QLCDNumber@/
7146
 class TemperatureDisplay : public QLCDNumber@/
7224
 {@t\1@>@/
7147
 {@t\1@>@/
7225
 	Q_OBJECT@;
7148
 	Q_OBJECT@;
7226
-	Q_ENUMS(DisplayUnits)
7227
 	int unit;
7149
 	int unit;
7228
 	public:@/
7150
 	public:@/
7229
-		enum DisplayUnits
7230
-		{
7231
-			Auto = -1,
7232
-			Fahrenheit = 10144,
7233
-			Celsius = 10143,
7234
-			Kelvin = 10325,
7235
-			Rankine = 10145
7236
-		};
7237
 		TemperatureDisplay(QWidget *parent = NULL);
7151
 		TemperatureDisplay(QWidget *parent = NULL);
7238
 		~TemperatureDisplay();@/
7152
 		~TemperatureDisplay();@/
7239
 	@t\4@>public slots@t\kern-3pt@>:@/
7153
 	@t\4@>public slots@t\kern-3pt@>:@/
7240
 		void setValue(Measurement temperature);
7154
 		void setValue(Measurement temperature);
7241
 		void invalidate();
7155
 		void invalidate();
7242
-		void setDisplayUnits(DisplayUnits scale);@t\2@>@/
7156
+		void setDisplayUnits(Units::Unit scale);@t\2@>@/
7243
 };
7157
 };
7244
 
7158
 
7245
 @ Displaying a temperature is a simple matter of taking the temperature
7159
 @ Displaying a temperature is a simple matter of taking the temperature
7259
 	QString number;
7173
 	QString number;
7260
 	switch(unit)
7174
 	switch(unit)
7261
 	{
7175
 	{
7262
-		case Auto:
7263
-			switch(temperature.scale())
7264
-			{
7265
-				case Fahrenheit:
7266
-					display(QString("%1'F").
7267
-						arg(number.setNum(temperature.temperature(), 'f', 2)));
7268
-					break;
7269
-				case Celsius:
7270
-					display(QString("%1'C").
7271
-						arg(number.setNum(temperature.temperature(), 'f', 2)));
7272
-					break;
7273
-				case Kelvin:
7274
-					display(QString("%1").
7275
-						arg(number.setNum(temperature.temperature(), 'f', 2)));
7276
-					break;
7277
-				case Rankine:
7278
-					display(QString("%1'r").
7279
-						arg(number.setNum(temperature.temperature(), 'f', 2)));
7280
-					break;
7281
-			}
7282
-			break;
7283
-		case Fahrenheit:
7176
+		case Units::Fahrenheit:
7284
 			display(QString("%1'F").
7177
 			display(QString("%1'F").
7285
 				arg(number.setNum(temperature.toFahrenheit().temperature(), 'f',
7178
 				arg(number.setNum(temperature.toFahrenheit().temperature(), 'f',
7286
 				                  2)));
7179
 				                  2)));
7287
 			break;
7180
 			break;
7288
-		case Celsius:
7181
+		case Units::Celsius:
7289
 			display(QString("%1'C").
7182
 			display(QString("%1'C").
7290
 				arg(number.setNum(temperature.toCelsius().temperature(), 'f',
7183
 				arg(number.setNum(temperature.toCelsius().temperature(), 'f',
7291
 				                  2)));
7184
 				                  2)));
7292
 			break;
7185
 			break;
7293
-		case Kelvin:
7186
+		case Units::Kelvin:
7294
 			display(QString("%1").
7187
 			display(QString("%1").
7295
 				arg(number.setNum(temperature.toKelvin().temperature(), 'f',
7188
 				arg(number.setNum(temperature.toKelvin().temperature(), 'f',
7296
 				                  2)));
7189
 				                  2)));
7297
 			break;
7190
 			break;
7298
-		case Rankine:
7191
+		case Units::Rankine:
7299
 			display(QString("%1'r").
7192
 			display(QString("%1'r").
7300
 				arg(number.setNum(temperature.toRankine().temperature(), 'f',
7193
 				arg(number.setNum(temperature.toRankine().temperature(), 'f',
7301
 				                  2)));
7194
 				                  2)));
7302
 			break;
7195
 			break;
7196
+		default:
7197
+			switch(temperature.scale())
7198
+			{
7199
+				case Units::Fahrenheit:
7200
+					display(QString("%1'F").
7201
+						arg(number.setNum(temperature.temperature(), 'f', 2)));
7202
+					break;
7203
+				case Units::Celsius:
7204
+					display(QString("%1'C").
7205
+						arg(number.setNum(temperature.temperature(), 'f', 2)));
7206
+					break;
7207
+				case Units::Kelvin:
7208
+					display(QString("%1").
7209
+						arg(number.setNum(temperature.temperature(), 'f', 2)));
7210
+					break;
7211
+				case Units::Rankine:
7212
+					display(QString("%1'r").
7213
+						arg(number.setNum(temperature.temperature(), 'f', 2)));
7214
+					break;
7215
+			}
7216
+			break;
7303
 	}
7217
 	}
7304
 }
7218
 }
7305
 
7219
 
7315
 
7229
 
7316
 @<TemperatureDisplay Implementation@>=
7230
 @<TemperatureDisplay Implementation@>=
7317
 TemperatureDisplay::TemperatureDisplay(QWidget *parent) :
7231
 TemperatureDisplay::TemperatureDisplay(QWidget *parent) :
7318
-	QLCDNumber(8, parent), unit(Auto)@/
7232
+	QLCDNumber(8, parent), unit(Units::Fahrenheit)@/
7319
 {
7233
 {
7320
 	setSegmentStyle(Filled);
7234
 	setSegmentStyle(Filled);
7321
 	display("---.--'F");
7235
 	display("---.--'F");
7342
 prior to display.
7256
 prior to display.
7343
 
7257
 
7344
 @<TemperatureDisplay Implementation@>=
7258
 @<TemperatureDisplay Implementation@>=
7345
-void TemperatureDisplay::setDisplayUnits(DisplayUnits scale)
7259
+void TemperatureDisplay::setDisplayUnits(Units::Unit scale)
7346
 {
7260
 {
7347
 	unit = scale;
7261
 	unit = scale;
7348
 }
7262
 }
7362
 QScriptValue constructTemperatureDisplay(QScriptContext *context,
7276
 QScriptValue constructTemperatureDisplay(QScriptContext *context,
7363
                                          QScriptEngine *engine);
7277
                                          QScriptEngine *engine);
7364
 void setTemperatureDisplayProperties(QScriptValue value, QScriptEngine *engine);
7278
 void setTemperatureDisplayProperties(QScriptValue value, QScriptEngine *engine);
7279
+QScriptValue TemperatureDisplay_setDisplayUnits(QScriptContext *context,
7280
+                                                QScriptEngine *engine);
7365
 
7281
 
7366
 @ The scripting engine must be informed of this function.
7282
 @ The scripting engine must be informed of this function.
7367
 
7283
 
7385
 void setTemperatureDisplayProperties(QScriptValue value, QScriptEngine *engine)
7301
 void setTemperatureDisplayProperties(QScriptValue value, QScriptEngine *engine)
7386
 {
7302
 {
7387
 	setQLCDNumberProperties(value, engine);
7303
 	setQLCDNumberProperties(value, engine);
7304
+	value.setProperty("setDisplayUnits",
7305
+	                  engine->newFunction(TemperatureDisplay_setDisplayUnits));
7306
+}
7307
+
7308
+@ There seems to be a bad interaction when enumerated value types as used as
7309
+the argument to slot methods called through QtScript. Script code that attempts
7310
+to make use of the enumeration appears to get the value without any type
7311
+information. When attempting to use that value as an argument the meta-object
7312
+system cannot find an appropriate match and the script just hangs silently.
7313
+The solution is to wrap such methods in the script bindings and explicitly cast
7314
+the argument value to the enumerated type. This looks stupid but it works.
7315
+
7316
+@<Functions for scripting@>=
7317
+QScriptValue TemperatureDisplay_setDisplayUnits(QScriptContext *context, QScriptEngine *)
7318
+{
7319
+	TemperatureDisplay *self = getself<@[TemperatureDisplay *@]>(context);
7320
+	self->setDisplayUnits((Units::Unit)argument<int>(0, context));
7321
+	return QScriptValue();
7388
 }
7322
 }
7389
 
7323
 
7390
 @* The MeasurementTimeOffset class.
7324
 @* The MeasurementTimeOffset class.
8202
 		bool saveXML(QIODevice *device);
8136
 		bool saveXML(QIODevice *device);
8203
 		bool saveCSV(QIODevice *device);
8137
 		bool saveCSV(QIODevice *device);
8204
 		QString lastTime(int series);
8138
 		QString lastTime(int series);
8205
-		@[Q_INVOKABLE@,@, int displayUnits()@];@t\2\2@>@/
8139
+		@[Q_INVOKABLE@,@, Units::Unit displayUnits()@];@t\2\2@>@/
8206
 	@[public slots@]:@/
8140
 	@[public slots@]:@/
8207
 		void setVisible(bool visibility);
8141
 		void setVisible(bool visibility);
8208
 		void setHeaderData(int section, QString text);
8142
 		void setHeaderData(int section, QString text);
8220
 		void addOutputTemperatureColumn(int column);
8154
 		void addOutputTemperatureColumn(int column);
8221
 		void addOutputAnnotationColumn(int column);
8155
 		void addOutputAnnotationColumn(int column);
8222
 		void clearOutputColumns();
8156
 		void clearOutputColumns();
8223
-		void setDisplayUnits(int scale);
8157
+		void setDisplayUnits(Units::Unit scale);
8224
 		void addToCurrentColumnSet(int column);
8158
 		void addToCurrentColumnSet(int column);
8225
 		void clearCurrentColumnSet();@/
8159
 		void clearCurrentColumnSet();@/
8226
 	protected:@/
8160
 	protected:@/
8519
 @<ZoomLog Implementation@>=
8453
 @<ZoomLog Implementation@>=
8520
 bool ZoomLog::saveXML(QIODevice *device)
8454
 bool ZoomLog::saveXML(QIODevice *device)
8521
 {
8455
 {
8522
-	int prevUnits = model_ms->displayUnits();
8523
-	if(prevUnits != 10144)
8456
+	Units::Unit prevUnits = model_ms->displayUnits();
8457
+	if(prevUnits != Units::Fahrenheit)
8524
 	{
8458
 	{
8525
-		model_ms->setDisplayUnits(10144);
8459
+		model_ms->setDisplayUnits(Units::Fahrenheit);
8526
 	}
8460
 	}
8527
 	XMLOutput writer(model_ms, device, 0);
8461
 	XMLOutput writer(model_ms, device, 0);
8528
 	int c;
8462
 	int c;
8537
 		                                     toString(), c);
8471
 		                                     toString(), c);
8538
 	}
8472
 	}
8539
 	bool retval = writer.output();
8473
 	bool retval = writer.output();
8540
-	if(prevUnits != 10144)
8474
+	if(prevUnits != Units::Fahrenheit)
8541
 	{
8475
 	{
8542
 		model_ms->setDisplayUnits(prevUnits);
8476
 		model_ms->setDisplayUnits(prevUnits);
8543
 	}
8477
 	}
8620
 possible to obtain the currently selected unit.
8554
 possible to obtain the currently selected unit.
8621
 
8555
 
8622
 @<ZoomLog Implementation@>=
8556
 @<ZoomLog Implementation@>=
8623
-void ZoomLog::setDisplayUnits(int scale)
8557
+void ZoomLog::setDisplayUnits(Units::Unit scale)
8624
 {
8558
 {
8625
 	model_ms->setDisplayUnits(scale);
8559
 	model_ms->setDisplayUnits(scale);
8626
 	model_1s->setDisplayUnits(scale);
8560
 	model_1s->setDisplayUnits(scale);
8631
 	model_1m->setDisplayUnits(scale);
8565
 	model_1m->setDisplayUnits(scale);
8632
 }
8566
 }
8633
 
8567
 
8634
-int ZoomLog::displayUnits()
8568
+Units::Unit ZoomLog::displayUnits()
8635
 {
8569
 {
8636
 	return model_ms->displayUnits();
8570
 	return model_ms->displayUnits();
8637
 }
8571
 }
8743
 QScriptValue ZoomLog_lastTime(QScriptContext *context, QScriptEngine *engine);
8677
 QScriptValue ZoomLog_lastTime(QScriptContext *context, QScriptEngine *engine);
8744
 QScriptValue ZoomLog_saveTemporary(QScriptContext *context,
8678
 QScriptValue ZoomLog_saveTemporary(QScriptContext *context,
8745
                                    QScriptEngine *engnie);
8679
                                    QScriptEngine *engnie);
8680
+QScriptValue ZoomLog_setDisplayUnits(QScriptContext *context,
8681
+                                     QScriptEngine *engine);
8746
 
8682
 
8747
 @ Of these, the global object only needs to know about the constructor.
8683
 @ Of these, the global object only needs to know about the constructor.
8748
 
8684
 
8773
 	value.setProperty("lastTime", engine->newFunction(ZoomLog_lastTime));
8709
 	value.setProperty("lastTime", engine->newFunction(ZoomLog_lastTime));
8774
 	value.setProperty("saveTemporary",
8710
 	value.setProperty("saveTemporary",
8775
 	                  engine->newFunction(ZoomLog_saveTemporary));
8711
 	                  engine->newFunction(ZoomLog_saveTemporary));
8712
+	value.setProperty("setDisplayUnits", engine->newFunction(ZoomLog_setDisplayUnits));
8776
 }
8713
 }
8777
 
8714
 
8778
 @ The functions for saving data are simple wrappers around the corresponding
8715
 @ The functions for saving data are simple wrappers around the corresponding
8873
 	return QScriptValue(engine, self->lastTime(argument<int>(0, context)));
8810
 	return QScriptValue(engine, self->lastTime(argument<int>(0, context)));
8874
 }
8811
 }
8875
 
8812
 
8813
+@ There seems to be a bad interaction when enumerated value types as used as
8814
+the argument to slot methods called through QtScript. Script code that attempts
8815
+to make use of the enumeration appears to get the value without any type
8816
+information. When attempting to use that value as an argument the meta-object
8817
+system cannot find an appropriate match and the script just hangs silently.
8818
+The solution is to wrap such methods in the script bindings and explicitly cast
8819
+the argument value to the enumerated type. This looks stupid but it works.
8820
+
8821
+@<Functions for scripting@>=
8822
+QScriptValue ZoomLog_setDisplayUnits(QScriptContext *context, QScriptEngine *)
8823
+{
8824
+	ZoomLog *self = getself<@[ZoomLog *@]>(context);
8825
+	self->setDisplayUnits((Units::Unit)argument<int>(0, context));
8826
+	return QScriptValue();
8827
+}
8828
+
8876
 @* A model for roasting data.
8829
 @* A model for roasting data.
8877
 
8830
 
8878
 \noindent Qt provides a tool called the model view architecture. This provides a
8831
 \noindent Qt provides a tool called the model view architecture. This provides a
8886
 class MeasurementModel : public QAbstractItemModel@/
8839
 class MeasurementModel : public QAbstractItemModel@/
8887
 {@t\1@>@/
8840
 {@t\1@>@/
8888
 	Q_OBJECT@;
8841
 	Q_OBJECT@;
8889
-	Q_ENUMS(DisplayUnits);
8890
-	int unit;
8842
+	Units::Unit unit;
8891
 	QList<MeasurementList *> *entries;
8843
 	QList<MeasurementList *> *entries;
8892
 	QStringList *hData;
8844
 	QStringList *hData;
8893
 	int colcount;
8845
 	int colcount;
8894
 	QHash<int, int> *lastTemperature;
8846
 	QHash<int, int> *lastTemperature;
8895
 	QList<MeasurementList *>::iterator@, lastInsertion;
8847
 	QList<MeasurementList *>::iterator@, lastInsertion;
8896
 	public:@/
8848
 	public:@/
8897
-		enum DisplayUnits
8898
-		{
8899
-			Auto = -1,
8900
-			Fahrenheit = 10144,
8901
-			Celsius = 10143,
8902
-			Kelvin = 10325,
8903
-			Rankine = 10145
8904
-		};
8905
 		MeasurementModel(QObject *parent = NULL);
8849
 		MeasurementModel(QObject *parent = NULL);
8906
 		~MeasurementModel();
8850
 		~MeasurementModel();
8907
 		int rowCount(const QModelIndex &parent = QModelIndex()) const;
8851
 		int rowCount(const QModelIndex &parent = QModelIndex()) const;
8917
 		QModelIndex index(int row, int column,
8861
 		QModelIndex index(int row, int column,
8918
 							const QModelIndex &parent = QModelIndex()) const;
8862
 							const QModelIndex &parent = QModelIndex()) const;
8919
 		QModelIndex parent(const QModelIndex &index) const;
8863
 		QModelIndex parent(const QModelIndex &index) const;
8920
-		int displayUnits();@/
8864
+		Units::Unit displayUnits();@/
8921
 	@t\4@>public slots@t\kern-3pt@>:@/
8865
 	@t\4@>public slots@t\kern-3pt@>:@/
8922
 		void newMeasurement(Measurement measure, int tempcolumn);
8866
 		void newMeasurement(Measurement measure, int tempcolumn);
8923
 		void newAnnotation(QString annotation, int tempcolumn,
8867
 		void newAnnotation(QString annotation, int tempcolumn,
8924
 							int annotationColumn);
8868
 							int annotationColumn);
8925
 		void clear();
8869
 		void clear();
8926
-		void setDisplayUnits(int scale);
8870
+		void setDisplayUnits(Units::Unit scale);
8927
 	signals:@/
8871
 	signals:@/
8928
 		void rowChanged(int);@t\2@>@/
8872
 		void rowChanged(int);@t\2@>@/
8929
 }@t\kern-3pt@>;
8873
 }@t\kern-3pt@>;
9332
 
9276
 
9333
 @<MeasurementModel Implementation@>=
9277
 @<MeasurementModel Implementation@>=
9334
 MeasurementModel::MeasurementModel(QObject *parent) : QAbstractItemModel(parent),
9278
 MeasurementModel::MeasurementModel(QObject *parent) : QAbstractItemModel(parent),
9335
-	unit(Fahrenheit), hData(new QStringList),
9279
+	unit(Units::Fahrenheit), hData(new QStringList),
9336
 	lastTemperature(new QHash<int, int>)@/
9280
 	lastTemperature(new QHash<int, int>)@/
9337
 {
9281
 {
9338
 	colcount = 1;
9282
 	colcount = 1;
9423
 available to request a number identifyin the currently displayed units.
9367
 available to request a number identifyin the currently displayed units.
9424
 
9368
 
9425
 @<MeasurementModel Implementation@>=
9369
 @<MeasurementModel Implementation@>=
9426
-void MeasurementModel::setDisplayUnits(int scale)
9370
+void MeasurementModel::setDisplayUnits(Units::Unit scale)
9427
 {
9371
 {
9428
 	beginResetModel();
9372
 	beginResetModel();
9429
 	unit = scale;
9373
 	unit = scale;
9430
 	endResetModel();
9374
 	endResetModel();
9431
 }
9375
 }
9432
 
9376
 
9433
-int MeasurementModel::displayUnits()
9377
+Units::Unit MeasurementModel::displayUnits()
9434
 {
9378
 {
9435
 	return unit;
9379
 	return unit;
9436
 }
9380
 }
9475
 				}
9419
 				}
9476
 				switch(unit)
9420
 				switch(unit)
9477
 				{
9421
 				{
9478
-					case Auto:
9479
-					case Fahrenheit:
9422
+					case Units::Fahrenheit:
9480
 						return QVariant(row->at(index.column()).toString());
9423
 						return QVariant(row->at(index.column()).toString());
9481
 						break;
9424
 						break;
9482
-					case Celsius:
9425
+					case Units::Celsius:
9483
 						return QVariant((row->at(index.column()).toDouble() -
9426
 						return QVariant((row->at(index.column()).toDouble() -
9484
 						                32) * 5 / 9);
9427
 						                32) * 5 / 9);
9485
 						break;
9428
 						break;
9486
-					case Kelvin:
9429
+					case Units::Kelvin:
9487
 						return QVariant((row->at(index.column()).toDouble() +
9430
 						return QVariant((row->at(index.column()).toDouble() +
9488
 						                459.67) * 5 / 9);
9431
 						                459.67) * 5 / 9);
9489
 						break;
9432
 						break;
9490
-					case Rankine:
9433
+					case Units::Rankine:
9491
 						return QVariant(row->at(index.column()).toDouble() +
9434
 						return QVariant(row->at(index.column()).toDouble() +
9492
 						                459.67);
9435
 						                459.67);
9493
 						break;
9436
 						break;
9494
 					default:
9437
 					default:
9438
+						return QVariant(row->at(index.column()).toString());
9495
 						break;
9439
 						break;
9496
 				}
9440
 				}
9497
 			}
9441
 			}
17369
 	pvOut = pvOut * 9 / 5 + 32;
17313
 	pvOut = pvOut * 9 / 5 + 32;
17370
 	svOut = svOut * 9 / 5 + 32;
17314
 	svOut = svOut * 9 / 5 + 32;
17371
 }
17315
 }
17372
-Measurement pvm(pvOut, time, Measurement::Fahrenheit);
17373
-Measurement svm(svOut, time, Measurement::Fahrenheit);
17316
+Measurement pvm(pvOut, time, Units::Fahrenheit);
17317
+Measurement svm(svOut, time, Units::Fahrenheit);
17374
 channels.at(0)->input(pvm);
17318
 channels.at(0)->input(pvm);
17375
 channels.at(1)->input(svm);
17319
 channels.at(1)->input(svm);
17376
 
17320
 
17394
 }
17338
 }
17395
 if(!svenabled)
17339
 if(!svenabled)
17396
 {
17340
 {
17397
-	Measurement vm(valueOut, time, Measurement::Fahrenheit);
17341
+	Measurement vm(valueOut, time, Units::Fahrenheit);
17398
 	channels.at(0)->input(vm);
17342
 	channels.at(0)->input(vm);
17399
 }
17343
 }
17400
 else
17344
 else
17401
 {
17345
 {
17402
 	if(readingsv)
17346
 	if(readingsv)
17403
 	{
17347
 	{
17404
-		Measurement pvm(savedpv, time, Measurement::Fahrenheit);
17405
-		Measurement svm(valueOut, time, Measurement::Fahrenheit);
17348
+		Measurement pvm(savedpv, time, Units::Fahrenheit);
17349
+		Measurement svm(valueOut, time, Units::Fahrenheit);
17406
 		channels.at(0)->input(pvm);
17350
 		channels.at(0)->input(pvm);
17407
 		channels.at(1)->input(svm);
17351
 		channels.at(1)->input(svm);
17408
 		readingsv = false;
17352
 		readingsv = false;

+ 158
- 0
src/units.w View File

1
+@* Unit information.
2
+
3
+\noindent As unit information is required in several places, the enumeration
4
+listing these is moved to an external class. This derives from QObject only to
5
+take advantage of the meta-object system. There are no data members, however
6
+there are some convenience methods for working with unit data.
7
+
8
+@(units.h@>=
9
+#include <QObject>
10
+
11
+#ifndef TypicaUnitsIncluded
12
+#define TypicaUnitsIncluded
13
+
14
+class Units: public QObject
15
+{
16
+	Q_OBJECT
17
+	Q_ENUMS(Unit)
18
+	public:
19
+		enum Unit
20
+		{
21
+			Fahrenheit = 10144,
22
+			Celsius = 10143,
23
+			Kelvin = 10325,
24
+			Rankine = 10145
25
+		};
26
+		static double convertTemperature(double value, Unit fromUnit, Unit toUnit);
27
+		static bool isTemperatureUnit(Unit unit);
28
+};
29
+
30
+#endif
31
+
32
+@ Methods are implemented in a separate file.
33
+
34
+@(units.cpp@>=
35
+#include "units.h"
36
+#include "moc_units.cpp"
37
+
38
+@ The |isTemperatureUnit()| method may seem counter-intuitive while the enum
39
+only contains represenations of temperature measurements, but there are plans
40
+to extend this later to extend hardware support to devices that do not directly
41
+measure temperature values and also to support the measurement of properties
42
+that cannot sensibly be represented as temperatures such as fuel pressure and
43
+control settings.
44
+
45
+@(units.cpp@>=
46
+bool Units::isTemperatureUnit(Unit unit)
47
+{
48
+	if(unit == Fahrenheit ||
49
+	   unit == Celsius ||
50
+	   unit == Kelvin ||
51
+	   unit == Rankine)
52
+	{
53
+		return true;
54
+	}
55
+	return false;
56
+}
57
+
58
+@ Temperature conversions can be performed by the |Units| class and should
59
+eliminate the need to have conversion code in multiple places. This method
60
+takes the measurement value, the unit that value is in, and the unit that we
61
+would like to have the measurement converted into. It returns the value as it
62
+would be expressed after unit conversion. A value of 0 is presently returned
63
+if either or both of the units to convert are not temperature units, however
64
+that behavior may change in the future. Any code activating that branch should
65
+be considered flawed.
66
+
67
+@(units.cpp@>=
68
+double Units::convertTemperature(double value, Unit fromUnit, Unit toUnit)
69
+{
70
+	if(isTemperatureUnit(fromUnit) && isTemperatureUnit(toUnit) == false)
71
+	{
72
+		return 0;
73
+	}
74
+	switch(fromUnit)
75
+	{
76
+		case Fahrenheit:
77
+			switch(toUnit)
78
+			{
79
+				case Fahrenheit:
80
+					return value;
81
+					break;
82
+				case Celsius:
83
+					return (value - 32) * 5 / 9;
84
+					break;
85
+				case Kelvin:
86
+					return (value + 459.67) * 5 / 9;
87
+					break;
88
+				case Rankine:
89
+					return value + 459.67;
90
+					break;
91
+			}
92
+			break;
93
+		case Celsius:
94
+			switch(toUnit)
95
+			{
96
+				case Fahrenheit:
97
+					return value * 9 / 5 + 32;
98
+					break;
99
+				case Celsius:
100
+					return value;
101
+					break;
102
+				case Kelvin:
103
+					return value + 273.15;
104
+					break;
105
+				case Rankine:
106
+					return (value + 273.15) * 9 / 5;
107
+					break;
108
+			}
109
+			break;
110
+		case Kelvin:
111
+			switch(toUnit)
112
+			{
113
+				case Fahrenheit:
114
+					return value * 5 / 9 - 459.67;
115
+					break;
116
+				case Celsius:
117
+					return value - 273.15;
118
+					break;
119
+				case Kelvin:
120
+					return value;
121
+					break;
122
+				case Rankine:
123
+					return value * 9 / 5;
124
+					break;
125
+			}
126
+			break;
127
+		case Rankine:
128
+			switch(toUnit)
129
+			{
130
+				case Fahrenheit:
131
+					return value - 457.67;
132
+					break;
133
+				case Celsius:
134
+					return (value - 491.67) * 5 / 9;
135
+					break;
136
+				case Kelvin:
137
+					return value * 5 / 9;
138
+					break;
139
+				case Rankine:
140
+					return value;
141
+					break;
142
+			}
143
+			break;
144
+		default:
145
+			return 0;
146
+			break;
147
+	}
148
+	return 0;
149
+}
150
+
151
+@ This class is exposed to the host environment. Note the lack of constructor.
152
+We do not wish to create any instances, just have access to the |Unit|
153
+enumeration.
154
+
155
+@<Set up the scripting engine@>=
156
+value = engine->newQMetaObject(&Units::staticMetaObject);
157
+engine->globalObject().setProperty("Units", value);
158
+

Loading…
Cancel
Save