(CRITICAL) Upgrading from versions prior to version 28 of the Operating System will reset the datalogger’s CPU drive. This is due to a change in the format of the file system from FAT16 to FAT32. In order for the datalogger to operate correctly, as part of the upgrade, the CPU drive is formatted to FAT32. Any programs stored and running from the CPU drive will be lost. It is not recommended to update the datalogger’s Operating System over a remote connection where program control regulates the communication equipment (turning it on or off, etc.). In these cases, an on-site visit and a backup using DevConfig’s backup utility is necessary to update the datalogger’s Operating System. In all cases where the datalogger is being updated with an Operating System prior to 28, the use of DevConfig’s backup utility is recommended due to the fact that the CPU drive is formatted using the new FAT32 format. Watch the Video Tutorial: Sending an OS to a Local Datalogger.
Fixed HTTPS when using HTTPPost() with large files.
Added the ability to display type double in custom menus.
Fixed an issue when CardOut() files are being allocated. It no longer allows other files to be opened for writing on the card until the process is finished.
Fixed referencing TableName.FieldName() when field is of type Double.
Fixed the datalogger’s FTP server so it will append the final packet to the incoming file.
Fixed PortsConfig() when SDM is active.
Fixed PPP dialing when dialing is done.
Fixed DHCP_release() when DHCP has not been started.
DNS client fixed to check for a negative TTL which can cause a much larger timeout before the DNS client tries to get a new IP address.
Fixed function declaration with (). Changes recently made to my_stricmp() internal function caused compile errors.
Updated operating system to get FILE_SEM when starting os_recompile() to avoid deadlock with SETTING_SEM elsewhere.
Fixed IP tracing of HTTP. It could possibly overwrite memory in certain conditions.
Fixed DHCP for non-Wi-Fi loggers.
Fixed GetDataRecord() when a data interval is specified and when the maximum number of records parameter is either 1 or -1.
Modified the operating system to avoid writing a file via IPTrace from the IP task or BMP task since it might take longer than the watchdog timer for these tasks.
Added DHCP_release before stopping DHCP so specific PPP modems will work when re-starting DHCP.
Fixed PPPClose() to not execute a callback function that has not yet been initialized. This can happen if PPP is opened, but the program closes PPP before the callback function is initialized.
Fixed TableName.TimeStamp() from using a bogus pointer.
Modified the operating system when an out-of-bounds condition is detected within a data table to no longer allow the compile to continue. This was causing the PC compiler to crash.
Modified the pre-compiler to allow new line _ continuation to be before the beginning of a comment.
Fixed false error for units "already assigned" by fixing my_stricmp() function when tabs and/or spaces are at the end of the two strings to be compared.
Fixed ArrayLength(X) when X is a parameter passed into a subroutine that is not an Array. It now returns 0 instead of the local array's dimension.
Fixed a very unlikely bug: If PPP dial string is PPP or blank and "CLIENT" is received while trying to close PPP and PPP is on a comport that uses the flusher.
Fixed ArrayLength() when called within a large program.
Fixed ArrayLength() to return 0 if a variable array is not passed in.
Fixed parsing parameters; the operating systems now inserts a 4 byte value for line number at the start of each parsed instruction. Previously, one 4 byte value was used to maintain instruction number, structure size, and program line number. This allowed only 12 bits for the line number. With longer programs, this caused confusion in compile error messages.
Fixed PC compiler showing the wrong program name when an include file is used.
Removed extra space between <html> and <head> that were not needed in the Web API html output.
Removed extra <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"> that was being added to the html output of WebAPI commands ListFiles, SetValue, BrowseSymbols, and ClockCheck.
Modified the datalogger's web server to add <HEAD> and <TITLE> tags and to report the title with the same message that is sent in the http header (like other web servers do). For example, a 404 error now reports 404 Not "Found".
Changed SetClock() so the usec and seconds passed in are adjusted to be in bounds before converting to usec since 1990. This allows CRBasic code to adjust the clock by simply adjusting the usec component of the RealTime() instruction.
Fixed Include files with : and \ in them which resulted in erroneous error message of "file too long" in the pre-compiler.
Added the ability to send all the data tables when streaming files and the source parameter is "" (a NULL string).
Limited UDPDataGram() instruction queue to 10 before the head of the queue is released and the memory freed.
Changed SendGetVariables() to abort if it tries to access variables or store into variables out of bounds.
Modified the operating system when Status.WatchdogErrors is non-zero. It will no longer write to an IP Trace file that is writing via the 3212 option in the Files Manager setting.
Modified GetVariables() to allow a variable index into the destination variable.
Changed GetVariables() and SendVariables() to skip writing if they would write out of bounds in an array.
Enhanced EmailSend(...,Attachments,..) and FTPClient(...,LocalFileNames,...) when sending multiple files when some of the files are "streaming" data files. The comma-separated files can now include streaming data files intermixed with other files.
Modified DataEvent() to restart if the RecAfter parameter is negated and the start trigger condition occurs during the RecAfter count.
Modified Web service: if DataQuery references a field name that does not exist, return no command.
Modified the TCP client data streaming functions (Email, HTTP, FTP). If the parameter specifying the data table is a variable, then state of variable is kept for all the declared data tables independently so the same instance of the function can be called referencing different data tables.
Fixed SIO4 getting output from a variable of type Long.
Fixed the CRBasic pre-compiler to flag an error if the Public or Dim declaration of an array is missing the ")" character terminating the dimension.
Modified the SDMSIO4() instruction so the Dest option can be of type Long.
Modified CheckSum() to work on a file if the source parameter is a file name present in the datalogger's file system.
Fixed the Datalogger Web Service API for the ClockCheck instruction when using the JSON formation option. Removed the extra space in the "description: " field.
Fixed CheckSum() using the CRC32 option to work with the CheckSum() of a File.
Fixed the Datalogger Web Service API "ListFiles" instruction's "last write" field for the drive. It is meant to be the date of the operating system, Status.OSDate.
Improved the TimerIO() port conflict error message. Changed from "To return time since chan %d, it must be programmed for a function < %d. to "To return time since chan %d, chan %d must be programmed for a function < %d.".
Modified the CRBasic pre-compiler to use our native csi_atof function rather than GCC library function to convert strings to floats. This brings the CR3000, CR1000, and CR8X0 pre-compilers in line with the CR6 pre-compiler which was already using this method.
Fixed HTTPPut() to not respond until the end of the message (file) in the event that it is not authorized (HTTP error 401). The web browser is not able to see the header response before the entire file is sent.
A hidden constant table can now be displayed via the keyboard display only if security is set to the highest level.
Fixed a typo in the error message "Result must be a variable of typpe string" to "Result must be a variable of type string" in GOES instruction.
Web service services HTTPPost() the same as HTTPGet(). API commands like FileControl would generally be issued as HTTPPost() instead of HTTPGet().
Fixed GetDataRecord() to not insert a -1 for the interval of the local data table. This -1 erroneously flagged the table to act as an interval-driven table that resulted in a misleading compile error if the same table was referenced by a subsequent GetDataRecord(). The error was removed.
Fixed re-syncing the CPI bus with SC-CPI and slow sequences when a module is disconnected.
Modified the operating system to allow "then" with the "#ifdef" preprocessor directive.