<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dev.simantics.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Toni+Kalajainen</id>
	<title>Developer Documents - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://dev.simantics.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Toni+Kalajainen"/>
	<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php/Special:Contributions/Toni_Kalajainen"/>
	<updated>2026-04-05T21:04:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2868</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2868"/>
		<updated>2012-06-27T10:34:42Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* org.simantics.trend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals, see TrendSamplingFormats (all samples, 100ms, 1s, 10s, 60s). The trend detects all available history items for a recorded variable, and selects the most suitable item to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The trends can utilize these fields from a sample format:&lt;br /&gt;
&lt;br /&gt;
  Describes the format of the packed sample. The sample must be a record.&lt;br /&gt;
  The record must have any combination of the following named fields.&lt;br /&gt;
  The field types must one of: byte, integer, long, float, double.&lt;br /&gt;
 &lt;br /&gt;
  time, endTime, value - are mandatory fields.&lt;br /&gt;
 &lt;br /&gt;
  time      -  Region start time, the time of the 1st source sample included into the band &lt;br /&gt;
  endTime   -  Region end time, the time of the last source sample included into the band&lt;br /&gt;
  &lt;br /&gt;
  value     -  First value in the band&lt;br /&gt;
  lastValue -  Last value in the band&lt;br /&gt;
  avg       -  Average value of all included samples&lt;br /&gt;
  median    -  Median value of all samples in the band&lt;br /&gt;
  min       -  Lowest value in the band&lt;br /&gt;
  max       -  Highest value in the band&lt;br /&gt;
  &lt;br /&gt;
  quality   -  0 = Good, -1 = No value&lt;br /&gt;
  count     -  The number of included samples in the band&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2867</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2867"/>
		<updated>2012-06-27T10:32:46Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* org.simantics.trend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals, see TrendSamplingFormats (all samples, 100ms, 1s, 10s, 60s). The trend detects all available history items for a recorded variable, and selects the most suitable item to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
The trends can utilize these fields from a sample format:&lt;br /&gt;
&lt;br /&gt;
  Describes the format of the packed sample. The sample must be a record.&lt;br /&gt;
  The record must have any combination of the following named fields.&lt;br /&gt;
  The field types must one of: byte, integer, long, float, double.&lt;br /&gt;
 &lt;br /&gt;
  time, endTime, value - are mandatory fields.&lt;br /&gt;
 &lt;br /&gt;
  time      -  Region start time, the time of the 1st included sample&lt;br /&gt;
  endTime   -  Region end time, the time of the last included sample&lt;br /&gt;
  &lt;br /&gt;
  value     -  First value in the region&lt;br /&gt;
  lastValue -  Last value in the region&lt;br /&gt;
  avg       -  Average value of all included samples&lt;br /&gt;
  median    -  Median value of all samples in the region&lt;br /&gt;
  min       -  Lowest value in the region&lt;br /&gt;
  max       -  Highest value in the region&lt;br /&gt;
  &lt;br /&gt;
  quality   -  0 = Good, -1 = No value&lt;br /&gt;
  count     -  The number of included samples in the region&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2866</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2866"/>
		<updated>2012-06-27T10:30:02Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals, see TrendSamplingFormats (all samples, 100ms, 1s, 10s, 60s). The trend detects all available history items for a recorded variable, and selects the most suitable item to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2865</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2865"/>
		<updated>2012-06-27T10:29:40Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals, see TrendSamplingFormats (all samples, 100ms, 1s, 10s, 60s). The trend detects all available history items for a recorded variable, and selects the most appropriate item to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2864</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2864"/>
		<updated>2012-06-27T10:29:22Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals, see TrendSamplingFormats (all samples, 100ms, 1s, 10s, 60s). The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2862</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2862"/>
		<updated>2012-06-27T10:28:57Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is one HistoryManager, an interface from [[org.simantics.history]]. History manager consists of groups and items. There is metadata associated with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2860</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2860"/>
		<updated>2012-06-27T10:27:10Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two plug-ins to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the UI plugin that ties trends to the Simantics Workbench environment. It contributes an editor part, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics Workbench. The main class there is its EditorPart contribution TimeSeriesEditor.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. The code in this plugin is environment independent, it can be ran as POJO, EditorPart, ViewPart, or say, Java Applet. The trend visualizations are based on AWT/Swing.&lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed on the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simantics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2856</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2856"/>
		<updated>2012-06-27T10:02:43Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the IU plugin that ties trends to the IDE environment of Eclipse and Simantics. It contributes editorpart, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics IDE. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simantics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2855</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2855"/>
		<updated>2012-06-27T10:02:28Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
Charts is the IU plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. It contributes editorpart, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics IDE.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simantics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2854</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2854"/>
		<updated>2012-06-27T10:01:05Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
This is a UI plugin that contributes editorpart, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics IDE.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simantics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2853</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2853"/>
		<updated>2012-06-27T10:00:51Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Historian.java|Historian]] Historian Interface ([[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryCollector.java|HistoryCollector]]/[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]]).&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
Files are managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Historian historian = History.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;br /&gt;
&lt;br /&gt;
== Collector ==&lt;br /&gt;
Collector is a versatile utility that writes values to history items. The data is read from DataSource interface, and written to HistoryManager. DataSource&#039;s variable is often recorded to multiple HistoryItems with different recording settings. Writing step has three calls: 1)beginStep, 2)setValue() called for each variable, 3)endStep(). Collector has FlushPolicy, either FlushOnEveryStep or NoFlush. Flushing can be invoked manually too with #flush().&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2852</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2852"/>
		<updated>2012-06-27T09:55:07Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* org.simantics.charts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
This is a UI plugin that contributes editorpart, preferences, DnD operations, context menu actions, tool bar buttons, ontology, etc to Simantics IDE.&lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simatics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2851</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2851"/>
		<updated>2012-06-27T09:54:21Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
==org.simantics.charts==&lt;br /&gt;
This is a UI plugin that contributes editorpart, preferences, DnD operations, context menu actions, tool bar buttons, etc to Simantics IDE. &lt;br /&gt;
&lt;br /&gt;
==org.simantics.trend==&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simatics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2850</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2850"/>
		<updated>2012-06-27T09:53:10Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*&#039;&#039;org.simantics.charts&#039;&#039;&lt;br /&gt;
*&#039;&#039;org.simantics.trend&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
org.simantics.trend is a visualization library that draws items as time-series lines. It supports lines and binary items on the same chart. It is the only current chart implementation. &#039;&#039;os.trend&#039;&#039; is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from [[org.simatics.history]]. A trend is configured to visualize items from one history manager. History manager consists of groups and items. There is metadata with each item, such as, id, variableId (the item in datasource), format, deadband, interval, gain, bias, groupId, etc. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Format&#039;&#039;-field determines the sampling format on the disc. All numeric types are supported: integer, float, double, etc. &#039;&#039;time&#039;&#039; and &#039;&#039;value&#039;&#039; fields are mandatory. If endTime exists the sample is interpreted as &amp;quot;value band&amp;quot; instead of a single sample. If &#039;&#039;quality&#039;&#039; field exists, the trend can have empty regions. &#039;&#039;min&#039;&#039; and &#039;&#039;max&#039;&#039; fields provide value deviation when the trend is zoomed out. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2849</id>
		<title>Org.simantics.charts</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.charts&amp;diff=2849"/>
		<updated>2012-06-27T09:47:23Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: Created page with &amp;quot;There are two pluings to Simantics charts:  *org.simantics.charts *org.simantics.trend  Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are two pluings to Simantics charts: &lt;br /&gt;
*org.simantics.charts&lt;br /&gt;
*org.simantics.trend&lt;br /&gt;
&lt;br /&gt;
Charts is the plugin that ties trends to the IDE environment of Eclipse and Simantics. The main class there is its EditorPart contribution TimeSeriesEditor. &lt;br /&gt;
&lt;br /&gt;
org.simantics.trend is a visualization library that draws time-serieses. It supports lines and binary items on the same chart. It is the only current chart implementation. os.trend is environment indipendent. It is installed to Editorpart by os.charts plugin, but it also can be run POJO or attached to, say, ViewPart, or Java Applet. &lt;br /&gt;
&lt;br /&gt;
The data source for a trend is a HistoryManager, an interface from org.simatics.history. A trend is configured to visualize items from one history manager. &lt;br /&gt;
&lt;br /&gt;
Trend is configured with TrendSpec class. It describes how and with what items the trend is drawn. The info can be changed in the run. &lt;br /&gt;
&lt;br /&gt;
In typical simantics case, a variable is recorded with different sampling intervals (see TrendSamplingFormats), example: all samples, 100ms, 1s, 10s, 60s. The trend detects all available history items for a recorded variable, and selects the most appropriate file to draw from.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Plugins&amp;diff=2848</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Plugins&amp;diff=2848"/>
		<updated>2012-06-27T09:34:26Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Database Feature:&lt;br /&gt;
