Important: See here for how to use this document and known bugs in the current release.
GraphicsLCD.On(...) and .Off messages.
Get
message that reads a pre-determined number of bytes into an Array.
This is much faster than reading single bytes, one at a time.
Element message allows integer
values of different sizes and different byte ordering to be read out of
a CAN frame. You can read 1, 2 or 4 byte values in big or little
endian format.
CANBus.Debug(1) is an ative variable containing the number of times
the CANBus receiver's circular buffer has overrun.
VM2 serial numbers take this form: nnnn nnn nnnn an, where
n is a digit and a is a letter. If the very
last digit is 2 or higher then that VM2/VM2-D2 requires the new Flash
driver. The new Flash driver is backwards compatible with old builds.
serial.Done message for testing completion of RS-485 output.
Send now returns a boolean success value: 1 on
sucessful sending; 0 if ARP resolution or routing failed.
Status message has changed and its previous functionality now provided by
Valid.
Status message with an earlier version of Venom, you
WILL have to change your code if you upgrade to this or any later version.
Simply replacing Status with Valid will retain the previous functionality of your program.
Print colon options rearranged.
Debug options rearranged.
Address('S') sets NO domain name if none
specified.
Period value defaults to 0 when Get
returns. This is usually what's
needed as the request is likely to be sending or receiving dynamically varying
data, so browsers should never use cached values.
Length message takes an optional 3rd
parameter to request recursion into subdirectories. A pathname with a wildcard
or referring to a directory will no longer descend into subdirectories
unless this parameter is set.
Make syntax for USB devices with non-default
parameters has changed, but since the extra parameters are rarely needed and
were not documented it is unlikely that anyone was using them.
Debug(0) Controls packet Logging to
terminal, and packet logging generally improved to give useful data.
Valid message returns 1 (true) if the link is working and usable, 0 (false) if not.
Status message returns different non-zero values to indicate reason
for lack of connection, such as IP address conflict or DHCP failure.
ErrorAction active variable can be set to 1 to suppress run
time error if an address conflict results from a static IP address assignment. Instead, the new
version of the Status message can be used to check for a conflict.
WiFiLink is now a keyword reserved for future use.
Status returned value includes a new bit to show
USB activity (useful to indicate when cable is disconnected or host has suspended device)
eth.Address('S') (DHCP/DNS server mode) The limited DNS server provided in this mode now responds with approriate error replies to any unsupported request or a request for an unrecognised domain.
Address('S') had several bugs in both the DHCP server and limited DNS server code, making this mode too unreliable to use
for many applications.
fs.Find("") returned 0 instead of 2 (representing root directory) and also left the file system locked.
This.[]Message
This.[^]Message
This.[BaseClass]Message
The functions of the first two forms have been replaced by the new keywords Derived and Base.
The third form has no replacement.
Base.Die
Derived.Die
Make fs FileSystem("flash", cache) where
cache is less than 5k,
The filesystem is created with default (70k) cache size instead of
minimum cache size. This provides better compatibility when upgrading
Venom from versions before 2013 05 16, where this value was typically
set to 1 and used as a boolean "use cache" flag.Value(float) did not skip whitespace.
Parameter.
This may conflict with existing code if you have Parameter as a name.
Parameter() allows you to access the parameters
of a procedure or method by number. The first parameter is Parameter(1), the last
is given by Parameter(ParamCount).
fs.open with a third parameter value
of -3 will creat the directory path to that file if the directories
didn't previously exist
die(1) will destroy the
RAMDISK so it can't be recovered on a subsequent Make
or New. This may be useful during Application development.
Put message.
Instead you can use file.Update (see below) to
update the directory entry when needed.
Connect(2 [,port]) puts the filesystem
into a special file manager mode where it can be controlled via a
serial port. So far the only function available is uploading a file
to the VM2, but renaming, deletion, downloads and file listings are
future possibilities. A Windows command line program is available
to implement the controlling end of the link.
Update brings directory entry up to date
(file size, date and time information) on a single file without
having to close and re-open. This makes a permanent update on Flash
and RAMdisk file systems, and on all file systems it means that
fs.Length(name) and fs.Time(name) will
return updated values for that file.
Find message can take an optional third
parameter to specify case-insensitive search.
XPos and YPos, which read the position of the text cursor
relative to the current TextBox origin.
Is operator can now work with internal Venom
classes, as well as user-defined classes.
Debug(0, file) or Debug(0, 0)
control logging of information about packets received and sent for
any IP-based protocol (TCP, UDP).
Debug(2, file) or
Debug(3, file) controls packet or
event logging for the HTTP Server's TCP connection.
Put(f, 1) where f
is a file allows the file to be sent without using chunked coding,
gaining a small speed increase.
The file must be the only response sent in that HTTP transaction.
Count(name) returns the
number of GET or POST variables matching a name.
Value(1, str) gets the "filename"
part of the resource requested i.e. everything in the path
following the last '/' character.
Value(name, x, n) and
Value(name, str, n) look for the nth
instance of a multiply-defined variable, such as from a form
<SELECT> element with the multiple attribute
set.
Time with no parameters would incorrectly
give a "write protected" error if the file was opened read-only
Printf("%o", dt) where dt is a DateTime
object would sometimes print garbage.
Print eth or
Print eth:2
"sdi2c" for
Application Board 2 (5902) or any similar circuitry using I2C
digital I/O to detect the card, control power and the "busy" LED.
"sd" though the old "fsd" is still accepted.
"mmc" is no longer accepted as the card type is obsolete,
though MMC cards should still work.
This means that any code such as
Make fs FileSystem("sd"...) or
Make fs FileSystem("mmc"...) for the 5902 will have to
change to
Make fs Filesystem("sdi2c")
Sort message flags.
Status message will indicate if the card
is present for either type of hardware.
Compare method. Find may have an optional
4th parameter to pass as a 3rd parameter to the object's
Compare method if needed.
Compare method as an optional
third parameter, enabling different types of comparison to be made for
both Sort and Find.
nil can be used
instead of -1 as a startpos value meaning "use default".
Find can optionally take a character
(i.e. integer) parameter for the value to find, instead of a string
or buffer.
Mapping messages lets you change which ASCII
control character codes are mapped to two-byte escape sequences.
In previous versions PPP escaped ALL control characters and this
behaviour wasn't configurable. Now the default behaviour is to
escape XON and XOFF flow control characters only, but the
Mapping message allows this selection to be changed.
Count message enables different maximum
limits to be configured for number of configuration messages sent before
failing.
Name message.
Also in host mode, ppp.Name(s) where s is
a string object will copy the currently logged in user name to the string.
Debug works with different syntax from
that previously documented (which never worked anyway), enabling you
to specify any file for logging TCP packets sent and received, or for
general TCP event logging.
Debug now works (see "New Features" above)
Find message with optional start position,
options for forward and reverse search, and binary search if the array
is sorted. String search has an "ignore case" option.
Sort will sort arrays of integer,
float and string types into ascending or descending order.
String sort has an "ignore case" option.
Sort message now works on all data types,
including Buffer(Any) where the elements are any user-defined
class with a Compare method.
Sort didn't always sort perfectly,
sometimes leaving a few elements out of place.
TextAnalyser
object could in rare circumstances lead to data corruption in
unpredictable places.
Protect(4, ...) when a
flash file system did not currently exist would create a corrupted file.
ProtAnalyser name change: This built-in type is now called TextAnalyser
as this is a more accurate name.
Timeout message which sets
and returns a timeout value applied to the control and data TCP
connections.
Timeout(1) set or returns the timeout for
retransmitting configure request messages during LCP and IPCP negotiation.
Default is 3 seconds, but some applications benefit from a longer
timeout.
CRCGenerator(16) output was was a bitwise inversion
of the CRC-16-CCITT value which it was supposed to provide;
CRCGenerator('M') for MODBUS CRC was incorrect for
unknown reasons, possibly because it was processing bits in reverse
order. The new algorithm has been verified in a third-party
MODBUS-RTU system.
<<<ID:Embedded text>>>Make and Die processing.
Status(2) returns number of files open.
fs.Flush or
fs.Free in one task while another task was writing to
the same filesystem caused a run time error.
Find message.
MyOBject.[MyBaseClass]MyMethod,Name(2, filename) sets a filename
for downloading dynamically generated content as a filehttp.Match(name, value) where the
value is a fixed string instead of a variable tests a POST or GET
variable for equality with a specific value, returning 1 for a match.
Redirect(url) generates the
appropriate response code, headers and content for a simple redirect
to another page. Typically this would be controlled by a POST or
GET variable received when the page is the target of an
HTML <form> element.
Output(0) enables
arbitrary http headers to be generated by printing them to the http
object. http.Output(1) switches to normal output mode
for sending the HTTP response entity (e.g. HTML text)
On and Off messages
control power to ethernet chip. For systems using a standard
application board but not requiring the ethernet connection, (or not
requiring it all the time), making the ethernet interface and then
switching it off will significantly reduce system power consumption.
Size message can take optional 2nd
parameter 'K', 'M' or 'G' to specify returned value units of
Kilobytes, Megabytes or Gigabytes. On an SDHC card, the combined
size of several files in bytes (the default) can exceed
the limit of 32 bits, and one of these options is necessary for a
meaningful result.
fs.Valid message at some other convenient
time, if time permits.
Unsigned keyword. (Eight-bit arrays are always unsigned;
32-bit arrays are always signed).
FS.Free on FAT32 SD cards is now
faster.
x == y, were not detected
and would cause a runtime error due to badly generated code.
MAKE with DNS and default gateway addresses
parameters didn't apply the DNS and gateway addresses.
Make statement for flash filesystem,
the optional 2nd parameter is now requested cache size,
not just a true/false flag. In code which explicitly sets the parameter
to 1, this will result in a minimal 5k cache being allocated; while
this will work, applications which write large amounts of data
will benefit from changing this to a larger value or omitting it
whereupon it defaults to 70k.
Has. This may conflict with existing code if you have
declared a variable with the name has.
Print eth:2 will print the hostname
supplied for DHCP, if defined
Time message is identical to UDP
Time message and saves having to create a UDP object just
to sync the clock to internet time.
eth.Address('M')
controls multicast reception and transmission.
Address(n) message returns source (n = 0)
or destination (n = 1) address of a received packet.
Valid message returns bits to indicate
connection validity separately in transmit and receive directions.
Mapping will assign file system
directories for finding requested resources as files and for
temporary storage of uploaded files, and by setting to
nil will suppress the searching of the file system for
requested resources and/or forbid the uploading of files.
Has member_name
allows you to check if a user-defined object has a particular member:
If this_object Has XPos
[
]
Find could cause heap corruption,
especially in a multitasking program
Http.Name message returns name of uploaded file.
Connect message waits up to 3 seconds for
link to come up and completes address configuration, returning true on
success. Also the ethernet interface will automatically reconfigure its
address any time the link changes from down to up (e.g. cable
unplugged and replaced)
Task keyword returns the current task (an object).
State is a read-write property of Task
objects that can hold 'state' associated with a single task. It usually
makes sense to set a task's State to an instance of a user-defined Class.
Adjust message now has no effect
on USB and memory card (e.g. SD card) file systems. There was no
pactical use for it on those systems anyway.
Any. This helps with
code development because there are runtime errors thrown on assigning the
wrong type or reading an un-initialised member. It also helps with
maintenance as the purpose of the member is clearer.
Class MyClass
Parser ProtAnalyser
Encoder Shaft
Port SerialPort
; ...
END
The only exceptions to this are Digital and
Analogue: you can specify them but, because in their case the
class name maps to several different internal types, they will be converted
to type Any internally.
Insert a single character into a
text Buffer.
Print for the
RealTimeClock allows an offset (in seconds) to be added to the
printed time and date, using a second format specifier:
Print clock:0:TimeZoneOffset
Find("") or Find("/")
is taken to refer to root directory and therefore returns 2.
Copy will copy from or to a root
directory, specified by an empty string or "/".
Make Ethernet using DHCP will return quickly if
there is no physical link (e.g. cable unplugged) instead of timing
out waiting for server.
GraphicsLCD.FontData message will
now also return the address of the font data.
Value message read a floating
point number it caused Venom2 to crash due to a bug in an internal
text-to-number conversion.
"%+g" where the result
would come out in exponent notation produced incorrect results.
Get message gave runtime error if a directory was
requested; now it returns the directory as a request.
Char is now used as a Venom keyword and
so may not be used as a variable name.
No application code! will be sent
to the terminal.
Char as the type specifier, e.g:
Buffer(Char)
f := fs.Open("file.txt",Char)
b := New Buffer(Char)
b.Put("Initial string")
New, e.g:
Class MyClass
Name New String(50)
; ...
END
The AutoDestruct property is implicit.
Debug(3) := 8, or similar.
Debug(3) := 8, or similar.
Flush message is no longer supported
by a file object.
Flush message to a flash file system
updates directory entries for modified open files, but by default
does not cause the (normally non-volatile) cache blocks to be written to flash.
Addition of a non-zero parameter e.g. fs.Flush(1) will
force the cache to be written to flash memory. For SD and USB file
systems cache flushing is done unconditionally as before.
System.Low message will find
all the VM2 I/0 channels that have not been explicitly set to an I/O state by
your code up to that point, and set them all to 'input pulled low'. This will
help to reduce the current consumed by the VM2, especially when you are using
low power 'STOP' mode (RealTimeClock.Timeout).
Debug(21) to list the states of all I/O channels to find those that
need to be set.
Done value reported during a FileSystem
Adjust operation could be incorrect and show over 100%.
(The Protect command-set may still be used to manage the
application in Flash.)
Protect(4,...) will create a combined
firmware update file (usually given the extension .VFU) that contains both
your application code and the version of Venom that runs it. It may be used
to program VM2s in production, or for remote firmware update.
Protect(6,1) returns the version
number of Venom that compiled the application currently in Flash. Returns -1 if no
application in flash.
fs.Valid(s), where s is a string or text buffer,
checks the string contains a valid file name - i.e. it is not empty and does not
contain illegal characters.
Format(4) sets the
number of pixels between tab positions. When a tab character is printed to
the display the cursor will be moved to the right, to the next tab
position. Tab positions are referenced from the LH side of the TextBox or
the last explicit cursor movement.
MAKE statement
or Address('I') message.
Copy message copies files or directories
(including contents, recursively) from one location to another, in
the same file system or between file systems.
Done message returns estimate of
percentage complete of a Copy, Empty or
Adjust operation running in a separate task.
Find returns 1 for a plain file,
2 for a directory, and as before 0 if no file found matching the name given.
Cookie message fetches or creates a cookie
enabling session persistence.
printf("%-0nd", ...) and
printf("%+07.3f", 0.0) where padding is not implemented correctly.
True in Venom has changed from -1 to +1.
This affects both the value of the keyword True,
and expressions that result in a boolean (True/False) value, such as
x > yx IsFalsesystem.Valid
In rare cases this change may break some code.
The most likely problems will be with code that mistakenly uses
And or Or as a logical operator, and also
(legitimately) relies on a non-zero value meaning 'true', for example:
If Buffer.Count And x > y ; Incorrect
If Buffer.Count AndAlso x > y ; Correct
There may also be a very small number of cases where code relies on a True/False result having the numerical value 0 or -1, or uses this result in a further mathematical operation.
DateTime and RealTimeClock objects using custom
date and time formatting codes, for example
Print clock : "h:mmaa <on> dddd <the> do MMMM yyyy"
3:05pm on Wednesday the 11th April 2012
List Class will list all user defined classes in an inheritance tree.
Put message accepts buffers of 8 bit
integers or text (256 elements maximum) and arrays of 8 bit integers,
in addition to single integers and strings.
Flush message would update the modification date/time in the
file's directory entry even if the file was unmodified. It now only does
this if the file has actually been modified.
TextBlock
can now have any case. E.g. you can use textblock end.
Explicit termination strings remain case-sensitive.
%I
will show an integer value as an IP address in conventional
dotted-quad notation like 192.168.1.14.
Class obj : classname has been removed.
Get, Put and Queue messages to
enable encryption of data in files or communication links.
GraphicsLCD.Bitmap can now plot
Windows Bitmap format (.BMP) files directly from the Flash Filesystem. Only
the 24- and 32- bits-per-pixel formats are supported. The 32 bpp format has
an 'alpha channel' (i.e. multi-bit transparency), and so renders rounded
buttons, etc, more accurately. There are button-generating websites that
will generate PNG files for many button styles. These may be converted into
32-bit bitmap bitmap images with an alpha channel
(ARGB) using utilities such as Pixelformer.
y := +x) no longer causes compilation errors.
.Die to an instance of a
Class, the .Die message will now only be passed on to
sub-objects that have the AutoDestruct attribute (see below).
Also, any parameters to .Die are ignored.
Class MyClass
Global lcd, touch ; List globals that are allowed, or use ALL.
...
TO method
; 'lcd' and 'touch' are declared Global above.
lcd.Pen
evt := touch.Event
; 'clock' is declared global here.
t := Global.clock.Time
END
END
This,
i.e: This.[BaseClass]msg, or when asserting 'Class-default'
messages, i.e: AnyObj.[Class]msg.
AutoDestruct may be
applied to members of Classes that refer to other objects. It means that
the Class-default Die message should automatically pass on a
.Die message to this member.
For example:
MyList Any AutoDestruct ; Remove this on Die
[^] means 'use the message in the inherited (base) class', so
you don't have to specify the class name explicity.
For example:
This.[^]message
Count message is now synonymous with
the Length message for Buffers and Arrays.
.Die, AutoDestruct, etc.). This
used to happen when a Buffer of Any or an instance of a user-defined
Class held a 'circular' reference back to itself. Similarly, the
default PRINT for such an object will no longer risk unlimited
recursion.
IS
and Global have been introduced. If you have used these
as variable names then you will need to ammend your code.
Run, Reset,
Debug, PrintF, Protect.
DECLARE: due for removal because it has been superceded
by the Code Analysis tool in VenomIDE.
This,
or the new operator Global.
Pre-defined Venom message names, such as Put, Get, Reset, Count,
etc may now be used for variable names (local or global).
Also, This is no longer required to refer
to a member of the Class. You can use the member name alone and
it will resolve to This.membername. The keyword
This is now only necessary in these circumstances:
This.[inheritance]membername
This in START. This feature allows powerful
constructions, including user-defined objects that run in their
own task.
IS, has been introduced. IS will return
TRUE if the preceding expression either is, or
inherits, the named class. For example:
IF obj IS MyClass
[
...
]
Asserted and
Event together and they won't interfere.
Assignment, TextBlock and
Any have been introduced. If you have used these as
variable names then you will need to ammend your code.
Any where Nil was used before.
E.g:buffer_of_any := NEW Buffer(Any).
#UNDEF instead.
Int, Float, String in any
place where a 'prototype' value is required, for example when making
an Array or Buffer. The Int keyword may be followed
with the qualifiers 8, 16 or 32 to indicate the size (in bits) of
the datatype being specified, e.g. Int 16. The type
Int by itself is equivalent to Int 32.
The type name Any is used to indicate any type.
"This is a quoted string" ; Comment"This is another""This is a quoted stringThis is another"#UNDEF will remove an existing macro definition.
#REDEFINE does exactly the same as
#DEFINE, except that doesn't give a warning if the
definition has changed.
This from known members or
methods (i.e. those already defined in the current Class or
inherited from a base Class). However, you can force the compiler to
send a message to a derived Class by delaying message
resolution until runtime. The syntax for this uses empty square
brackets:
This.[]Message
@.'.
MessageRef := @.MessageNameobject.!(MessageRef)(Parameters)Class. This means that the member's value is
constrained to be an object of a type defined by Class.
Class XYString
XPos Int
YPos Int
str String ;The following messages are redirected to 'str':
.Put
.Get
.Print
.AcceptPrintJob
.Empty
.Find
END
PRINT/PrintF commands
within Print methods send text to the output stream that was opened
(explicitly or implicitly) by the calling code.
Ip.Time to see if a network is connected by trying to
get a response from any node.
On or
Off message caused a system crash.
fs.Valid(n) was leaving file system locked.
PRINT TO or Put with a TCP
object was not causing a run time error when the connection was closed or in
the "listening" state.
Class, This,
ParamCount, Initialise, AcceptPrintJob.
[]. The new keyword
ParamCount gives the number of parameters actually
supplied.
Terminal>Settings dialogue in
VenomIDE.
eth.Address('A') is a synonym for
eth.Address("DHCP") (mnemonic: "Automatic")
PRINT and Printf("%g", ...) were adding trailing
zeros to digits after the decimal point.
Buffer.Empty(TRUE)
Array.Empty(TRUE)
object.Value
:= 1 are now parsed with the correct precedence.
.Value(n) message to TouchScreen has now been
replaced by two separate messages: XPos and
YPos.
GraphicsLCD display layouts. However printing numbers
that overwrite each other, or that need to be aligned in columns, is
now much easier.
lcd.Pen
lcd.Pen(FGcol, BGcol)
OperatingSystem.Debug in the Venom2 Help File.
PRINT "© Café²"
On
message enable automated control of RS-485 transceiver direction at end of
serial transmission
Speed message sets or returns the SPI clock speed.
Free now returns available space in kilobytes
(1 KB = 1024 bytes) to avoid 32 bit overflow with SD cards of capacity over 2GB.
Flush message is now called Empty.
Only the serial input buffer may be emptied.
Free message can take a size parameter in
kilobytes; if this is supplied and non-zero, the Free message
returns TRUE (-1) if the file system's free space equal or exceeds the
value given, FALSE (0) otherwise. The useful side-effect of this is that
the free space computation can be much faster, as the counting of free
blocks stops as soon as a TRUE condition is reached. On large SD cards this
can save several seconds of time.
Valid message can optionally take a parameter
which makes it perform a consistency check on the file system, with a choice
between a quick check and a through check that can take some time on a
memory card.
TRY and CATCH, in which case
AUTODESTRUCT may be used to clean up dynamic objects
and Lock(0) may be used to leave any objects in the
unlocked state.
STOP and STOP ALL can
be used to stop tasks in your application cleanly, which was not
possible before.
Lock(0) will be ignored. (It used to wait for the Lock to
be released before doing nothing!) This new behaviour is useful in
handling exceptions, e.g. STOP.
PrintF("%6.0e", 1.0e-9) is an example
.vos and
.vex in the Flash Filing System) now require CRCs at
the end of the file data. These CRCs will be correctly set when you
produce the files using this version of Venom, or if you download
.vos files from our website. Debug(16). This may be
necessary when using the Remote Firmware Update feature,
Protect(3).
fs.Status or fs.Status(0)) sets an extra bit: bit
6 (with a value of 64) is set whenever a card is physically present in the the
slot. Thus a card of a type that the VM2 cannot read, such as an SDHC card,
will set this bit but not bit 0, enabling the Venom prgrammer to distinguish
between an invalid card and the absence of any card.
System.Speed, or just
Speed) is no longer non-volatile. The VM2 will now always
start up at 72MHz. If you want to run the controller at a lower speed
you must call Speed in your application code. See the
Venom2 Help file for more details.
OneWire object type.
Reset message that is used to
re-initialise the peripheral, particularly if the system clock speed
has changed.
Protect(2), Protect(3) and
GraphicsLCD Bitmap and Fontdata.
System.Mapping message for reserving memory for
Flash File System and RAM disk. This is no longer necessary as non-volatile
memory is now reserved when the objects are created. However, the
new method requires that if you need both RAM disk and Flash File System,
you must create the RAM disk first.
Flush message
on memory cards before the card is removed or power disconnected. The best
choice of when to do this is entirely application-dependent.
.vos.
.vex (Venom Executable).
Protect(2, ...).
Protect(3) from a Venom program.
Flush message writes cached data to Memory
card or on board flash memory.
startup procedure now stops the LED
flashing if your main procedure terminates;
the new line is shown in bold in this extract:
IF Runmode
[ led.Flash($80)
init
main
led.Flash(0)
]
Value
message that returns a fixed string: a string variable must be used.
Alt+0169.
The new TextBox entity is used to define the extent of printed text. Please see the Venom2 Help file and the Graphical User Interface example applications for more information on this new, central feature.
The existing embedded fonts have been replaced by a more consistent set. A font conversion utility is available to convert .FNT files to Venom font formats.
The Box message now uses relative coordinates to indicate the size of the box.
PRINT TO clock, "2010-04-27 16:05:32"
Address message
returns the address of the start of the file's data if it is all in
contiguous memory.
YYYY-MM-DD HH:MM:SS.
| 's' | Use a string variable instead |
| 'd', 'h' | Use 10 and 16 instead |
| 'e', 'f' | Use a float prototype instead |
Many objects are not yet supported fully.
| Major Changes | This section lists changes to the language syntax or operation that mean you may have to alter your source code. We will only make changes of this kind where there is an overwhelming advantage to doing so. Check all the Major Changes between the version you have been using and version you want to use. If any of them apply to you, please make sure your application code is changed to suit. | |
|---|---|---|
| New Features | This section lists features added to the language or objects. | |
| Bugs Fixed | This section lists bugs fixed where the bug may have significantly affected use of the system. |