From 67583b4bda38190952a9cb3e76ace2a4eb0b40af Mon Sep 17 00:00:00 2001 From: Saeed Haghtalab Date: Wed, 4 Sep 2019 10:58:20 +0200 Subject: [PATCH] Update compressRecord.dbd.pod based on Wiki + Content update --- src/std/rec/Makefile | 6 + src/std/rec/compressRecord.dbd.pod | 386 +++++++++++++++++++++++++++-- src/std/rec/image/compress-1.jpg | Bin 0 -> 16781 bytes src/std/rec/image/compress-2.gif | Bin 0 -> 4136 bytes 4 files changed, 371 insertions(+), 21 deletions(-) create mode 100644 src/std/rec/image/compress-1.jpg create mode 100644 src/std/rec/image/compress-2.gif diff --git a/src/std/rec/Makefile b/src/std/rec/Makefile index 7515d769c..307662ebb 100644 --- a/src/std/rec/Makefile +++ b/src/std/rec/Makefile @@ -53,3 +53,9 @@ stdRecords_DBD = $(patsubst %,%.dbd,$(stdRecords)) dbRecStd_SRCS += $(patsubst %,%.c,$(stdRecords)) HTMLS += $(patsubst %.dbd.pod,%.html,$(notdir $(wildcard ../rec/*Record.dbd.pod))) + +vpath %.jpg $(USR_VPATH) .. $(SRC_DIRS) ../rec/image +vpath %.gif $(USR_VPATH) .. $(SRC_DIRS) ../rec/image + +HTMLS += compress-1.jpg +HTMLS += compress-2.gif diff --git a/src/std/rec/compressRecord.dbd.pod b/src/std/rec/compressRecord.dbd.pod index a67e12d3c..90cacb77d 100644 --- a/src/std/rec/compressRecord.dbd.pod +++ b/src/std/rec/compressRecord.dbd.pod @@ -7,43 +7,387 @@ # in file LICENSE that is included with this distribution. #************************************************************************* -=title Compress Record (compress) +=title Compression Record (compress) -... +The data compression record is used to collect and compress data from arrays. +When the INP field references a data array field, it immediately compresses the +entire array into an element of an array using one of several algorithms, +overwriting the previous element. If the INP field obtains its value from a +scalar-value field, the compression record will collect a new sample each time +the record is processed and add it to the compressed data array as a circular +buffer. -=head2 Record-specific Menus - -=head3 Menu compressALG - -The ALG field which uses this menu controls the compression algorithm used. - -... - -=menu compressALG - -... - -=head2 Parameter Fields - -The record-specific fields are described below. +The INP link can also specify a constant; however, if this is the case, the +compression algorithms are ignored, and the record support routines merely +return after checking the FLNK field. =recordtype compress -... - =cut menu(compressALG) { choice(compressALG_N_to_1_Low_Value,"N to 1 Low Value") choice(compressALG_N_to_1_High_Value,"N to 1 High Value") choice(compressALG_N_to_1_Average,"N to 1 Average") + choice(compressALG_N_to_1_Median,"N to 1 Median") choice(compressALG_Average,"Average") choice(compressALG_Circular_Buffer,"Circular Buffer") - choice(compressALG_N_to_1_Median,"N to 1 Median") } recordtype(compress) { -=fields VAL +=head2 Contents + +=over + +=item * L + +=over + +=item * L + +=item * L + +=item * L + +=item * L + +=back + +=item * L + +=over + +=item * L + +=item * L + +=back + +=back + +=begin html + +
+
+
+ +=end html + +=head2 Parameter Fields + +=head3 Scanning Parameters + +The compression record has the standard fields for specifying under what +circumstances the record will be processed. These fields are listed in +L. In addition, +L +explains how these fields are used. Since the compression record supports no +direct interfaces to hardware, its SCAN field cannot specify C<<< I/O Intr >>>. + +=head3 Algorithms and Related Parameters + +The user specifies the algorithm to be used in the ALG field. There are six possible +algorithms which can be specified as follows: + +=head4 Menu compressALG + +=menu compressALG + +The following fields determine what channel to read and how to compress the data: + +=fields ALG, INP, NSAM, N, ILIL, IHIL, OFF, RES + +As stated above, the ALG field specifies which algorithm to be performed on the data. + +The INP should be a database or channel access link. Though INP can be a constant, +the data compression algorithms are supported only when INP is a database link. See +L
+for information on specifying links. + + +IHIL and ILIL can be set to provide an initial value filter on the input array. +If ILIL E IHIL, the input elements will be skipped until a value is found +that is in the range of ILIL to IHIL. Note that ILIL and IHIL are used only in +C<<< N to 1 >>> algorithms. + +OFF provides the offset to the current beginning of the array data. +Note that OFF is used only in C<<< N to 1 >>> algorithms. + +The RES field can be accessed at run time to cause the algorithm to reset +itself before the maximum number of samples are reached. + +=head4 Algorithms + +B algorithm keeps a circular buffer of length NSAM. +Each time the record is processed, it gets the data referenced by INP and puts +it into the circular buffer referenced by VAL. The INP can refer to both scalar or +array data and VAL is just a time ordered circular buffer of values obtained +from INP. +Note that N, ILIL, IHIL and OFF are not used in C<<< Circular Buffer >>> algorithm. + +B takes an average of every element of the array obtained from +INP over time; that is, the entire array referenced by INP is retrieved, and for +each element, the new average is calculated and placed in the corresponding +element of the value buffer. The retrieved array is truncated to be of length +NSAM. N successive arrays are averaged and placed in the buffer. Thus, VAL[0] +holds the average of the first element of INP over N samples, VAL[1] holds the +average of the next element of INP over N samples, and so on. The following +shows the equation: + +=begin html + + + +=end html + +B If any of the C<<< N to 1 >>> algorithms are chosen, then VAL is a circular +buffer of NSAM samples. +The actual algorithm depends on whether INP references a scalar or an array. + +If INP refers to a scalar, then N successive time ordered samples of INP are taken. +After the Nth sample is obtained, a new value determined by the algorithm +(Lowest, Highest, or Average), is written to the circular buffer referenced by +VAL. If C<<< Low Value >>> the lowest value of all the samples is written; if +C<<< High Value >>> the highest value is written; and if C<<< Average >>>, the +average of all the samples are written. The C<<< Median >>> setting behaves +like C<<< Average >>> with scalar input data. + +If INP refers to an array, then the following applies: + +=over + +=item C<<< N to 1 Low Value >>> + +Compress N to 1 samples, keeping the lowest value. + +=item C<<< N to 1 High Value >>> + +Compress N to 1 samples, keeping the highest value. + +=item C<<< N to 1 Average >>> + +Compress N to 1 samples, taking the average value. + +=item C<<< N to 1 Median >>> + +Compress N to 1 samples, taking the median value. + +=back + +The compression record keeps NSAM data samples. + +The field N determines the number of elements to compress into each result. + +Thus, if NSAM was 3, and N was also equal to 3, then the algorithms would work +as in the following diagram: + +=begin html + + + +=end html + + +=head3 Operator Display Parameters + +These parameters are used to present meaningful data to the operator. They +display the value and other parameters of the record either textually or +graphically. + +=fields EGU, HOPR, LOPR, PREC, NAME, DESC + +The EGU field should be given a string that describes the value of VAL, but is +used whenever the C<<< get_units >>> record support routine is called. + +The HOPR and LOPR fields only specify the upper and lower display limits for +VAL, HIHI, HIGH, LOLO and LOW fields. + +PREC controls the floating-point precision whenever C<<< get_precision >>> is +called, and the field being referenced is the VAL field (i.e., one of the values +contained in the circular buffer). + +See L +for more on the record name (NAME) and description (DESC) fields. + + +=head3 Alarm Parameters + +The compression record has the alarm parameters common to all record types described in +L. + +=head3 Run-time Parameters + +These parameters are used by the run-time code for processing the data +compression algorithm. They are not configurable by the user, though some are +accessible at run-time. They can represent the current state of the waveform or +of the record whose field is referenced by the INP field. + +=fields NUSE, OUSE, BPTR, SPTR, WPTR, CVB, INPN, INX + +NUSE and OUSE hold the current and previous number of elements stored in VAL. + +BPTR is a pointer that refers to the buffer referenced by VAL. + +SPTR points to an array that is used for array averages. + +WPTR is used by the dbGetlinks routines. + +=begin html + +
+
+
+ +=end html + +=head2 Record Support + +=head3 Record Support Routines (compressRecord.c) + +=head4 init_record + + static long init_record(compressRecord *prec, int pass) + +Space for all necessary arrays is allocated. The addresses are stored in the +appropriate fields in the record. + +=head4 process + + static long process(compressRecord *prec) + +See L + +=head4 special + + static long special(DBADDR *paddr, int after) + +This routine is called when RSET, ALG, or N are set. It performs a reset. + +=head4 cvt_dbaddr + + static long cvt_dbaddr(DBADDR *paddr) + +This is called by dbNameToAddr. It makes the dbAddr structure refer to the +actual buffer holding the result. + +=head4 get_array_info + + static long get_array_info(DBADDR *paddr, long *no_elements, long *offset) + +Obtains values from the circular buffer referenced by VAL. + +=head4 put_array_info + + static long put_array_info(DBADDR *paddr, long nNew) + +Writes values into the circular buffer referenced by VAL. + +=head4 get_units + + static long get_units(DBADDR *paddr, char *units) + +Retrieves EGU. + +=head4 get_precision + + static long get_precision(DBADDR *paddr, long *precision) + +Retrieves PREC. + +=head4 get_graphic_double + + static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd) + +Sets the upper display and lower display limits for a field. If the field is +VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower +limits defined they will be used, else the upper and lower maximum values for +the field type will be used. + +=head4 get_control_double + + static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd) + +Sets the upper control and the lower control limits for a field. If the field is +VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower +limits defined they will be used, else the upper and lower maximum values for +the field type will be used. + +=head3 Record Processing + +Routine process implements the following algorithm: + +=over + +=item 1. + +If INP is not a database link, check monitors and the forward link and return. + +=item 2. + +Get the current data referenced by INP. + +=item 3. + +Perform the appropriate algorithm: + +=over + +=item * + +Average: Read N successive instances of INP and perform an element by element +average. Until N instances have been obtained it just return without checking +monitors or the forward link. When N instances have been obtained complete the +algorithm, store the result in the VAL array, check monitors and the forward +link, and return. + +=item * + +Circular Buffer: Write the values obtained from INP into the VAL array as a +circular buffer, check monitors and the forward link, and return. + +=item * + +N to 1 xxx when INP refers to a scalar: Obtain N successive values from INP and +apply the N to 1 xxx algorithm to these values. Until N values are obtained +monitors and forward links are not triggered. When N successive values have been +obtained, complete the algorithm, check monitors and trigger the forward link, +and return. + +=item * + +N to 1 xxx when INP refers to an array: The ILIL and IHIL are honored if ILIL +E IHIL. The input array is divided into subarrays of length N. The specified +N to 1 xxx compression algorithm is applied to each sub-array and the result +stored in the array referenced by VAL. The monitors and forward link are +checked. + +=back + +=item 4. + +If success, set UDF to FALSE. + +=item 5. + +Check to see if monitors should be invoked: + +=over + +=item * + +Alarm monitors are invoked if the alarm status or severity has changed. + +=item * + +NSEV and NSTA are reset to 0. + +=back + +=item 6. + +Scan forward link if necessary, set PACT FALSE, and return. + +=back =cut diff --git a/src/std/rec/image/compress-1.jpg b/src/std/rec/image/compress-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9ce8f4145887e0361016b4cf3c7543d00d83cbc5 GIT binary patch literal 16781 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 literal 0 HcmV?d00001 diff --git a/src/std/rec/image/compress-2.gif b/src/std/rec/image/compress-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4cbf62a7f500e418fe548c9785fa24831703ac6 GIT binary patch literal 4136 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 JQaC1J{J)wmzxn_G literal 0 HcmV?d00001