*[[org.simantics.db]]&lt;br /&gt;
*[[org.simantics.db.procore.server]]&lt;br /&gt;
*[[org.simantics.db.tests]]&lt;br /&gt;
*[[org.simantics.objmap]]&lt;br /&gt;
*[[org.simantics.scl]]&lt;br /&gt;
&lt;br /&gt;
Diagram Feature:&lt;br /&gt;
*[[org.simantics.g2d]]&lt;br /&gt;
*[[org.simantics.g2d.feature]]&lt;br /&gt;
*[[org.simantics.diagram]]&lt;br /&gt;
*[[org.simantics.scenegraph]]&lt;br /&gt;
*[[org.simantics.scenegraph.ui]]&lt;br /&gt;
&lt;br /&gt;
Simulation Feature:&lt;br /&gt;
*[[org.simantics.history]]&lt;br /&gt;
&lt;br /&gt;
Browsing Feature:&lt;br /&gt;
*[[org.simantics.browsing.ui.feature]]&lt;br /&gt;
*[[org.simantics.browsing.ui]]&lt;br /&gt;
&lt;br /&gt;
Databoard Feature:&lt;br /&gt;
*[[org.simantics.databoard]]&lt;br /&gt;
&lt;br /&gt;
Project Management Feature:&lt;br /&gt;
* [[org.simantics.project]]&lt;br /&gt;
&lt;br /&gt;
Utility plugins:&lt;br /&gt;
* [[org.simantics.fastlz]]&lt;br /&gt;
* [[org.simantics.wiki]]&lt;br /&gt;
* [[org.simantics.charts]]&lt;br /&gt;
* [[org.simantics.message.feature]]&lt;br /&gt;
* [[org.simantics.message]]&lt;br /&gt;
&lt;br /&gt;
Eclipse IDE Features:&lt;br /&gt;
*[[org.simantics.graph]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Plugins&amp;diff=2846</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Plugins&amp;diff=2846"/>
		<updated>2012-06-27T09:32:22Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Database Feature:&lt;br /&gt;
*[[org.simantics.db]]&lt;br /&gt;
*[[org.simantics.db.procore.server]]&lt;br /&gt;
*[[org.simantics.db.tests]]&lt;br /&gt;
*[[org.simantics.objmap]]&lt;br /&gt;
*[[org.simantics.scl]]&lt;br /&gt;
&lt;br /&gt;
Diagram Feature:&lt;br /&gt;
*[[org.simantics.g2d]]&lt;br /&gt;
*[[org.simantics.g2d.feature]]&lt;br /&gt;
*[[org.simantics.diagram]]&lt;br /&gt;
*[[org.simantics.scenegraph]]&lt;br /&gt;
*[[org.simantics.scenegraph.ui]]&lt;br /&gt;
&lt;br /&gt;
Simulation Feature:&lt;br /&gt;
*[[org.simantics.history]]&lt;br /&gt;
&lt;br /&gt;
Browsing Feature:&lt;br /&gt;
*[[org.simantics.browsing.ui.feature]]&lt;br /&gt;
*[[org.simantics.browsing.ui]]&lt;br /&gt;
&lt;br /&gt;
Databoard Feature:&lt;br /&gt;
*[[org.simantics.databoard]]&lt;br /&gt;
&lt;br /&gt;
Project Management Feature:&lt;br /&gt;
* [[org.simantics.project]]&lt;br /&gt;
&lt;br /&gt;
Utility plugins:&lt;br /&gt;
* [[org.simantics.fastlz]]&lt;br /&gt;
* [[org.simantics.wiki]]&lt;br /&gt;
* [[org.simantics.chart]]&lt;br /&gt;
* [[org.simantics.message.feature]]&lt;br /&gt;
* [[org.simantics.message]]&lt;br /&gt;
&lt;br /&gt;
Eclipse IDE Features:&lt;br /&gt;
*[[org.simantics.graph]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Asm-3.2.jar&amp;diff=2667</id>
		<title>File:Asm-3.2.jar</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Asm-3.2.jar&amp;diff=2667"/>
		<updated>2012-03-06T20:00:33Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Trove-3.0.2.jar&amp;diff=2666</id>
		<title>File:Trove-3.0.2.jar</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Trove-3.0.2.jar&amp;diff=2666"/>
		<updated>2012-03-06T20:00:23Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.databoard&amp;diff=2665</id>
		<title>Org.simantics.databoard</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.databoard&amp;diff=2665"/>
		<updated>2012-03-06T20:00:02Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
Databoard is a software library built upon a simple but well formulated and expressive type system. The design is a compromise of expression power, advanced functions, and performance. In contrast to XML&#039;s rich and uninhibited type system, databoard&#039;s simple and controlled model has enabled more practical features. Besides the norm features &#039;&#039;binary serialization&#039;&#039;, &#039;&#039;human readable type and value notation&#039;&#039;, &#039;&#039;network communication&#039;&#039;, there are also more advanced features such &#039;&#039;class binding&#039;&#039;, &#039;&#039;annotations&#039;&#039;, &#039;&#039;recursion&#039;&#039;, &#039;&#039;type conversion&#039;&#039;, &#039;&#039;value conversions&#039;&#039;, &#039;&#039;value comparisons&#039;&#039;, &#039;&#039;variant types&#039;&#039; and &#039;&#039;random access&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Databoard is simple and has low learning curve. No code generation - User classes. &lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    Rectangle2D rect = new Rectangle2D.Double();&lt;br /&gt;
    Binding binding = Bindings.getBinding( rect.getClass() );&lt;br /&gt;
    Serializer serializer = Binding.getSerializer( binding );&lt;br /&gt;
    byte[] data = serializer.serialize(rect);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Databoard Tutorials]]&lt;br /&gt;
