Skip to content
Snippets Groups Projects
Commit 41fbe44e authored by Ruud Overeem's avatar Ruud Overeem
Browse files

BugID: 465

Added functionality to the solveVHparam functions to handle the array indicatior
([]). When a reference and in [] the size of the referenced array is returned.
When an [] is used somewhere in the reference name that array is treated as a
reference array.
E.g. VirtInstrument.stationlist = [ RS001, RS002, CS020 CS021 ]
	 StationIPlist = >>VirtInstrument.stationlist[].IPaddress
will fill the StationIPlist variable with the IPaddress of the stations in the
VI.stationlist.
parent e1e75ae7
No related branches found
No related tags found
No related merge requests found
......@@ -42,31 +42,78 @@ CREATE OR REPLACE FUNCTION resolveVHparam(INT4, TEXT)
vNodeName VARCHAR(200);
vParamName VARCHAR(200);
vRemainder VARCHAR(200);
vOrgArray VARCHAR(200);
vElem VARCHAR(100);
vAnswer TEXT;
vIsArray BOOLEAN;
vSize INTEGER;
vRecord RECORD;
BEGIN
--RAISE WARNING \'resolveVHparam(%,%)\', $1, $2;
vDotpos := strpos($2, \'.\');
vNodeName := substr($2, 3, vDotpos-3);
vParamName := substr($2, vDotpos+1);
vDotpos := strpos($2, \'.\'); -- >>a.b.c or <<a
IF vDotpos < 1 THEN
RETURN $2;
END IF;
vNodeName := substr($2, 3, vDotpos-3); -- a
vParamName := substr($2, vDotpos+1); -- b.c
vDotpos := strpos(vParamName, \'.\');
IF vDotpos > 0 THEN
vRemainder := substr(vParamName, vDotPos);
vParamName := substr(vParamName, 1, vDotPos-1);
vRemainder := substr(vParamName, vDotPos); -- .c
vParamName := substr(vParamName, 1, vDotPos-1); -- b
ELSE
vRemainder := \'\';
END IF;
--RAISE WARNING \'resolveVHparam: % : % : %\', vNodeName, vParamName, vRemainder;
-- does paramname end in [] ?
IF rtrim(vParamName, \'[]\') != vParamName THEN
vIsArray := true;
vParamName := rtrim(vParamName, \'[]\');
ELSE
vIsArray := false;
END IF;
-- Get parameter definition
SELECT *
INTO vRecord
FROM getVICNodeDef ($1, vNodeName, vParamName);
IF NOT FOUND THEN
RAISE EXCEPTION \'Parameter % from Node % not found\', vNodeName, vParamName;
END IF;
IF vRemainder = \'\' THEN
RETURN vRecord.limits;
IF vIsArray THEN
IF vRemainder = \'\' THEN
-- calc size of array
RETURN calcArraySize(vRecord.limits);
ELSE
-- reference array
-- create an array with same size as current vRecord.limits array
-- while rereferencing the elements of the vRecord.limits array.
vAnswer := \'[\';
vOrgArray := btrim(vRecord.limits, \'[] \');
vSize := calcArraySize(vRecord.limits);
FOR i IN 1..vSize LOOP
-- get clean name of element
vElem := btrim(split_part(vOrgArray, \',\', i), \' \');
-- make sure it begins with <<
IF substr(vElem,1,2) != \'<<\' THEN
vElem := \'<<\' || vElem;
END IF;
-- resolve value
vElem := resolveVHparam($1, vElem || vRemainder);
-- add to array
vAnswer := vAnswer || vElem || \',\';
END LOOP;
-- finish array and return result.
vAnswer := rtrim(vAnswer, \',\') || \']\';
RETURN vAnswer;
END IF;
ELSE
vRecord.limits := vRecord.limits || vRemainder;
RETURN resolveVHparam($1, vRecord.limits);
IF vRemainder = \'\' THEN
RETURN vRecord.limits;
ELSE
vRecord.limits := vRecord.limits || vRemainder;
RETURN resolveVHparam($1, vRecord.limits);
END IF;
END IF;
END;
' LANGUAGE plpgsql;
......
......@@ -210,3 +210,31 @@ CREATE OR REPLACE FUNCTION isReference(TEXT)
END;
' LANGUAGE plpgsql IMMUTABLE;
--
-- calcArraySize (arraystring)
--
-- Authorisation: n/a
--
-- Tables: none
--
-- Types: none
--
CREATE OR REPLACE FUNCTION calcArraySize(TEXT)
RETURNS TEXT AS '
DECLARE
vSize INTEGER;
vArray TEXT;
BEGIN
vArray := ltrim($1,\'[ \');
vArray := rtrim(vArray,\'] \');
vSize := 0;
WHILE length(vArray) > 0 LOOP
-- remove element
vArray := ltrim(vArray, \'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "[]{}+%<>.\');
vSize := vSize + 1; -- count element
vArray := ltrim(vArray, \',\'); -- strip comma
END LOOP;
RETURN vSize;
END;
' LANGUAGE plpgsql IMMUTABLE;
......@@ -138,6 +138,17 @@ par systemClock I dbl MHz 0 0 200 - 'systemclock'
par channelWidth I dbl Hz 0 0 762.939453125 - 'width of the channels'
par subbandWidth I dbl kHz 0 0 195.3125 - 'width of the 512 subbands'
# -- Clock160 --
# name vers qual constr. descr.
#------------------------------------------------------------------------------
node Clock160 1.0.0 test 'node constraint' '160 MHz clock'
# name dir. type unit prun. vm value constr. descr.
#------------------------------------------------------------------------------
par systemClock I dbl MHz 0 0 160 - 'systemclock'
par channelWidth I dbl Hz 0 0 610.3515625 - 'width of the channels'
par subbandWidth I dbl kHz 0 0 156.25 - 'width of the 512 subbands'
# -- Observation --
# name vers qual constr. descr.
#------------------------------------------------------------------------------
......@@ -164,5 +175,6 @@ node TopNode 1.0.0 test 'node constraint' 'Toplevel node'
#------------------------------------------------------------------------------
uses 'Observation' 1.0.0 test 0..1 "x"
uses 'Clock200' 1.0.0 test 1 "x"
uses 'Clock160' 1.0.0 test 1 "x"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment