Added DataTime instruction as optional DataTable modifier. Parameter = 1 means time stamp the records with System Time instead of the Scan Time; parameter = 0 (default) means time stamp with Scan Time. Note that DataInterval will still use the top of scan to trigger the table.
Added IPAddressCSIO, IPGatewayCSIO, and IPMaskCSIO settings to support new NL200 bridge mode. Old settings (IPAddress, IPMask, & IPGateway) remain. This allows multiple IP devices to be connected at the same time.
Added IPNetPower instruction to turn power on or off for either the Ethernet or the NL200/NL240 network.
Added EthernetPower() instruction to the CR800 so it can be used with a NL200.
Added compile error if RETURN is used inside of a Subroutine.
Added Compile Warning message if initialization of an array is out of bounds.
Added .OGG files ("audio/ogg") as a content type returned with HTTP requests.
Added support for decompression of *.gz programs. For example, myProgram.cr1.gz
Added SolarPosition instruction. If Pressure is <0 then use the AirTemp to calculate an estimation of pressure. If Time is not a variable array then use the current time. Disclaimer: Only tested at Logan, Utah USA. Feedback on how it performs at other locations is welcome.
Improved AVW200 by adding optional threshold parameter. The instruction will return NAN for frequency if the amplitude is less than the threshold. An error will be flagged at compile time if a constant mv level is entered that is < .01; i.e., < 10 uv.
Improved TCP/IP so serial output instructions can send more than 1479 bytes of data.
Changed TCP write when over PPP to wait for acknowledgement when > 2880 bytes have not yet been acknowledged, which makes transferring large files via ftp and HTTP over PPP more reliable.
Changed large file transfer via FTP and HTTP over PPP so that it is more reliable by waiting for TCP acknowledgments using a smaller window.
Improved FTP and HTTP servers so that they can receive large files much faster.
Changed memory allocation for IP if datalogger memory size is less than 4 Meg and no program is running.
Changed IP stack to start if PPP is active.
Improved FTP server so that large files that take over 2 minutes to send are sent successfully.
Changed FTP server when writing a file and a timeout error occurs to delete the partially written file.
Improved TCPOpen() & UDPOpen() to add optional timeout parameter (4th parameter), in units of .01 seconds. If it is not present, it will default to 7500 (75 seconds).
Change TCP/IP stack in how it handled out of memory condition. Sockets will be closed by TCP IP task when it detects the flag set when out of memory is detected. This avoids getting a semaphore lock in an interrupt.
Improved FTPClient instruction to support FTPS if the option code is 1xx.
Improved FTPClient instruction to allow directory retrieval in ACTIVE & PASSIVE mode.
Added "Host: " field to header in HTTPGet/Post functions.
Changed FTPClient so that when getting a file but some error is detected, (e.g., cannot open the data socket) the file is removed from the datalogger.
Changed HTTP so if the .csipassword file is present it is used instead of the datalogger PakBus security settings.
Changed TCP Port settings for PakBus, HTTP, and FTP to be unsigned instead of signed so that port numbers > 32767 are accepted.
Changed PingIP to wait for DNS request.
Changed DNPVariable such that if the flag parameter is a constant 0 then it will default all the flags to 1 ("On Line").
Changed DNP3 so that more than 65535 events can be stored and so that it does not use twice as much memory as needed.
Enhanced UDPOpen()to allow a zero length server name so that it can listen for communication from an unknown IP address.
Improved AXTLS stack to accept asn1 type 0x0c used by some TLS servers, allowing the datalogger to work with them.
Changed FTP Data Port range to 8019..8018 so that firewalls can be set up to accommodate this narrower range. It has been 8000..65535.
Changed pre-compiler's table definitions of the status table in most cases identical to that of the dataloggers, in which case LoggerNet will not have to collect the status table's definition from the datalogger.
Changed the TCP/IP windowing so that large files that are published to the datalogger via FTP or HTTP are throttled back enough to prevent running out of memory, possibly causing a watchdog error. The window is put to 0 if the datalogger has used 3/4 of its allocated big IP packets.
Changed TableFile instruction's field names and HTTP DataQuery field names to look like a scalar if it is only 1 value and the beginning index is 1.
Changed data query via HTTP and via BMP5 so that that no data is returned if the start time is newer than the newest record and so that the last record returned is the record just previous to the end date.
Changed TCPOpen to not return until the connection is established.
Changed HTTP BrowseSymbols command so it expands BOOL8 datatype to 8 Boolean fields per byte.
Changed EmailRecv() so that the filters apply to the entire line in the header, not just the first N characters where N is the length of the filter string.
Improved EmailSend and EmailRecv by adding tracing so that the conversation is traced if the trace code bit 16384 is set.
Changed TLS setting to be set to enabled if not already enabled when a CRBasic program includes Email (EmailSend or EmailRecv ) or an HTTPPut HTTPPost??? or HTTPGet instruction that might use TLS.
Improved EmailSend, EmailRecv, and FTPClient so that they do the work in the CRBasic user sequences.
Fixed EmailReceive() when the optional parameters are present.
Improved MenuRecompile to work when there is no constant table present.
Changed retrieving data via time so that if the time requested is older than the oldest data, then the oldest data will be collected. This affects BMP5 and HTTP data retrieval.
Changed SerialIn() when waiting for input on a TCP/IP connection to return with 0 bytes if the connection is lost rather than continue to wait according to the user's timeout parameter.
Changed HTTP so that if a drive but not file is referenced, as in /USR/, and an index.html or default.html exists on that drive, it will be served.
Improved record allocation to allocate a record buffer for HTTP separate from the buffer used by the display so that concurrent use of the display and HTTP browsing data does not have problems.
Removed listening on the HTTPS 443 port.
Improved HTTP web service: error 404 handled without an extra crlf; if no tables exist, the data query acts correctly; files coming via the PUT or POST command that are "chunked" are read correctly.
Added HTTP and FTP servers into socket task so file transfer does not interfere with the niche task. File transfer broken up so if the servicing task has other work it can be completed
Changed Web Service and xml and json Data File display of BOOL8 data types so that they are converted to an array of Booleans as is done by LoggerNet.
Changed SerialInRecord to optionally use a local read pointer out of the serial buffer to facilitate multiple SerialInRecords on the same COMPort. The option parameter accommodates this using the 3 least significant digit.
Changed SerialInRecord to add an option so that the most negative integer (&H80000000) can be used for either the Start Word or the End Word to specify a NULL character.
Moved TCP activity that involves file access out of the Niche Task so that IP memory is used more efficiently, lowering the probability of running out of IP memory that can cause a watchdog.
Improved auto switch to sequential mode to not switch to sequential mode when SerialOut and SerialInRecord occur in the slow sequence.
Improved starting up tables when reading data from the CF Card. 1) the file position was not set to the end of data correctly and 2) the read pointer into the copied data was such that the data copied in from the card was subsequently written back to the card resulting in duplicated data on the Card. This was only a problem in the CR9000X because the battery backed RAM of the other loggers removes the need to copy from the Card to internal memory at power up.
Added checks in Card accesses to avoid reads/writes, from other tasks, while the card is in the process of being removed.
Change CardOut allocation to accommodate > 2G cards. Limit individual files to be no larger than 2G.
Added TableFile mode to not flush all data to card when removal button is pressed. This is done by adding 100 to the option parameter.
Changed Card removal to wait for TableFile to finish baling its data before turning the LED green.
Added Force a frame footer to be placed in interval tables when reading data from cards.
Changed AddUnits to allow Units to be assigned to 2 and 3 dimensional arrays.
Improved calling a function with optional parameters to not require trailing commas.
Changed PWM to recalculate the duty cycle setting when period is changed.
Changed FileReadLine so that it returns 0 if a variable is out of bounds or there is no space for the line.
Improved Status so when monitoring Status.CommsMemFree values are refreshed first.
Changed the COMPort prompt in the terminal mode 'W' command if CWB100 is active on a control port.
Changed internet date/time displays. Changed "Tues" to "Tue" and "Thurs" to "Thu" and GMT displayed if the UTC offset is active.
Modified PortGet to allow ports 9, 11, and 12 to read SW12, pulse channel 1, and pulse channel 2, respectively. In the CR3000 9, 10, 11, and 12 are valid, this corresponds to SW1, SW2, pulse channel 1, and pulse channel 2.
Changed 'W' and 'P' command in terminal mode, allow a max of 2 days for the timeout entry.
Improved terminal mode 'P' and 'W' to add some messages if the mode is exited and also changed to keep the terminal mode comport open during the user's specified timeout.
Changed "Exiting from talk thru" to "Exiting" when exiting from either talk through ('P') or sniffer ('W') in terminal mode.
Changed telnet/terminal/sniffer ('W') command so that the timeout specified by the user will keep the telnet connection open 40 seconds beyond the timeout of the sniffer.
Changed CWS100 RSSI and Routes so they put the priority of their task back to normal. It previously was left in a high priority state that did not allow communication tasks to get in if the program contained tight loops, as does Send and Get Variables.
Changed ModBusMaster to allow a constant Variable parameter if the Function parameter is also constant and is not in the range of 1..4.
Changed to not allow Aliasing of Aliases.
Changed IfTime() and TimeIntoInterval to flag a compile error if they cannot be synced to the scan interval.
Improved SampleMaxMin to work with string source variables.
Improved memory functions to detect insufficient memory for variable space and don't initialize.
Changed FileEncrypt to only check the first byte in the file to determine if the file is already encrypted. Since control characters can be entered into strings they may have the MSB set and be legitimate so we don't want to stop encrypting.
Added listening for a connection to a UDP "Discover Port" 6785. This is used by DevConfig.
Optimized handling ARP packets via Ethernet that are not for the datalogger to ease use of IP memory packets.
Optimized TLS memory usage to use less memory; CommsMemFree(1), when TLS is active, starts out at 0225459999.
Accept Constant strings to be used as TableNames in DataTable and CallTable.
Changed TableFile to correctly establish the number of files when the disk is full.
Changed TableFile to not add error into compile results at run time when the drive fills up.
Changed TimerIO to synchronize all involved timers when doing time since edge or time since channel 1. Also fixed case where error condition of signal too fast was causing an extra value to be written to user variable if timing since another edge.
Changed SlowSequence in PipeLine Mode to allow CS616 and PeriodAvg.
Reformatted IP information in the Settings and Status table to include before the so that telnet displays it better.
Changed web service so that HTTP DataQuery & BrowseSymbols retrieving data arrays by including index of name when there is only one value & the index is greater than one.
Fixed issues when flushing card (via eject button or CardFlush ()) and TableFile & CardOut are active so that the most recent data was correctly stored on the card.
Improved OutofMemory() (internal function) to not cause a watchdog if called while stopping currently running program to start a new program.
Fixed terminal mode 'W' command to not include COM3 and COM4 for CR800.
Fixed synchronization of Digital task sequencer when it skips scans due to being too long in acquisition.
Fixed DialModem instruction when using control ports, COM port was mapped incorrectly.
Fixed HTTP data query via date range.
Fixed PPP so that if PPP is not open packets trying to be sent will be freed, avoiding an eventual watchdog because IP memory (CommsMemFree(3)) is exhausted.
Adjusted TCP window advertisement so that large incoming files do not use all of the IP memory available, which can cause a watchdog.
Improved IP memory handling when memory is exhausted to reduce watchdogs. When IP memory is exhausted, it first tries to free memory by closing sockets that have more than one packet waiting to output. This affects applications that have several sockets opened and then are suddenly disconnected.
Fixed TLS stack so that if an error occurs, for example "bad certificate", it does not duplicate freeing up memory.
Fixed ClockSet via HTTP to be insensitive to the order of the parameters.
Fixed putting files via HTTP PUT/POST when the file is an OS to act like sending an OS file via LoggerNet, which stops the scans and frees memory used by data tables to make temporary space for the OS. Subsequent HTTP GET with the FileControl command will cause the new OS to install, similar to the actions taken by LoggerNet.
Fixed web service SetValue when the value is to be set to "true".
Fixed terminal mode serial talk through with SDM-SIO1 so that the I/O in the program is halted correctly.
Fixed SDM-SIO1 so that when the buffer fills the serial input functions do not miss data in some rare conditions.
Fixed calling functions and subroutines when the last optional parameter is not passed in; a ',' was expected whereas a ')' should be expected.
Fixed error where datalogger was returning incorrect bytes free for USR: drive.
Changed File system so that files left open for writing at reset are closed to prevent loss of drive size.
Fixed FileClose instruction to initialize the controller if it has not yet been initialized. With recent changes close can be called before open and if that happens the controller must be initialized.
Fixed a watchdog condition caused by a SlowSequence with measurement, running in PipelineMode, when the main scan was setup to only run once and took a very long time (> 1 minute) to complete.
Fixed an erroneous compile error when calling a subroutine when there is no space between the subroutine name and the opening parenthesis and when the first parameter is itself enclosed in parentheses.
Fixed problem where memory was corrupted caused by plugging RS-232 cable into CS I/O port with SC115 being the last device to be connected to the CS I/O port.
Fixed CWB100 so that programs with variable names that start with the ArrayName in CWB100() do not erroneously get their name changed.
Fixed CWB100() instruction so that data tables are not reinitialized on a power reset.
Fixed ModBusMaster() when the function code is 1 or 2 (get coils).
Fixed Move(y(i),n,y(j),m) when i > j; that is, when the destination and source overlap.
Fixed IfTime (TimeIntoInterval) function when the interval and offset both have the same seconds component and when the interval also has a sub second component.
Fixed the precompiler when parsing #if to 1) allow % in strings, and 2) not output comments within disabled sections.
Fixed slicing AutoRange measurements in Pipeline Slow sequences.
Fixed FieldCalibration for slope only calibrations via keyboard.
Fixed EC100Configure so that SDM instructions that follow it will work properly.
Fixed string initialization when CHR() is used in the initialization.
Fixed AM25T in Slow sequence running in Sequential Mode. The measurements were being stored into the wrong buffer.
Fixed BOOL8 for TOA5 & TOB1 files & TOB3 header.
Changed internal function get_ptr() which determines if expressions can be evaluated prior to run time by checking the loaded expression opcodes. Under very rare circumstances this was crashing the pre compiler because the opcodes were read in advance and if read via pointers that caused the read to be out of bounds the .exe crashed. This was not a real problem because the values were only used if the context warranted it, but just the read caused the PC program to crash. The change was to only read from the pointers when they are actually used. This does change the OS too.
Fixed FinalStorageCompile() an internal function. It had an out of memory problem caused by lack of memory when executing FinalStorageCompile(). When the Card bytes free field in the status table was populated, there was insufficient memory to initialize the Card and open the directory. The fix was to allocate memory prior to locking allocations, then free it just before updating Status.card_mem_free.