&lt;br /&gt;
=Trunk Development=&lt;br /&gt;
(Requires Simantics Account)&lt;br /&gt;
* [[Databoard Developer Manual|Java Developer Manual]] (0.6.2) ([http://dev.simantics.org/index.php?title=Databoard_Developer_Manual&amp;amp;action=pdfbook&amp;amp;format=single Download])&lt;br /&gt;
* [[Databoard Specification]] (0.6.2) ([http://dev.simantics.org/index.php?title=Databoard_Specification&amp;amp;action=pdfbook&amp;amp;format=single Download])&lt;br /&gt;
* [[svn:foundation/databoard/|SVN]] (0.6.2)&lt;br /&gt;
* [https://www.simulationsite.net/svn/simantics/foundation/databoard/trunk/org.simantics.databoard/doc/changelog.txt Change Log].&lt;br /&gt;
&lt;br /&gt;
=Download Releases=&lt;br /&gt;
&lt;br /&gt;
===Version 0.6.5 (6.3.2012) ===&lt;br /&gt;
* {{Rev|Databoard_Specification|1699|Databoard Specification 0.6.5}}&lt;br /&gt;
* {{Rev|Databoard_Developer_Manual|1703|Databoard Developer manual 0.6.5}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.6.5|SVN 0.6.5]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.5_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.5.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.6.5.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:trove-3.0.2.jar]]  Gnu Trove 3.0.2 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:asm-3.2.jar]] ASM 3.2.2 (Recommended, but optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.6.1 (25.1.2011) ===&lt;br /&gt;
* {{Rev|Databoard_Specification|1699|Databoard Specification 0.6.1}}&lt;br /&gt;
* {{Rev|Databoard_Developer_Manual|1703|Databoard Developer manual 0.6.1}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.6.1|SVN 0.6.1]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.1_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.1.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.6.1.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.5.4 ===&lt;br /&gt;
* {{Rev|Databoard_Specification|7665|Databoard Specification 0.5.4}}&lt;br /&gt;
* {{Rev|databoard_dev|7669|Databoard Developer manual 0.5.4}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.5.4|SVN 0.5.4]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.4_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.4.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.5.4.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.5.2 ===&lt;br /&gt;
* {{Rev|Databoard_Specification|7665|Databoard Specification 0.5.2}}&lt;br /&gt;
* {{Rev|databoard_dev|7669|Databoard Developer manual 0.5.2}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.5.2|SVN 0.5.2]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.2_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.2.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.5.2.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
=Contact=&lt;br /&gt;
* [[User:Toni Kalajainen|Toni Kalajainen]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5_project.zip&amp;diff=2664</id>
		<title>File:Org.simantics.databoard-0.6.5 project.zip</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5_project.zip&amp;diff=2664"/>
		<updated>2012-03-06T19:47:26Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Org.simantics.databoard_0.6.5_src.zip&amp;diff=2663</id>
		<title>File:Org.simantics.databoard 0.6.5 src.zip</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Org.simantics.databoard_0.6.5_src.zip&amp;diff=2663"/>
		<updated>2012-03-06T19:47:25Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5.jar&amp;diff=2662</id>
		<title>File:Org.simantics.databoard-0.6.5.jar</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5.jar&amp;diff=2662"/>
		<updated>2012-03-06T19:47:02Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5.zip&amp;diff=2661</id>
		<title>File:Org.simantics.databoard-0.6.5.zip</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=File:Org.simantics.databoard-0.6.5.zip&amp;diff=2661"/>
		<updated>2012-03-06T19:46:47Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.databoard&amp;diff=2660</id>
		<title>Org.simantics.databoard</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.databoard&amp;diff=2660"/>
		<updated>2012-03-06T19:44:40Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* Download Releases */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
Databoard is a software library built upon a simple but well formulated and expressive type system. The design is a compromise of expression power, advanced functions, and performance. In contrast to XML&#039;s rich and uninhibited type system, databoard&#039;s simple and controlled model has enabled more practical features. Besides the norm features &#039;&#039;binary serialization&#039;&#039;, &#039;&#039;human readable type and value notation&#039;&#039;, &#039;&#039;network communication&#039;&#039;, there are also more advanced features such &#039;&#039;class binding&#039;&#039;, &#039;&#039;annotations&#039;&#039;, &#039;&#039;recursion&#039;&#039;, &#039;&#039;type conversion&#039;&#039;, &#039;&#039;value conversions&#039;&#039;, &#039;&#039;value comparisons&#039;&#039;, &#039;&#039;variant types&#039;&#039; and &#039;&#039;random access&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Databoard is simple and has low learning curve. No code generation - User classes. &lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    Rectangle2D rect = new Rectangle2D.Double();&lt;br /&gt;
    Binding binding = Bindings.getBinding( rect.getClass() );&lt;br /&gt;
    Serializer serializer = Binding.getSerializer( binding );&lt;br /&gt;
    byte[] data = serializer.serialize(rect);&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Databoard Tutorials]]&lt;br /&gt;
&lt;br /&gt;
=Trunk Development=&lt;br /&gt;
(Requires Simantics Account)&lt;br /&gt;
* [[Databoard Developer Manual|Java Developer Manual]] (0.6.2) ([http://dev.simantics.org/index.php?title=Databoard_Developer_Manual&amp;amp;action=pdfbook&amp;amp;format=single Download])&lt;br /&gt;
* [[Databoard Specification]] (0.6.2) ([http://dev.simantics.org/index.php?title=Databoard_Specification&amp;amp;action=pdfbook&amp;amp;format=single Download])&lt;br /&gt;
* [[svn:foundation/databoard/|SVN]] (0.6.2)&lt;br /&gt;
* [https://www.simulationsite.net/svn/simantics/foundation/databoard/trunk/org.simantics.databoard/doc/changelog.txt Change Log].&lt;br /&gt;
&lt;br /&gt;
=Download Releases=&lt;br /&gt;
&lt;br /&gt;
===Version 0.6.5 (6.3.2012) ===&lt;br /&gt;
* {{Rev|Databoard_Specification|1699|Databoard Specification 0.6.5}}&lt;br /&gt;
* {{Rev|Databoard_Developer_Manual|1703|Databoard Developer manual 0.6.5}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.6.5|SVN 0.6.5]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.5_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.5_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.5.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.6.5.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.6.1 (25.1.2011) ===&lt;br /&gt;
* {{Rev|Databoard_Specification|1699|Databoard Specification 0.6.1}}&lt;br /&gt;
* {{Rev|Databoard_Developer_Manual|1703|Databoard Developer manual 0.6.1}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.6.1|SVN 0.6.1]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.6.1_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.1_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.6.1.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.6.1.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.5.4 ===&lt;br /&gt;
* {{Rev|Databoard_Specification|7665|Databoard Specification 0.5.4}}&lt;br /&gt;
* {{Rev|databoard_dev|7669|Databoard Developer manual 0.5.4}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.5.4|SVN 0.5.4]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.4_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.4_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.4.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.5.4.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Version 0.5.2 ===&lt;br /&gt;
* {{Rev|Databoard_Specification|7665|Databoard Specification 0.5.2}}&lt;br /&gt;
* {{Rev|databoard_dev|7669|Databoard Developer manual 0.5.2}}&lt;br /&gt;
* [[svn:foundation/databoard/tags/0.5.2|SVN 0.5.2]]&lt;br /&gt;
* [[Licensing#Eclipse_Public_License|License]] (EPL v1.0)&lt;br /&gt;
* Download Plain Old Java Objects Library (.jar)&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2.zip]] The release&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2.jar]] Library&lt;br /&gt;
**[[Media:org.simantics.databoard-0.5.2_project.zip]] All project files&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.2_src.zip]] Source library&lt;br /&gt;
* Download Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard_0.5.2.jar]] Eclipse plug-in&lt;br /&gt;
**[[Media:org.simantics.databoard.source_0.5.2.jar]] Source plug-in&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:gnu.trove2_2.0.4.jar]]  Gnu Trove 2.0.4 [http://trove4j.sourceforge.net/]&lt;br /&gt;
**&#039;&#039;&#039;Dependency&#039;&#039;&#039; [[Media:org.objectweb.asm_3.1.0.v200803061910.jar]] ASM 3.1.0 (Optional Dependency)&lt;br /&gt;
&lt;br /&gt;
=Contact=&lt;br /&gt;
* [[User:Toni Kalajainen|Toni Kalajainen]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Development_Practices&amp;diff=2452</id>
		<title>Development Practices</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Development_Practices&amp;diff=2452"/>
		<updated>2011-11-08T14:23:06Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Contributing to the Simantics codebase ==&lt;br /&gt;
&lt;br /&gt;
The development of the Simantics platform is coordinated by the &#039;&#039;Simantics Technical Board&#039;&#039;. The Technical Board consists of three to six members that are selected among the THTH Simantics Division member organisations by the Simantics General Meeting. The duties of the Simantics Technical Board are defined in the [https://www.simantics.org/simantics/about-simantics/thth-simantics#thth-simantics-division-rules THTH Simantics Division Rules and Regulations]. &lt;br /&gt;
&lt;br /&gt;
The Simantics Technical Board shall:&lt;br /&gt;
# prepare a proposal for the Management Board for the exact content of the new releases of Simantics&lt;br /&gt;
# prepare a proposal for the Management Board for the content of the training sessions&lt;br /&gt;
# update simantics.org website both public and member areas&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;All contributions made to Simantics modules go through the Simantics Technical Board.&#039;&#039;&#039; The Simantics Technical Board meetings are arranged every week. These meetings are documented in the Simantics ticket management system ([https://www.simantics.org/redmine Redmine]).&lt;br /&gt;
&lt;br /&gt;
== Using version control ==&lt;br /&gt;
&lt;br /&gt;
First things first, read through [http://svn.apache.org/repos/asf/subversion/trunk/doc/user/svn-best-practices.html Subversion best practices].&lt;br /&gt;
&lt;br /&gt;
=== Branching ===&lt;br /&gt;
&lt;br /&gt;
In Simantics, only new major releases may contain breaking changes. Therefore in Simantics we strive to use a specialization of the &#039;&#039;Branch-When-Needed&#039;&#039; system, i.e. &#039;&#039;&#039;Branch-Every-Major-Change&#039;&#039;&#039;. This allows us to keep continuous builds (hudson) working with less disruption, and enables easier pre-release testing, migration and peer review.&lt;br /&gt;
&lt;br /&gt;
The rules are:&lt;br /&gt;
* Users commit their day-to-day work on /trunk.&lt;br /&gt;
* &#039;&#039;&#039;Rule #1&#039;&#039;&#039;: /trunk must compile and pass regression tests at all times. Committers who violate this rule are publically humiliated.&lt;br /&gt;
* &#039;&#039;&#039;Rule #2&#039;&#039;&#039;: a single commit (changeset) must not be so large so as to discourage peer-review.&lt;br /&gt;
* &#039;&#039;&#039;Rule #3&#039;&#039;&#039;: if rules #1 and #2 come into conflict (i.e. it&#039;s impossible to make a series of small commits without disrupting the trunk), then the user should create a branch and commit a series of smaller changesets there. This allows peer-review without disrupting the stability of /trunk.&lt;br /&gt;
* &#039;&#039;&#039;Rule #4&#039;&#039;&#039;: if API is changed, old version in the trunk must be tagged, and version number of the trunk must be increased. If API changes break other trunk code, development must continue in its own branch. Non-incremental change in an ontology is counted as major change (prevents using existing databases); new branch must be created.&lt;br /&gt;
&lt;br /&gt;
;Pros: /trunk is guaranteed to be stable at all times. The hassle of branching/merging is somewhat rare.&lt;br /&gt;
&lt;br /&gt;
The word &#039;&#039;&#039;stable&#039;&#039;&#039; here implies mainly API stability but also functional stability. Functional stability must be enforced through both automatic and manual testing. If there are no test cases, functional stability becomes really hard to enforce. Therefore testing is key. &lt;br /&gt;
&lt;br /&gt;
Violating these rules will result removal of your breaking commits from the SVN.&lt;br /&gt;
&lt;br /&gt;
=== Integrating Branches ===&lt;br /&gt;
We obviously do not want development to continue eternally in branches so that changes are never merged between branches or integrated back to trunk. Branches are usually private or shared between a group of developers that work on a particular task. The process for integration to trunk is as follows:&lt;br /&gt;
* The Simantics Technical Board (&#039;&#039;&#039;STB&#039;&#039;&#039;) and its weekly meetings will be the place for the developers to advertise and present their changes to the board.&lt;br /&gt;
* The following things need to be documented for the changes in some way:&lt;br /&gt;
** The &#039;&#039;&#039;what&#039;&#039;&#039; and &#039;&#039;&#039;why&#039;&#039;&#039; for the changes&lt;br /&gt;
** Migration instructions from previous version (trunk):&lt;br /&gt;
*** A direct patch to fix problems&lt;br /&gt;
*** or plain-text instructions&lt;br /&gt;
** When integration is done, mail must be sent to [mailto:simantics-developers@lists.simantics.org Simantics developers list] about the change.&lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
 TODO more description&lt;br /&gt;
&lt;br /&gt;
=== Versioning ===&lt;br /&gt;
&lt;br /&gt;
In Eclipse/OSGi conventions, components (bundles, plug-ins) are versioned &amp;lt;major&amp;gt;.&amp;lt;minor&amp;gt;.&amp;lt;service&amp;gt;[.&amp;lt;qualifier&amp;gt;].&lt;br /&gt;
&lt;br /&gt;
Our approach to component versioning is as follows:&lt;br /&gt;
* All components are in one of two states: &#039;&#039;&#039;incubation&#039;&#039;&#039; or &#039;&#039;&#039;production&#039;&#039;&#039;&lt;br /&gt;
* Incubation components: &amp;lt;major&amp;gt; = 0, API breakage is allowed between &amp;lt;minor&amp;gt; versions&lt;br /&gt;
* Production components: &amp;lt;major&amp;gt; &amp;amp;ge; 1, API breakage is allowed between &amp;lt;major&amp;gt; versions&lt;br /&gt;
&lt;br /&gt;
== Creating a new plugin ==&lt;br /&gt;
&lt;br /&gt;
Before a release, the plugin is in incubation phase and there are no quality or other requirements. The repository https://www.simulationsite.net/svn/simantics-incubator may be used to share or co-develop the plugin with other developers, but&lt;br /&gt;
the plugin must not be included in the features defined in https://www.simulationsite.net/svn/simantics repository.&lt;br /&gt;
&lt;br /&gt;
If the new plugin is a result of refactoring some already existing plugin into two pieces or otherwise is closely related to an other plugin under development, the new plugin can be committed to the same branch of https://www.simulationsite.net/svn/simantics where the other plugin is developed in. Note that whenever this kind of piecing happens, it has the potential to affect the consistency of other components or products. In such cases the refactor should be carried out in branches, not in trunk.&lt;br /&gt;
&lt;br /&gt;
=== Naming a plugin ===&lt;br /&gt;
&lt;br /&gt;
If the plugin is intended to be part of the official Simantics release, its name should begin with &#039;&#039;org.simantics&#039;&#039; followed by a word that describes the plugin. If the functionality of the same domain is divided into multiple plugins, the name may have more parts. The following suffixes are used:&lt;br /&gt;
* &#039;&#039;.feature&#039;&#039; for feature projects.&lt;br /&gt;
* &#039;&#039;.product&#039;&#039; A plugin defining a product.&lt;br /&gt;
* &#039;&#039;&amp;lt;plugin&amp;gt;.ui&#039;&#039; Provides UI-functionality for &#039;&#039;&amp;lt;plugin&amp;gt;&#039;&#039;. Separating base functionality and UI (that depends on SWT) is usually recommendable so that headless applications do not have unnecessary dependencies.&lt;br /&gt;
** Example: org.simantics.simulation, org.simantics.simulation.ui&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE!&#039;&#039;&#039; If the the UI is light (e.g. wizards, dialogs, renderers, few external dependencies) the UI code can reside in &#039;&#039;&amp;lt;plugin&amp;gt;&#039;&#039;, a separate &#039;&#039;&amp;lt;plugin&amp;gt;.ui&#039;&#039; is not required. In such a case, the UI dependencies (to plugins such as &#039;&#039;org.eclipse.swt&#039;&#039;) are &#039;&#039;optional&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Naming in feature projects ====&lt;br /&gt;
&lt;br /&gt;
Features have two distinct names: &#039;&#039;&#039;project name&#039;&#039;&#039; and &#039;&#039;&#039;feature ID&#039;&#039;&#039;. The &#039;&#039;&#039;project name&#039;&#039;&#039; is defined in the &#039;&#039;.project&#039;&#039; file. It shall contain the &#039;&#039;.feature&#039;&#039; suffix since the project name affects how Eclipse checks the project out into workspaces from version control systems. The &#039;&#039;&#039;feature ID&#039;&#039;&#039; is defined in feature.xml and it shall not contain the &#039;&#039;.feature&#039;&#039; suffix.&lt;br /&gt;
&lt;br /&gt;
This naming convention exists for many reasons:&lt;br /&gt;
* P2 automatically appends &#039;&#039;&#039;.feature.group&#039;&#039;&#039; to to identification of installable units (IU) generated from features. Artifacts with  &#039;&#039;&#039;.feature.feature.group&#039;&#039;&#039; ID tail .&lt;br /&gt;
* Works well with [http://www.eclipse.org/buckminster/ Buckminster] and its [http://wiki.eclipse.org/Buckminster_Resource_Map resource maps].&lt;br /&gt;
&lt;br /&gt;
== Modifying a feature ==&lt;br /&gt;
&lt;br /&gt;
When a plug-in is added to or removed from a feature, the following steps must be performed:&lt;br /&gt;
# Increment the version number of the feature, primarily the service version number part.&lt;br /&gt;
# Increment service version of all other features dependent on this feature&lt;br /&gt;
# Fix .product files that refer to the re-versioned features&lt;br /&gt;
&lt;br /&gt;
This is necessary most of all to keep Eclipse IDE happy and working properly with checked out plug-ins and the P2-based target platforms.&lt;br /&gt;
&lt;br /&gt;
If these steps are not performed, Eclipse will keep using the target platform version of the modified feature not realizing the changes you&#039;ve made to it. This results often in products failing to work properly or not starting at all.&lt;br /&gt;
&lt;br /&gt;
== Publising a standalone plugin ==&lt;br /&gt;
&lt;br /&gt;
# Ensure that the plugin satisfies the following quality requirements:&lt;br /&gt;
#* The plugin contains no compilation errors (against which dependencies???)&lt;br /&gt;
#* All public classes and interfaces are documented (javadoc)&lt;br /&gt;
#* Each public package contains a package-info.java containing package-related comments and annotations (see [http://java.sun.com/docs/books/jls/third_edition/html/packages.html] &#039;&#039;chapter 7.4&#039;&#039;)&lt;br /&gt;
#* examples/&lt;br /&gt;
#* unittests/&lt;br /&gt;
#* Version information&lt;br /&gt;
#* (optional) Build Script (targets: &#039;&#039;clean&#039;&#039;, &#039;&#039;build&#039;&#039;, &#039;&#039;clean-build&#039;&#039;)&lt;br /&gt;
#** [name]_[version]-src.zip&lt;br /&gt;
#** [name]_[version].jar &lt;br /&gt;
#** [name]_[version].zip&lt;br /&gt;
#*** doc/&lt;br /&gt;
#**** manual.pdf&lt;br /&gt;
#**** changelog.txt&lt;br /&gt;
#*** examples/&lt;br /&gt;
#*** unittests/&lt;br /&gt;
#*** javadoc/ (&#039;&#039;optional&#039;&#039;)&lt;br /&gt;
#*** [name]_[version]-src.zip&lt;br /&gt;
#*** [name]_[version].jar&lt;br /&gt;
#** [name]_[version]-project.zip (Contains everything in workspace)&lt;br /&gt;
#** See Example: [[svn:foundation/databoard/trunk/org.simantics.databoard/build2.xml|Non-OSGi]]&lt;br /&gt;
# Create a homepage for the plugin in wiki (for example [[org.simantics.databoard]]) that contains:&lt;br /&gt;
#* Development documentation that is not written in javadoc (basic concepts, components etc.) [We should discuss more about what and how to document] and links to user documentation if the plugin contributes new user interfaces.&lt;br /&gt;
#* Change log&lt;br /&gt;
#* Plugin roadmap&lt;br /&gt;
#* Who are responsible for the plugin&lt;br /&gt;
#* (optional) Download to artifacts created by Build script&lt;br /&gt;
# Commit the plugin to https://www.simulationsite.net/svn/simantics/&amp;lt;moduleName&amp;gt;/trunk&lt;br /&gt;
# Create a tag of the plugin to https://www.simulationsite.net/svn/simantics/&amp;lt;moduleName&amp;gt;/tags/&amp;lt;version&amp;gt;&lt;br /&gt;
# Inform other developers about the new plugin through the mailing list [simantics-developers@simantics.org]. See also [https://www.simantics.org/wiki/index.php/Mailing_Lists Mailing Lists].&lt;br /&gt;
&lt;br /&gt;
=== Including a new plug-in to existing features ===&lt;br /&gt;
&lt;br /&gt;
Inclusion of a plug-in in a feature must always be carefully considered. Consider the following before including anything:&lt;br /&gt;
* &#039;&#039;&#039;Cohesion&#039;&#039;&#039;: Does the plug-in logically belong in the considered feature.xml?&lt;br /&gt;
* &#039;&#039;&#039;Dependencies&#039;&#039;&#039;: What does the new plug-in depend on? Which dependencies are optional? Do the dependencies of the feature&#039;s other plug-ins intersect naturally with those of the new plug-in?&lt;br /&gt;
* &#039;&#039;&#039;Permission&#039;&#039;&#039;: do not add anything without permission from the feature maintainer or send a patch and hope it will be merged.&lt;br /&gt;
&lt;br /&gt;
It is highly recommended to have plug-ins included in a single feature only. Instead of including plug-ins in multiple features, prefer creating highly logical and cohesive features that can acyclically include each other. In general completely new functionality should be put in its own feature. If you are unable to decide where a plug-in should be included, ask yourself is the plug-in properly cohesive, are its dependencies minimal?&lt;br /&gt;
&lt;br /&gt;
Note that it is not technically mandatory that each plug-in only resides in one feature - it is simply good practice and will most likely help in training people to use the platform and also make maintainance easier. Having multiple features including the same plug-in will not break builds, but will make the product structure more difficult to understand.&lt;br /&gt;
&lt;br /&gt;
Modifying a feature may break:&lt;br /&gt;
# [[svn:project-set/|Project sets]]&lt;br /&gt;
#* FIX: add a line in the related PSF file(s) for the new plug-in in all project sets that include the modified feature&lt;br /&gt;
# [http://www.simantics.org/jenkins Jenkins jobs] that depend on the feature&lt;br /&gt;
#* See [[#Building Products]] for instructions on how to define headless product builds&lt;br /&gt;
&lt;br /&gt;
== Releasing a new version of a component == &lt;br /&gt;
&lt;br /&gt;
Here, a component stands for &#039;&#039;a plug-in&#039;&#039;, &#039;&#039;a set of plug-ins&#039;&#039; or &#039;&#039;a feature&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
# Increment version number(s), incl. MANIFEST.MF, plugin.xml, feature.xml, build.xml, homepage.&lt;br /&gt;
#* Bug fixes increment service number, API changes minor number and large releases major number.&lt;br /&gt;
# Run test cases or test suite&lt;br /&gt;
# Check java docs are compiled without errors. Read Javadocs&lt;br /&gt;
# Update homepage&lt;br /&gt;
# (optional) run build.xml and upload generated artifacts to homepage&lt;br /&gt;
# Create SVN tag: trunk/ &amp;amp;rarr; tags/[version]&lt;br /&gt;
# Inform other developers [mailto:simantics-developers@lists.simantics.org Simantics developers list].&lt;br /&gt;
&lt;br /&gt;
== Making refactorizations that affect other plugins ==&lt;br /&gt;
&lt;br /&gt;
# Plan refactorization beforehand with the maintainers of all affected plugins&lt;br /&gt;
# Create a new branch for all affected plugins&lt;br /&gt;
# Refactor, different possibilities&lt;br /&gt;
#* One person refactors all plugins&lt;br /&gt;
#* Every maintainer refactors his/her own plugins&lt;br /&gt;
#** Create rename scripts for other maintainers to help them&lt;br /&gt;
# Check that everything works&lt;br /&gt;
# If changes were large inform other developers in the mailing list&lt;br /&gt;
# Commit plugins to trunk&lt;br /&gt;
&lt;br /&gt;
== Developing and maintaining a released plugin ==&lt;br /&gt;
&lt;br /&gt;
Generally, people need to be able to commit their changes continuously to the SVN location dedicated for a component. Often committing is necessary for transferring their changes to another machine or just to keep their code safe. We can&#039;t allow developers committing API changes or broken temporary code into SVN locations that other projects are using - those need to be stable to some degree. Hence, the active development and API breaking &#039;&#039;&#039;must&#039;&#039;&#039; occur in SVN locations that are documented to be unstable and modifiable only by component maintainer(s). These locations shall be released to the general public according to the roadmap of the component. For every release, a &#039;&#039;tag&#039;&#039; shall be created. For every release external dependencies need to be documented: component name, version to use (tag). Releases are versioned. Version numbers are composed of three (3) segments: 3 integers and a string respectively named major.minor.service. Read [http://wiki.eclipse.org/index.php/Version_Numbering] and [http://wiki.eclipse.org/Evolving_Java-based_APIs].&lt;br /&gt;
&lt;br /&gt;
# the major segment indicates breakage in the API&lt;br /&gt;
# the minor segment indicates &amp;quot;externally visible&amp;quot; changes&lt;br /&gt;
# the service segment indicates bug fixes and the change of development stream (the semantics attached to development stream is new to this proposal, see below) &lt;br /&gt;
&lt;br /&gt;
By default, the following SVN layout should be used for components:&lt;br /&gt;
: component/&lt;br /&gt;
:: trunk/&lt;br /&gt;
:::* The main development branch, unstable by nature. This version should only be used by active developers of this component.&lt;br /&gt;
:: branches/&lt;br /&gt;
:::* Branches should be created:&lt;br /&gt;
:::** when preparing for a release, for stabilizing the component while letting active development run along in &#039;&#039;trunk&#039;&#039;.&lt;br /&gt;
:::** for working on bug-fix releases.&lt;br /&gt;
:::** when working on larger changes, trying out things or working with other developers. These kinds of branches should either be integrated back to where they were branched from or removed as obsolete.&lt;br /&gt;
:: tags/&lt;br /&gt;
:::* Released versions of the component. Other developers and project-sets should be using these for development if the component isn&#039;t already deployed into the target platform or it is necessary to have the code in your workspace for some other reason.&lt;br /&gt;
&lt;br /&gt;
Developers may initially feel that creating tickets for every measly issue is too time consuming but it is necessary to make any kind of change tracking possible for releases. Obviously during the initial development of a component the code changes a lot and all the time. This is exactly why we have an &#039;&#039;incubator&#039;&#039; for starting projects that does not impose these strict rules but is more like a playground where the developer can freely &amp;quot;hack around&amp;quot; disregarding all these policies. A good developer will get started on design, testing and documentation also right from the start. When the developer feels his component is ready for consumption of the general public and the component passes peer review, it shall be ceremonially transferred from incubation into the official project. Each official component should have documentation, unit tests and possibly examples or &#039;&#039;&#039;really good&#039;&#039;&#039; reasons for not having any.&lt;br /&gt;
&lt;br /&gt;
== Modifying the target platform ==&lt;br /&gt;
&lt;br /&gt;
The target platform is a composition of features and plug-ins that contains all the bundles that you as a developer can build your code against when starting from a blank table. It is a mixture of the standard Eclipse RCP platform, other general Eclipse components and also some Simantics components.&lt;br /&gt;
&lt;br /&gt;
It makes sense to deploy into the target platform only if your plug-ins:&lt;br /&gt;
* are general, i.e. reusable by many other components&lt;br /&gt;
* have little dependencies&lt;br /&gt;
* are stable, both by API and functionally&lt;br /&gt;
&lt;br /&gt;
Deploying plug-ins into the target platform will most likely break:&lt;br /&gt;
&lt;br /&gt;
# [http://www.simantics.org/jenkins Headless PDE builds] that depend on the feature&lt;br /&gt;
#* Remove the deployed plug-ins from the plugins/ directory of the build structure to take the deployed plug-ins from the target platform&lt;br /&gt;
#* The target platform(s) used by the builds must be updated&lt;br /&gt;
#* TODO: link to instructions for general hudson and PDE build configuration &lt;br /&gt;
# [[svn:project-set/|Project sets]]&lt;br /&gt;
#* FIX: remove lines matching the plug-ins that were moved into the target platform&lt;br /&gt;
&lt;br /&gt;
=== Deploying plug-ins for the target platform ===&lt;br /&gt;
&lt;br /&gt;
 TODO: these instructions are out-of-date for Simantics 1.4 and the proper use of P2 repositories&lt;br /&gt;
&lt;br /&gt;
;Standard Procedure:&lt;br /&gt;
# Test your deployed components.&lt;br /&gt;
# Read the instructions below and deploy your plug-ins and features as P2 repositories&lt;br /&gt;
# Make your built P2 repository available on the internet and notify the [[Target Platform#Maintainer|target platform maintainer]] to grab your changes and update the official target platform.&lt;br /&gt;
&lt;br /&gt;
There are two main ways of deploying for the target platform:&lt;br /&gt;
* deploying plug-ins and fragments directly&lt;br /&gt;
* deploying plug-ins and fragments through features&lt;br /&gt;
&lt;br /&gt;
These steps can be performed using the Eclipse &#039;&#039;export wizard&#039;&#039; through the &#039;&#039;Plug-in Development/Deployable features&#039;&#039; and &#039;&#039;Plug-in Development/Deployable plug-ins and fragments&#039;&#039; wizards&lt;br /&gt;
&lt;br /&gt;
When considering whether your component should have a feature or not, consider these points:&lt;br /&gt;
* Eclipse products/applications are always made up of either a set of features or a set of plug-ins. In order for someone to use your component in an product, either your features or your plug-ins need to be included somewhere in the product. If a product is using features and you don&#039;t provide one, the product either has to create a new feature and include it or include your plug-ins in his own features.&lt;br /&gt;
* Features can be used as a way to give a collective version all plug-ins of a component. The feature will identify the versions of its included plug-ins but these need not be identical to the feature version. Not all plug-ins have to change versions while a feature version changes each time a new release of the component is made.&lt;br /&gt;
** &#039;&#039;&#039;IMPORTANT&#039;&#039;&#039;: The feature deployment build will produce a &#039;&#039;P2 repository&#039;&#039; containing &#039;&#039;content.jar&#039;&#039;, &#039;&#039;artifacts.jar&#039;&#039; and two directories, &#039;&#039;features/&#039;&#039; and &#039;&#039;plugins/&#039;&#039;. The features-directory will contain the feature as JAR files which is correct when used as a P2 repository. But if you want to install your deployed features into the current target platforms, the feature jars must be unpacked with the JAR file names as the directory names&#039; &#039;&#039;&#039;Don&#039;t unpack directly into the features directory&#039;&#039;&#039;, the feature JARs do not contain a common parent folder. For example, if you&#039;ve built your feature with an ID &#039;&#039;&#039;my.feature&#039;&#039;&#039; and version &#039;&#039;&#039;1.0.0&#039;&#039;&#039;, the build will produce a file &#039;&#039;&#039;my.feature_1.0.0.jar&#039;&#039;&#039;. The contents of this jar must be unpacked into &#039;&#039;&#039;features/my.feature_1.0.0/&#039;&#039;&#039;. If you copied the JAR files into the features directory and unpack them there, &#039;&#039;&#039;do not leave the JARs in the features directory&#039;&#039;&#039;. This will also break the features.&lt;br /&gt;
&lt;br /&gt;
== Building Products ==&lt;br /&gt;
&lt;br /&gt;
The best way to currently build products is to use the Eclipse tool [http://www.eclipse.org/buckminster/ Buckminster] for the job.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Pre-requisites:&lt;br /&gt;
# You have a product configuration (.product file) for your product.&lt;br /&gt;
# Your product configuration is based on &#039;&#039;features&#039;&#039;, not plug-ins&lt;br /&gt;
# Buckminster locally installed or a jenkins installation with buckminster available&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Example&lt;br /&gt;
To create your own (headless) buckminster product build follow these steps:&lt;br /&gt;
# Export [[svn:tutorials/trunk/com.acme.movie.product.site.feature]] as a template for making your own headless buckminster product build.&lt;br /&gt;
# To customize for your purposes, the following contents need to be configured:&lt;br /&gt;
## feature.xml&lt;br /&gt;
##* Change ID, version, name, provider and everything else to match your purposes.&lt;br /&gt;
##* Include all the features your .product file depends on, nothing else.&lt;br /&gt;
## Resources.rmap&lt;br /&gt;
##* Define mappings for all resources (features and plug-ins) needed by your product. See [[#External links|Buckminster definitive guide]] for help on defining resource maps.&lt;br /&gt;
## .credentials.properties&lt;br /&gt;
##* Insert any credentials needed to access resources defined in your resource map.&lt;br /&gt;
## site.cquery&lt;br /&gt;
##* Modify cq:rootRequest name to match your site feature ID.&lt;br /&gt;
## jenkins.buckminster.script&lt;br /&gt;
##* Replace &#039;&#039;&#039;com.acme.movie.product.site&#039;&#039;&#039; with what ever is your site feature&#039;s ID.&lt;br /&gt;
##* Replace p2.profileName with a new profile name for your product.&lt;br /&gt;
##* Replace p2.rootId to match the &#039;&#039;&#039;uid&#039;&#039;&#039; attribute defined in your Product Configuration file (.product).&lt;br /&gt;
##* Set build.label to what ever you want your built product .zip files to be named like.&lt;br /&gt;
&lt;br /&gt;
=== Using Continuous Integration (Jenkins) ===&lt;br /&gt;
&lt;br /&gt;
# Install [http://jenkins-ci.org/ jenkins] (see [http://www.simantics.org/jenkins simantics.org jenkins])&lt;br /&gt;
# Create new &#039;&#039;free-style software project&#039;&#039; job with appropriate name&lt;br /&gt;
# Configure the project:&lt;br /&gt;
## In the &#039;&#039;Source code management&#039;&#039; section, use your version control system of choice to checkout the &#039;&#039;&#039;...product.site.feature&#039;&#039;&#039; you&#039;ve created for your build in the previous section. For the com.acme.movie example the proper settings would be:&lt;br /&gt;
##* Select &#039;&#039;Subversion Modules&#039;&#039;&lt;br /&gt;
##* Repository URL: https://www.simantics.org/svn/simantics/tutorials/trunk/com.acme.movie.product.site.feature&lt;br /&gt;
##* Local Module directory (optional): com.acme.movie.product.site&lt;br /&gt;
##* Check-out strategy: Always check out a fresh copy&lt;br /&gt;
## In the &#039;&#039;Build&#039;&#039; section:&lt;br /&gt;
### Add new &#039;&#039;&#039;Run Buckminster&#039;&#039;&#039; build step&lt;br /&gt;
### Select a Buckminster 3.7 installation to use&lt;br /&gt;
### Copy the contents of &#039;&#039;&#039;jenkins.buckminster.script&#039;&#039;&#039; into the &#039;&#039;commands&#039;&#039; text box&lt;br /&gt;
## Last, you&#039;ll want to archive the vital artifacts produced by your build. In the &#039;&#039;Post-build Actions&#039;&#039; section:&lt;br /&gt;
### Check &#039;&#039;Archive the artifacts&#039;&#039;&lt;br /&gt;
### Set value of &#039;&#039;Files to archive&#039;&#039; to &#039;&#039;&#039;buckminster.output/com.acme.movie.product.site_*-eclipse.feature/*.zip&#039;&#039;&#039; (obviously changing the value according to the name of your product site feature).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That should do it. Further configuration of the build is up to you, i.e. scheduling, parsing warnings, and so on.&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.eclipse.org/buckminster/ Buckminster Homepage]&lt;br /&gt;
* [http://www.eclipse.org/downloads/download.php?file=/tools/buckminster/doc/BuckyBook.pdf Eclipse Buckminster, The Definitive Guide]&lt;br /&gt;
&lt;br /&gt;
[[Category: Miscellaneous Documents]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2366</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2366"/>
		<updated>2011-10-10T12:49:16Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Historian.java|Historian]] Historian Interface ([[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryCollector.java|HistoryCollector]]/[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]]).&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
Files are managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Historian historian = History.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2365</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2365"/>
		<updated>2011-10-10T07:04:43Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Historian.java|Historian]] Historian Interface ([[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryCollector.java|HistoryCollector]]/[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]]).&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Historian historian = History.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2354</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2354"/>
		<updated>2011-09-21T11:04:30Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Historian.java|Historian]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Historian historian = History.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2353</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2353"/>
		<updated>2011-09-21T11:03:54Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Historian.java|Historian]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 Historian historian = Historians.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2351</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2351"/>
		<updated>2011-09-20T13:59:36Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left untouched. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down values of any type. Even arrays, enums, records&lt;br /&gt;
and strings. There is a restriction in the file historian that the data type must be constant sized, e.g. double[3]. Thus variable sized arrays and strings are not supported.&lt;br /&gt;
Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 HistoryManager historian = Historian.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2347</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2347"/>
		<updated>2011-09-19T11:31:12Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin (&#039;&#039;org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 HistoryManager historian = Historian.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2346</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2346"/>
		<updated>2011-09-19T11:30:43Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples|Examples]] Example codes.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 HistoryManager historian = Historian.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2345</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2345"/>
		<updated>2011-09-19T11:30:22Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* File History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example 1.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 HistoryManager historian = Historian.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2344</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2344"/>
		<updated>2011-09-19T11:30:02Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: /* File History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example 1.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 HistoryManager historian = Historian.openFileHistory( workarea );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2343</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2343"/>
		<updated>2011-09-19T11:26:59Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java|SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example 1.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2342</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2342"/>
		<updated>2011-09-19T11:26:49Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription]] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java SamplingFormat]] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example 1.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2341</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2341"/>
		<updated>2011-09-19T11:26:41Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/Subscription.java|Subscription] Subscription configuration&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/SamplingFormat.java SamplingFormat] Sampling format&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example 1.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2340</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2340"/>
		<updated>2011-09-19T11:24:09Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscriptions have globally unique identifier (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2339</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2339"/>
		<updated>2011-09-19T11:21:47Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java|Example1]] Example.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2338</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2338"/>
		<updated>2011-09-19T11:15:17Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Historian Interface.&lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/examples/org/simantics/history/examples/HistoryExample1.java]] Example.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2337</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2337"/>
		<updated>2011-09-19T10:42:11Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Interface.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   quality      : Byte,        // 0-Good, -1=Novalue&lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2336</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2336"/>
		<updated>2011-09-19T10:41:44Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Interface.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive stream entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, there must be quality-field.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
    time         : Long, &lt;br /&gt;
    endTime      : Long,&lt;br /&gt;
    value        : Double,&lt;br /&gt;
    quality      : Byte    // 0 Good, -1 No value&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2334</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2334"/>
		<updated>2011-09-19T06:57:55Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service. &lt;br /&gt;
*[[svn:foundation/trunk/org.simantics.history/src/org/simantics/history/HistoryManager.java|HistoryManager]] Interface.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive steram entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, the value-field must have Optional value.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Optional( Double )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Other value-fields need not be Optional(). &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2333</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2333"/>
		<updated>2011-09-19T06:54:51Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive steram entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, the value-field must have Optional value.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Optional( Double )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Other value-fields need not be Optional(). &lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2332</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2332"/>
		<updated>2011-09-19T06:54:17Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integer      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive steram entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, the value-field must have Optional value.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Optional( Double )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Other value-fields need not be Optional(). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2331</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2331"/>
		<updated>2011-09-19T06:53:10Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integar      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Discontinuity==&lt;br /&gt;
The assumption is that two consecutive steram entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, the value-field must have Optional value.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Optional( Double )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Other value-fields need not be Optional(). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2330</id>
		<title>Org.simantics.history</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Org.simantics.history&amp;diff=2330"/>
		<updated>2011-09-19T06:52:33Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: Created page with &amp;quot;This plugin&amp;#039;&amp;#039;(org.simantics.history&amp;#039;&amp;#039;) contains a library for history service.  == Details ==  HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;. Subsc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This plugin&#039;&#039;(org.simantics.history&#039;&#039;) contains a library for history service.&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
&lt;br /&gt;
HistoryManager manages persistent and stateful objects called &amp;quot;Subscription&amp;quot;.&lt;br /&gt;
Subscription has globally unique id (GUID).&lt;br /&gt;
&lt;br /&gt;
When a subscription is recorded, it is opened and a handle is received. &lt;br /&gt;
To record the user supplies time code and values for each variable. &lt;br /&gt;
  &lt;br /&gt;
A subscription consists of items that describe how a variable is to be recorded&lt;br /&gt;
and stored in a file. For each item: interval, deadband, variableId, enabled, &lt;br /&gt;
and the sample format are provided.  &lt;br /&gt;
&lt;br /&gt;
Sample format describes the format how the data is stored in the stream file, the&lt;br /&gt;
primitive types and fields to record. There is a well-known set of &lt;br /&gt;
fields that the recording supports. Unknown fields are left unchanged. &lt;br /&gt;
Fields &amp;quot;time&amp;quot;, &amp;quot;endTime&amp;quot;, and &amp;quot;value&amp;quot; are mandatory.&lt;br /&gt;
&lt;br /&gt;
 Sample = {&lt;br /&gt;
   // Time&lt;br /&gt;
   time         : Double,      // Time of the first sample (mandatory field) &lt;br /&gt;
   endTime      : Double,      // Time of the last sample (mandatory field)&lt;br /&gt;
  &lt;br /&gt;
   // Values&lt;br /&gt;
   value        : Double,      // First value (mandatory field)  &lt;br /&gt;
   lastValue    : Double,      // Last value &lt;br /&gt;
   avg          : Double,      // Avg value of source valus within the band&#039;s time range&lt;br /&gt;
   median       : Double,      // Median value&lt;br /&gt;
   min          : Double, &lt;br /&gt;
   max          : Double,&lt;br /&gt;
     &lt;br /&gt;
   count        : Integar      // The number of source values acquired &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
One variable is typically subscribed with multiple items. For instance, simantics&lt;br /&gt;
chart subscribes the chart_raw, chart_1s, chart_10s, chart_60s, and chart_min-max &lt;br /&gt;
items. 1s, 10s, and 60s have corresponding interval value (eg. max. 1 entry per 10s of data). &lt;br /&gt;
&amp;quot;min-max&amp;quot; is an subscription item that tracks down the minimum and maximum&lt;br /&gt;
value of the variable. It has infinitely long interval value and thus records&lt;br /&gt;
only one sample (unless there is discontinuation). &lt;br /&gt;
 &lt;br /&gt;
The sample entry is basically a band of values. The entry is packed even if &lt;br /&gt;
deadband and interval are disabled. The system packs the unchanged set of values &lt;br /&gt;
into a single entry. &lt;br /&gt;
&lt;br /&gt;
 Simple = {&lt;br /&gt;
   time         : Double, &lt;br /&gt;
   endTime      : Double,&lt;br /&gt;
   value        : Double&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The system can write down any primitive fields. Even arrays, enums, records&lt;br /&gt;
and strings. Time and endTime fields must be numeric, values not.&lt;br /&gt;
&lt;br /&gt;
 Example1 = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double,&lt;br /&gt;
   avg          : Float&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 VectorSample = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Double[ 3 ]&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Discontinuity==&lt;br /&gt;
The assumption is that two consecutive steram entries describe a data that is sampled &lt;br /&gt;
continuously from the source. If there is non-continuation in the source data or&lt;br /&gt;
if the recording was disabled temporarily, a discontinuation marker is added. &lt;br /&gt;
&lt;br /&gt;
To support discontinuation in the data stream, the value-field must have Optional value.&lt;br /&gt;
&lt;br /&gt;
 Example = {&lt;br /&gt;
   time         : Long, &lt;br /&gt;
   endTime      : Long,&lt;br /&gt;
   value        : Optional( Double )&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Other value-fields need not be Optional(). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==File History==&lt;br /&gt;
&lt;br /&gt;
File based implementation is the only existing implementation. Files are &lt;br /&gt;
managed in workarea (folder). Subscription state and recording metadata is in one &lt;br /&gt;
file, and all subscription items each in a separate file. &lt;br /&gt;
&lt;br /&gt;
 Subscription        -    [SubscriptionId].dbb&lt;br /&gt;
 SubscriptionItem    -    [SubscriptionId]-VariableId-[sampling hash hex]-[sampling name].stm&lt;br /&gt;
&lt;br /&gt;
When a subscription is created, it prepares all related files. If a subscription&lt;br /&gt;
is modified, it reflects to files by deleting and creating new. &lt;br /&gt;
&lt;br /&gt;
An open subscription recording can be closed and opened, the state data is persisted &lt;br /&gt;
when the handle is closed.&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Plugins&amp;diff=2329</id>
		<title>Plugins</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Plugins&amp;diff=2329"/>
		<updated>2011-09-19T06:45:53Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Database Feature:&lt;br /&gt;
*[[org.simantics.db]]&lt;br /&gt;
*[[org.simantics.db.procore.server]]&lt;br /&gt;
*[[org.simantics.db.tests]]&lt;br /&gt;
*[[org.simantics.objmap]]&lt;br /&gt;
*[[org.simantics.scl]]&lt;br /&gt;
&lt;br /&gt;
Diagram Feature:&lt;br /&gt;
*[[org.simantics.g2d]]&lt;br /&gt;
*[[org.simantics.g2d.feature]]&lt;br /&gt;
*[[org.simantics.diagram]]&lt;br /&gt;
*[[org.simantics.scenegraph]]&lt;br /&gt;
*[[org.simantics.scenegraph.ui]]&lt;br /&gt;
&lt;br /&gt;
Simulation Feature:&lt;br /&gt;
*[[org.simantics.history]]&lt;br /&gt;
&lt;br /&gt;
Browsing Feature:&lt;br /&gt;
*[[org.simantics.browsing.ui.feature]]&lt;br /&gt;
*[[org.simantics.browsing.ui]]&lt;br /&gt;
&lt;br /&gt;
Databoard Feature:&lt;br /&gt;
*[[org.simantics.databoard]]&lt;br /&gt;
&lt;br /&gt;
Project Management Feature:&lt;br /&gt;
* [[org.simantics.project]]&lt;br /&gt;
&lt;br /&gt;
Utility plugins:&lt;br /&gt;
* [[org.simantics.fastlz]]&lt;br /&gt;
* [[org.simantics.wiki]]&lt;br /&gt;
* [[org.simantics.message.feature]]&lt;br /&gt;
* [[org.simantics.message]]&lt;br /&gt;
&lt;br /&gt;
Eclipse IDE Features:&lt;br /&gt;
*[[org.simantics.graph]]&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
	<entry>
		<id>https://dev.simantics.org/index.php?title=Databoard_Tutorials&amp;diff=2255</id>
		<title>Databoard Tutorials</title>
		<link rel="alternate" type="text/html" href="https://dev.simantics.org/index.php?title=Databoard_Tutorials&amp;diff=2255"/>
		<updated>2011-09-07T11:17:55Z</updated>

		<summary type="html">&lt;p&gt;Toni Kalajainen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This document contains a some Java coding snippets for Databoard.&lt;br /&gt;
&lt;br /&gt;
==Object Deep-Copy==&lt;br /&gt;
The binding class can be used for cloning objects. All copied objects are deep. Mutable objects are duplicated, and immutable are referenced. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	// Binding can copy objects. All copies are deep. &lt;br /&gt;
	// Mutable objects are duplicated, immutable are referenced.&lt;br /&gt;
		&lt;br /&gt;
	// For instance, in object array, the array is copied, but its&lt;br /&gt;
	// immutable literal instances (e.g. 1) is referenced.&lt;br /&gt;
		&lt;br /&gt;
	Object[] original = new Object[] { 1, &amp;quot;X&amp;quot;, 123.456 };&lt;br /&gt;
	Binding binding = Bindings.getBinding( original.getClass() );&lt;br /&gt;
	Object[] copy = (Object[]) binding.cloneUnchecked( original );&lt;br /&gt;
&lt;br /&gt;
	// Print the objects&lt;br /&gt;
	System.out.println( &amp;quot;Original: &amp;quot;+binding.toString( original ) );&lt;br /&gt;
	System.out.println( &amp;quot;Clone   : &amp;quot;+binding.toString( copy     ) );    &lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recursive classes can also be cloned, but they must be annotated with @Referable tag.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
static @Referable class X {&lt;br /&gt;
	public X reference;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
public static void main(String[] args) throws BindingConstructionException, BindingException {&lt;br /&gt;
	// Create recursive instance&lt;br /&gt;
	X original = new X();&lt;br /&gt;
	original.reference = original;&lt;br /&gt;
		&lt;br /&gt;
	Binding binding = Bindings.getBinding( original.getClass() );&lt;br /&gt;
	X copy = (X) binding.cloneUnchecked( original );&lt;br /&gt;
&lt;br /&gt;
	// Print the objects&lt;br /&gt;
	System.out.println( &amp;quot;Original: &amp;quot;+binding.toString( original ) );&lt;br /&gt;
	System.out.println( &amp;quot;Clone   : &amp;quot;+binding.toString( copy     ) );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Object Deep-Compare==&lt;br /&gt;
Binding can compare any two instances. The compare function is deep.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	Binding binding = Bindings.getBindingUnchecked( int[].class );&lt;br /&gt;
		&lt;br /&gt;
	int[] array1 = new int[] { 1, 2, 3 };&lt;br /&gt;
	int[] array2 = new int[] { 1, 2, 3 };&lt;br /&gt;
	int[] array3 = new int[] { 2, 3, 4 };&lt;br /&gt;
		&lt;br /&gt;
	if ( binding.compare(array1, array2) == 0 ) {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is equal to array2&amp;quot; );&lt;br /&gt;
	} else {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is not equal to array2&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	if ( binding.compare(array1, array3) == 0 ) {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is equal to array3&amp;quot; );&lt;br /&gt;
	} else {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is not equal to array3&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Two bindings can compare instances of same datatype, even if they are of different classes.&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	ArrayList&amp;lt;Integer&amp;gt; array4 = new ArrayList&amp;lt;Integer&amp;gt;();&lt;br /&gt;
	Binding binding2 = Bindings.getBindingUnchecked( ArrayList.class, Integer.class );&lt;br /&gt;
	array4.add( 1 );&lt;br /&gt;
	array4.add( 2 );&lt;br /&gt;
	array4.add( 3 );&lt;br /&gt;
		&lt;br /&gt;
	if ( Bindings.compare(binding, array1, binding2, array4) == 0 ) {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is equal to array4&amp;quot; );&lt;br /&gt;
	} else {&lt;br /&gt;
		System.out.println( &amp;quot;array1 is not equal to array4&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Object deep-hashcode ==&lt;br /&gt;
Binding can calculate deep hashcode for any instance&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxHighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
	Binding binding = Bindings.getBindingUnchecked( int[].class );&lt;br /&gt;
		&lt;br /&gt;
	int[] array1 = new int[] { 1, 2, 3 };&lt;br /&gt;
	int[] array2 = new int[] { 1, 2, 3 };&lt;br /&gt;
	int[] array3 = new int[] { 2, 3, 4 };&lt;br /&gt;
		&lt;br /&gt;
	System.out.println( &amp;quot;Hashcode for array1 is &amp;quot; + binding.hashValue( array1 ) );&lt;br /&gt;
	System.out.println( &amp;quot;Hashcode for array2 is &amp;quot; + binding.hashValue( array2 ) );&lt;br /&gt;
	System.out.println( &amp;quot;Hashcode for array3 is &amp;quot; + binding.hashValue( array3 ) );&lt;br /&gt;
&amp;lt;/syntaxHighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Toni Kalajainen</name></author>
	</entry>
</feed>