IntToBit.g — converts an integer data point into a set of single-bit points.
![]() | Please refer to Section 3.1, “How to Run a Script” for more information on using scripts. |
/*
* Given an integer value, convert it to a set of data points where each point represents
* a single bit in the original integer.
*
* Usage:
* Modify the IntToBit.constructor to reflect the data points that need to be broken into
* individual bits. This consists of one or more calls to
* .initPoint(point, format, nbits)
* where
* point - a symbol or string representing the input integer data point
* specify symbols with #$domain:symbol_name or as a string
* format - a format string defining how to create the point names for the
* individual bits, given the symbol name and a bit number (starting at 0)
* use %a for the format specifier for input point name
* nbits - the number of bits to extract from the input, starting at the LSB
*/
require ("Application");
class IntToBit Application
{
}
/* Add any data points that you want to split into bits here */
method IntToBit.constructor ()
{
.initPoint(#$default:test, "%a_%d", 8);
.initPoint("default:test2", "%a_%02d", 16);
.initPoint(format("default:test%d", 3), "%a_%02d", 32);
}
/* ------- Implementation: No need to change beyond here ----------- */
/* A callback that runs whenever the input integer changes value */
method IntToBit.processNewValue (inputsym, outputformat, value, nbits)
{
if (string_p(inputsym))
inputsym = symbol(inputsym);
local bitsym, bitvalue, i;
local valueinfo = PointMetadata(inputsym);
if (valueinfo)
{
for (i=0; i<nbits; i++)
{
bitsym = format(outputformat, inputsym, i);
bitvalue = (value >> i) % 2;
datahub_write(bitsym, bitvalue, nil, valueinfo.quality, valueinfo.timestamp);
}
}
}
/* Set up the event handler and initial state for the output points */
method IntToBit.initPoint (inputsym, outputformat, nbits)
{
local bitsym, i, curvalue;
if (string_p(inputsym))
inputsym = symbol(inputsym);
for (i=0; i<nbits; i++)
{
bitsym = format(outputformat, inputsym, i);
datahub_command (format("(create %s 1)", stringc(bitsym)), 1);
datahub_command (format("(set_canonical %s BOOL)", stringc(bitsym)), 1);
}
.OnChange(inputsym, `(@self).processNewValue(this, @outputformat, value, @nbits));
if (!undefined_p(curvalue = eval(inputsym)) && number_p(curvalue))
{
.processNewValue(inputsym, outputformat, curvalue, nbits);
}
}
/* Any code to be run when the program gets shut down. */
method IntToBit.destructor ()
{
}
/* Start the program by instantiating the class. */
ApplicationSingleton (IntToBit);
Copyright © 1995-2010 by Cogent Real-Time Systems, Inc. All rights reserved.