GenValueClass
allows the user to retrieve or set a numerical value for use in your application. The GenValue object offers a display for the current value and the means to either increase or decrease this value. The GenValue object also manages the range that this value may fall between and the action to send out when a value has been selected.
Before reading this chapter, you should be familiar with
GenClass
1 GenValue Features
2 GenValue Instance Data
3 GenValue Basics
3.1 The Value
3.2 The Minimum and Maximum
3.3 The Increment
3.4 GenValue States
3.5 Display Formats
3.6 Sending an Action
4 Supplemental Usage
4.1 Adjusting the Value Indirectly
4.2 Status Messages
4.3 Retrieving Text
4.4 Using Value Ratios
4.5 Text Filters for the GenValue
4.6 Using Ranges in GenValues
Depending upon the specific UI, the GenValue object can look like one of many things. It may be a spin gadget, a slider, a dial, or some other gadget. A GenValue typically allows the user to set a value within a specified range through keyboard or mouse input. For example, many GenValue objects in OSF/Motif are comprised of a text field showing the current value, an incrementor and a decrementor, and possibly a moniker. (Scroll bars are also GenValues, though they have very different appearance.)
In OSF/Motif, the user can enter the value by keyboard input into the text field or by clicking the mouse on the incrementor or decrementor.
The GenValue provides the following capabilities:
The user may change a value in a GenValue in one of two ways. It can be entered with the keyboard by typing directly into the display area, or it can be entered graphically by using the arrows, dials, or sliders that the specific UI provides. To enter a value by typing directly into the text field, first the user clicks on the area, bringing up a cursor. Then a value may be typed into the GenValue. To enter a value graphically, the user clicks on either the incrementor or decrementor, thus changing the value of the GenValue.
Once the value is changed, the value may become set immediately (if the object is operating in
immediate
mode), and the GenValue will perform its action (if any) every time the value is changed. As an alternative, the GenValue may be operating in
delayed
mode, and the value will not be set until a
MSG_GEN_APPLY
is received through an "Apply" or "OK" button. The mode (delayed or immediate) of the GenValue is controlled by the parent. Usually a GenValue will operate in immediate mode unless it is placed as a child of a GIT_PROPERTIES GenInteraction.
GenValue only allows the user to set a value within a specific range; this range consists of a minimum and maximum value that the GenValue may display. These values are set by the application and cannot be directly modified by the user, but they can be changed by your application. If the user enters a value above the maximum, the GenValue simply takes on its maximum possible value. If the user enters a value below the minimum, the GenValue takes on its least possible value.
In addition to the limits upon the range of values entered by the user, the GenValue also has a defined increment value. The increment value is the specific amount to increment or decrement the GenValue's value when using graphical input. The user cannot directly modify this value, but it can be changed by your application.
The GenValue object always displays a numerical value within its text field. The units of that numerical value may be set by your application. By default, any value within a GenValue is an integer, but that value could also be a decimal value, or even a unit of distance such as centimeters, points, or inches. The GenValue automatically provides whatever notation is required by the display units (decimal points, the words "pt" and "cm," or any other distance notation in the text field).
The GenValue contains instance fields that affect the current value, the display units of that value, and the action to take when any value operation has been completed. These instance fields are listed in GenValue Instance Data
. Remember, in addition to these instance data variables, there are also the instance fields inherited from the GenValue's superclass,
GenClass
.
Code Display 8-1 GenValue Instance Data
/* The instance data fields for GenValue are shown below. Those that are records * of flags have their default flags shown with other possible flags listed below. * Other fields are shown with their default values. */
@instance WWFixedAsDWord GVLI_value = MakeWWFixed(0.0); @instance WWFixedAsDWord GVLI_minimum = MakeWWFixed(0.0); @instance WWFixedAsDWord GVLI_maximum = MakeWWFixed(32766); @instance WWFixedAsDWord GVLI_increment = MakeWWFixed(1.0); @instance GenValueStateFlags GVLI_stateFlags = 0;
/* GenValueStateFlags */ typedef ByteFlags GenValueStateFlags; #define GVSF_INDETERMINATE 0x80 #define GVSF_MODIFIED 0x40 #define GVSF_OUT_OF_DATE 0x20
@instance GenValueDisplayFormat GVLI_displayFormat = GVDF_INTEGER;
/* GenValueDisplayFormat */ typedef ByteEnum GenValueDisplayFormat; #define GVDF_INTEGER 0 #define GVDF_DECIMAL 1 #define GVDF_POINTS 2 #define GVDF_INCHES 3 #define GVDF_CENTIMETERS 4 #define GVDF_MILLIMETERS 5 #define GVDF_PICAS 6 #define GVDF_EUR_POINTS 7 #define GVDF_CICEROS 8 #define GVDF_POINTS_OR_MILLIMETERS 9 #define GVDF_POINTS_OR_CENTIMETERS 10
@instance optr GVLI_destination; @instance Message GVLI_applyMsg = 0;
GVLI_value
is the current numerical value of the GenValue. By default, it is an integer constant defined by the application. Depending on the GVLI_
displayFormat
, it can be interpreted as an integer, a decimal, or distance unit.
GVLI_maximum
is the maximum possible value that the GenValue may display. This value may be positive or negative. The default value is 32766.
GVLI_minimum
is the minimum possible value that the GenValue may display. This value may be positive or negative. The default value is zero.
GVLI_increment
is the value to increment (or decrement) the GenValue when its value is changed by UI controls rather than direct text input. The default value is one.
GVLI_
stateFlags
specifies the
GenValueStateFlags
for the GenValue to operate under. These flags affect whether the data within the GenValue is indeterminate (not necessarily true) or modified (changed since the last
MSG_GEN_APPLY
).
GVLI_
displayFormat
specifies the units of measurement (
GenValueDisplayFormat
) that the numerical value represents. By default, this is an integer, but it could also be a decimal or a unit of measurement (such as inches, points, or centimeters).
GVLI_applyMsg
is the message to send out upon GenValue changes (i.e. whenever it receives MSG_GEN_APPLY). There is no default message.
GVLI_destination
is the object or process to send the message upon GenValue changes. This can be an optr to an object or a valid
TravelOption
. See the MetaClass chapter. There is no default destination object.
Code Display 8-2 GenValue Optional Attribute Fields
@vardata Message ATTR_GEN_VALUE_STATUS_MSG; @vardata word ATTR_GEN_VALUE_DECIMAL_PLACES; @vardata WWFixed ATTR_GEN_VALUE_METRIC_INCREMENT; @vardata void ATTR_GEN_VALUE_SET_MODIFIED_ON_REDUNDANT_SELECTION;
ATTR_GEN_VALUE_STATUS_MSG
sets a status message for a GenValue. A status message allows your object to communicate with other objects when changes occur without sending out its apply message (GVLI_
applyMsg
).
ATTR_GEN_VALUE_DECIMAL_PLACES specifies the number of decimal places to display to the right of the decimal point if the GVLI_
displayFormat
allows fractional quantities.
ATTR_GEN_VALUE_METRIC_INCREMENT allows you to specify a particular metric increment to use besides the default if the GVLI_
displayFormat
is GVDF_POINTS_OR_MILLIMETERS or GVDF_INCHES_OR_CENTIMETERS.
ATTR_GEN_VALUE_SET_MODIFIED_ON_REDUNDANT_SELECTION specifies that the GenValue should be marked modified whether or not a change in the value has occurred. This will result in that value being applied whenever it receives a
MSG_GEN_APPLY
. (The default behavior for when no change in state occurs, no message will be sent out.)
Code Display 8-3 GenValue Hints
@vardata void HINT_VALUE_INCREMENTABLE; @vardata void HINT_VALUE_NOT_INCREMENTABLE;
@vardata void HINT_VALUE_NAVIGATE_TO_NEXT_FIELD_ON_RETURN_PRESS; @vardata Message HINT_VALUE_CUSTOM_RETURN_PRESS;
@vardata WWFixedAsDWord HINT_VALUE_DISPLAYS_RANGE; @vardata GenValueIntervals HINT_VALUE_DISPLAY_INTERVALS; @vardata void HINT_VALUE_CONSTRAIN_TO_INTERVALS;
typedef struct { word GVI_numMajorIntervals; word GVI_numMinorIntervals; } GenValueIntervals;
@vardata void HINT_VALUE_SHOW_MIN_AND_MAX; @vardata void HINT_VALUE_IMMEDIATE_DRAG_NOTIFICATION; @vardata void HINT_VALUE_DELAYED_DRAG_NOTIFICATION; @vardata void HINT_VALUE_ORIENT_HORIZONTALLY; @vardata void HINT_VALUE_ORIENT_VERTICALLY;
@vardata void HINT_VALUE_ANALOG_DISPLAY; @vardata void HINT_VALUE_DIGITAL_DISPLAY; @vardata void HINT_VALUE_NO_DIGITAL_DISPLAY; @vardata void HINT_VALUE_NO_ANALOG_DISPLAY; @vardata void HINT_VALUE_NOT_DIGITALLY_EDITABLE; @vardata void HINT_VALUE_DO_NOT_MAKE_LARGER_ON_PEN_SYSTEMS;
HINT_VALUE_INCREMENTABLE and HINT_VALUE_NOT_INCREMENTABLE specify whether increment (and decrement) gadgets are appropriate for this GenValue. By default, GenValues are incrementable.
HINT_VALUE_CUSTOM_RETURN_PRESS stores a Message to send out if the user hits return within the textual portion of a GenValue. Normally, this action triggers the interaction default (sending the apply message).
HINT_VALUE_DISPLAYS_RANGE indicates that this GenValue displays a range of values between its minimum and maximum. In most cases, this suggests that the GenValue use sliders or some other UI gadget that is able to show the width of a range. It is up to the specific UI to support range values. If this hint is present, GVLI_
value
refers to the starting point of the range of values, whose width is stored in the
WWFixedAsDWord
value here. The maximum GVLI_
value
in this case would be GVLI_
maximum
minus the range. If this hint is not present, the range "length" is presumed to be zero, even in gadgets that specify a range length by default.
HINT_VALUE_DISPLAY_INTERVALS indicates that intervals should be displayed along an object's range. This hint is used most often in analog (e.g. slider) type displays. If possible, hash marks will appear along the GenValue's display at the intervals specified by
GenValueIntervals
. This structure stores entries for both major intervals and minor intervals. In general, minor intervals will have smaller tick marks than major intervals.
typedef struct { word GVI_numMajorIntervals; word GVI_numMinorIntervals; } GenValueIntervals;
If either GVI_
numMajorIntervals
or GVI_
numMinorIntervals
is zero, only one set of marks will appear.
HINT_VALUE_CONSTRAIN_TO_INTERVALS suggests that the value within GVLI_
value
constrain itself to the GVI_
numMinorIntervals
interval within HINT_VALUE_DISPLAY_INTERVALS.
HINT_VALUE_SHOW_MIN_AND_MAX instructs the GenValue to display its minimum and maximum values, if possible.
HINT_VALUE_IMMEDIATE_DRAG_NOTIFICATION instructs the GenValue to send out its status and/or apply messages constantly during a drag operation (each time the value changes). It is up to the specific UI to support this behavior.
HINT_VALUE_DELAYED_DRAG_NOTIFICATION instructs the GenValue to delay sending out status and/or apply message until the user releases the mouse after the drag operation. It is up to the specific UI to support this behavior.
HINT_VALUE_ORIENT_HORIZONTALLY instructs the specific UI to arrange an analog GenValue, if available, in the horizontal dimension.
HINT_VALUE_ORIENT_VERTICALLY instructs the specific UI to arrange an analog GenValue, if available, in the vertical dimension.
HINT_VALUE_ANALOG_DISPLAY indicates that the GenValue should be displayed in an analog fashion, if applicable. HINT_VALUE_DIGITAL_DISPLAY indicates that the GenValue should be displayed in a digital fashion (i.e. numerically). Similarly, HINT_VALUE_NO_DIGITAL_DISPLAY and HINT_VALUE_NO_ANALOG_DISPLAY indicate that a digital or analog display is not appropriate.
HINT_VALUE_NOT_DIGITALLY_EDITABLE instructs the UI to disallow editing of the text within a numerical GenValue. This hint is only applicable if some other UI means of changing the value is available. To remove a numeric display of values entirely, use HINT_VALUE_NO_DIGITAL_DISPLAY.
HINT_VALUE_DO_NOT_MAKE_LARGER_ON_PEN_SYSTEMS instructs the specific UI to avoid expanding a GenValue object to accept pen input, if possible. By default, text areas of GenValues grow larger under pen systems to allow ink strokes. This hint usually indicates that non-ink means of entering values is available.
The GenValue instance fields can be set to specific values in your Goc file, and they can also be modified by your application at run-time. This section describes how to set and modify these fields in your Goc file.
GVLI_value, MSG_GEN_VALUE_SET_VALUE, MSG_GEN_VALUE_SET_INTEGER_VALUE, MSG_GEN_VALUE_GET_VALUE
The GVLI_
value
instance field stores the current numerical value of the GenValue. You may set an initial value for the GenValue to appear with by setting this instance field in your Goc file. This value is a fixed point number; use
MakeWWFixed
to create this fixed point number in your instance data.
Any user changes on the value within the text field will not affect GVLI_
value
until
MSG_GEN_APPLY
applies that value. If the GenValue operates in delayed mode, it will be marked modified in its GVLI_
stateFlags
whenever a user change occurs; those changes will be applied when the GenValue receives a
MSG_GEN_APPLY
. In most cases, however, a GenValue operates in immediate mode, which will result in an immediate change in GVLI_
value
.
Code Display 8-4 Setting an Initial Value
/* This GenValue will appear with the initial integer value of two. MakeWWFixed * creates a fixed point value. */
@object GenValueClass MyValue = { GI_visMoniker = "My Value"; GVLI_value = MakeWWFixed(2.0); }
GenValueClass
provides several messages to change the value without user control.
MSG_GEN_VALUE_SET_VALUE
sets this numeric value to a passed fixed point value; this fixed point value may be any integer or decimal value.
MSG_GEN_VALUE_SET_INTEGER_VALUE
is a simpler message which sets GVLI_
value
to an integer value passed. Neither of these messages mark the GenValue modified; you can do this with
MSG_GEN_VALUE_SET_MODIFIED_STATE
.
void MSG_GEN_VALUE_SET_VALUE( WWFixedAsDWord value, Boolean indeterminate);
This message sets the
GVLI_value
field of the GenValue to the passed
value
. This message clears a GenValue's modified state in its GVLI_
stateFlags
. To mark the GenValue modified send
MSG_GEN_VALUE_SET_MODIFIED_STATE
after sending this message.
Source: Unrestricted. This message is also used internally when responding to user actions.
Destination: Any GenValue object.
Parameters:
value
The fixed point value to set GVLI_
value
to. If you only need an integral value, consider using MSG_GEN_VALUE_SET_INTEGER_VALUE instead.
Return: Nothing.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_INTEGER_VALUE( word value, Boolean indeterminate);
This message sets the GVLI_
value
to the passed integer (word-sized) value. GVLI_
value
will then contain this value in its high (integral) word and zero in its low (fractional) word. The modified state of the GenValue will be cleared.
Source: Unrestricted. This message is also used internally when responding to user actions.
Destination: Any GenValue object.
Parameters:
value
The signed integer value to set GVLI_
value
to.
Return: Nothing.
Interception: Generally not intercepted.
WWFixedAsDWord MSG_GEN_VALUE_GET_VALUE();
This message returns the value stored in the GenValue's
GVLI_value
instance field. This returned value will be a fixed point number.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The fixed point numerical value of the GVLI_
value
instance field.
Interception: Generally not intercepted.
@alias (MSG_GEN_VALUE_GET_VALUE) word MSG_GEN_VALUE_GET_INTEGER_VALUE();
This message returns the integral portion of the GenValue's value.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The integral value of the GVLI_
value
instance field.
Interception: Generally not intercepted.
GVLI_minimum, GVLI_maximum, MSG_GEN_VALUE_GET_MAXIMUM, MSG_GEN_VALUE_SET_MAXIMUM, MSG_GEN_VALUE_GET_MINIMUM, MSG_GEN_VALUE_SET_MINIMUM
The maximum (
GVLI_maximum
) and minimum (
GVLI_minimum
) values of a GenValue constrain the value of GVLI_
value
. The maximum is the greatest value that the GenValue's GVLI_
value
can have and can be any fixed point number from -32767 up to 32767. The minimum is the least value that the GenValue's GVLI_
value
can have (including negative numbers) and can be any fixed point number from 32767 down to -32767. The maximum value must always be greater than or equal to the minimum value; otherwise, an error will occur.
The maximum and minimum values of the GenValue also can be examined and modified by the application. This is helpful if you need to use the same GenValue for two functions with different ranges of values. You can use the GenValue for one function, change the bounds, and use it for another function.
MSG_GEN_VALUE_GET_MINIMUM
and
MSG_GEN_VALUE_GET_MAXIMUM
return the values of GVLI_
minimum
and GVLI_
maximum
respectively. This value is in fixed point format.
MSG_GEN_VALUE_SET_MINIMUM
and
MSG_GEN_VALUE_SET_MAXIMUM
set the values of GVLI_
minimum
and GVLI_
maximum
respectively. If this new minimum or maximum places the current GVLI_
value
outside the valid value range, the value will be adjusted to fall within the current range.
WWFixedAsDWord MSG_GEN_VALUE_GET_MAXIMUM()
This message returns the fixed point value within the
GVLI_maximum
instance field of the GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The fixed point maximum value in GVLI_
maximum
.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_MAXIMUM( WWFixedAsDWord value);
This message sets the
GVLI_maximum
field of the GenValue to the passed fixed point value. If you set a new maximum that places the current value (in GVLI_
value
) above that maximum, GVLI_
value
will be adjusted to this maximum.
Source: Unrestricted. This message is also used internally when the GenValue is being built.
Destination: Any GenValue object.
Parameters:
value
fixed point value to set GVLI_
maximum
to.
Return: Nothing.
Interception: Generally not intercepted.
WWFixedAsDWord MSG_GEN_VALUE_GET_MINIMUM()
This message returns the fixed point value within the
GVLI_minimum
instance field of the GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The fixed point minimum value in GVLI_
minimum
.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_MINIMUM( WWFixedAsDWord value);
This message sets the
GVLI_minimum
instance field of the GenValue to the passed fixed point value. If you set a new minimum that places the current value (in GVLI_
value
) below that minimum, GVLI_
value
will be adjusted to this minimum.
Source: Unrestricted. This message is also used internally when the GenValue is being built.
Destination: Any GenValue object.
Parameters:
value
fixed point value to set GVLI_
minimum
to.
Return: Nothing.
Interception: Generally not intercepted.
GVLI_increment, MSG_GEN_VALUE_GET_INCREMENT, MSG_GEN_VALUE_SET_INCREMENT
, HINT_VALUE_INCREMENTABLE, HINT_VALUE_NOT_INCREMENTABLE
The
GVLI_increment
instance field stores the fixed point increment value for a GenValue. The increment value is the amount by which the current value (in GVLI_
value
) may increase or decrease when that value is changed by UI controls. The increment value can be any positive fixed point value between one and 65535.
If GVLI_
increment
is greater than the possible range of the GenValue (the distance between minimum and maximum), then incrementing or decrementing the GenValue will toggle GVLI_
value
between its maximum and minimum.
Code Display 8-5 Setting Minimum, Maximum, Increment Values
@object GenValueClass MyValue = { GI_visMoniker = "My Value"; GVLI_value = MakeWWFixed(1.0); GVLI_minimum = MakeWWFixed(-100.0); GVLI_maximum= MakeWWFixed(100.0); GVLI_increment = MakeWWFixed(5.0); }
You may change the fixed point value of this increment with
MSG_GEN_VALUE_SET_INCREMENT
. You may also return the current increment stored within GVLI_
increment
with
MSG_GEN_VALUE_GET_INCREMENT
. You may wish to change a GenValue's increment one GenValue is being used for multiple roles and must change its increment value.
By default, all GenValues are incrementable. If you do not wish to have your GenValue provide UI controls for incrementing (or decrementing) its value, add
HINT_VALUE_NOT_INCREMENTABLE
in its instance data.
HINT_VALUE_INCREMENTABLE
provides the default behavior. (You may still increment or decrement the value manually with
MSG_GEN_VALUE_INCREMENT
or
MSG_GEN_VALUE_DECREMENT
.)
void MSG_GEN_VALUE_SET_INCREMENT ( WWFixedAsDWord value);
This message sets the
GVLI_increment
field to the passed
value
.
Source: Unrestricted. This message is also used internally when the GenValue is being built.
Destination: Any GenValue object.
Parameters:
value
fixed point value to set GVLI_
increment
to.
Return: Nothing.
Interception: Generally not intercepted.
WWFixedAsDWord MSG_GEN_VALUE_GET_INCREMENT();
This message returns the value of the
GVLI_increment
field of the GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The fixed point value of GVLI_
increment
.
Interception: Generally not intercepted.
GVLI_stateFlags, MSG_GEN_VALUE_SET_INDETERMINATE_STATE, MSG_GEN_VALUE_IS_INDETERMINATE, MSG_GEN_VALUE_SET_MODIFIED_STATE, MSG_GEN_VALUE_IS_MODIFIED, ATTR_GEN_SET_MODIFIED_ON_REDUNDANT_SELECTION
GVLI_
stateFlags
stores the current state of the GenValue. There are two
GenValueStateFlags
:
MSG_GEN_APPLY
. The handler for
MSG_GEN_APPLY
checks whether this flag is set before sending out the GenValue's GVLI_
applyMsg
.
GenValues are normally marked as not modified anytime their state is set with an external message, marked modified whenever the user interacts with them, and marked not modified after receiving
MSG_GEN_APPLY
.
MSG_GEN_VALUE_SET_MODIFIED_STATE
allows you to control the modified state of a GenValue outside of these events.
You may set a GenValue's indeterminate or modified state with
MSG_GEN_VALUE_SET_INDETERMINATE_STATE
or
MSG_GEN_VALUE_SET_MODIFIED_STATE
, respectively.
To check whether a GenValue is indeterminate or modified, use
MSG_GEN_VALUE_IS_INDETERMINATE
or
MSG_GEN_VALUE_IS_MODIFIED.
You may also mark a GenValue GVSF_OUT_OF_DATE by sending it MSG_GEN_VALUE_SET_OUT_OF_DATE.
void MSG_GEN_VALUE_SET_INDETERMINATE_STATE( Boolean indeterminateState);
This message sets the indeterminate state for a GenValue. Pass TRUE to mark the GenValue indeterminate, FALSE to mark it not indeterminate. The GenValue will not be marked modified after this message.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters:
indeterminateState
TRUE to set the GVSF_INDETERMINATE flag in the GenValue's GVLI_
stateFlags
,
FALSE to clear the GVSF_INDETERMINATE flag.
Interception: Generally not intercepted.
Boolean MSG_GEN_VALUE_IS_INDETERMINATE();
This message checks whether a GenValue is indeterminate.
Source: Unrestricted.
Destination: Any GenValue object.
Return: TRUE if GenValue is indeterminate, FALSE if it is not.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_MODIFIED_STATE( Boolean modifiedState);
This message sets the modified state for a GenValue. Pass TRUE to mark the GenValue modified, FALSE to mark it not modified.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters:
modifiedState
TRUE to set the GVSF_MODIFIED flag in the GenValue's GVLI_
stateFlags
,
FALSE to clear the GVSF_MODIFIED flag.
Interception: Generally not intercepted.
Boolean MSG_GEN_VALUE_IS_MODIFIED();
This message checks whether a GenValue has been modified since the last
MSG_GEN_APPLY
.
Source: Unrestricted.
Destination: Any GenValue object.
Return: TRUE if GenValue is modified, FALSE if it is not.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_OUT_OF_DATE();
This message sets a GenValue's GVSF_OUT_OF_DATE flag.
Source: Unrestricted.
Destination: Any GenValue object.
Interception: Generally not intercepted.
GVLI_displayFormat, MSG_GEN_VALUE_SET_DISPLAY_FORMAT, MSG_GEN_VALUE_GET_DISPLAY_FORMAT, ATTR_GEN_VALUE_METRIC_EQUIVALENT, ATTR_GEN_VALUE_DECIMAL_PLACES
In addition to displaying an integer numerical value, a GenValue may also display numerical values of several other formats. These formats may be any one of the
GenValueDisplayFormat
enumerations provided in
GenValueClass
. The allowed enumerations of type
GenValueDisplayFormat
are:
GVLI_
displayFormat
controls how the values of the GenValue will be represented. For example, if the display format is in centimeters, the display will include the text "cm" after the numerical value; if the display includes a fractional part, a decimal point will be present. These display formats will also convert the values (which are stored as points) into the proper distance units for the textual display.
By default, the value's fractional portion will be displayed using 3 places to the right of the decimal point. You may alter this number of places with ATTR_GEN_VALUE_DECIMAL_PLACES. You may only choose a number of decimal places between zero to four (inclusive), because of the limited text space offered within a GenValue.
Your GenApplication object contains instance data which specifies whether the application is being run under US or metric units. This setting may affect the display of your units depending on the particular
GenValueDisplayFormat
.
Importantly,
all
distance units (inches, picas, centimeters, etc.) store their values as Points (1/72 inch). The system automatically converts these values (in Points) into the proper units of the GenValue's GVLI_
displayFormat
when it displays the numerical value within the textual display.
Code Display 8-6 Setting a Distance Display Format
@object GenValueClass MyValue = { GI_visMoniker = "My Value"; GVLI_displayFormat = GVDF_INCHES;
/* For an initial value of 1 inch, the equivalent value in Points is 72. */ GVLI_value = MakeWWFixed(72.0);
/* For an initial value of 1/2 inch, the equivalent value in Points is 36. */ GVLI_increment = MakeWWFixed(36.0); }
For example, if your display format is GVDF_INCHES and you wish to set an initial value of 1 inch and an increment of 1/2 an inch, you should set these values to 72 (points which equals 1 inch) and 36 (points which equals one-half inch) respectively. This is necessary because the system expects these values to be in Points for other system operations. A conversion table is provided below.
Any increments for GVDF_POINTS_OR_MILLIMETERS or GVDF_INCHES_OR_CENTIMETERS are assumed to be in US units. If the application instead operates in metric, the increment will be automatically converted to a metric equivalent by the system; this metric equivalent will usually be rounded to a convenient numerical value. You may specify an ATTR_GEN_VALUE_METRIC_EQUIVALENT to override the default increment that the system calculates, however.
For example, assume GVDF_INCHES_OR_CENTIMETERS is selected and the value and increment are 72 (points which equals 1 inch). If the application is in US units, the display will specify inches and the value and increment will be 72 (1 inch); if the application is instead in metric, the display will specify centimeters and the increment will be 70.866 (2.5 cm). If instead, you choose an ATTR_GEN_VALUE_METRIC_INCREMENT of 52.692 (2 cm), that will be the increment used if the application is metric.
Code Display 8-7 ATTR_GEN_VALUE_METRIC_INCREMENT
/* If the application is US, the initial value will be 1 inch and the increment * will be 1 inch. If the application is metric, the initial value will be 2.54 cm * (1 inch or 72 points) but the increment will be 2.0 cm (56.692 points). If * ATTR_GEN_VALUE_METRIC_INCREMENT were not included, the system would have chosen * an increment of 2.5 cm (70.866 points) which is the closest "nice" value to the * original increment of 72 points (1 inch). */
@object GenValueClass MyValue = { GI_visMoniker = "My Value"; GVLI_displayFormat = GVDF_INCHES_OR_CENTIMETERS; GVLI_value = MakeWWFixed(72.0); GVLI_increment = MakeWWFixed(72.0); ATTR_GEN_VALUE_METRIC_INCREMENT = MakeWWFixed(56.692); }
To set a new display format, send
MSG_GEN_VALUE_SET_DISPLAY_FORMAT
. To retrieve the current display format, send the GenValue
MSG_GEN_VALUE_GET_DISPLAY_FORMAT
. Note that changing the display format will not change the numerical value of that display. For example, if the display format changes from decimal to integer, the GenValue will round the number down and display only the integer portion of the value.
GenValueDisplayFormat MSG_GEN_VALUE_GET_DISPLAY_FORMAT();
This message returns the GVLI_
displayFormat
field of the GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return:
GenValueDisplayFormat
of the GenValue.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_DISPLAY_FORMAT( GenValueDisplayFormat format);
This message sets the
GVLI_displayFormat
of the GenValue to the given format. The current value in GVLI_
value
is unaffected, but the display will be updated to reflect the new display format.
Source: Unrestricted. This message is also used internally when the GenValue is being built.
Destination: Any GenValue object.
Parameters:
format
GenValueDisplayFormat
to set the GenValue to.
Return: Nothing.
Interception: Generally not intercepted.
GVLI_applyMsg, GVLI_destination, HINT_VALUE_NAVIGATE_TO_NEXT_FIELD_ON_RETURN_PRESS, HINT_VALUE_CUSTOM_RETURN_PRESS, MSG_GEN_VALUE_GET_APPLY_MSG, MSG_GEN_VALUE_SET_APPLY_MSG, MSG_GEN_VALUE_GET_DESTINATION, MSG_GEN_VALUE_SET_DESTINATION
GVLI_
applyMsg
sets the message for the GenValue to send out whenever it has been modified and needs to apply its changes. Whenever a GenValue receives
MSG_GEN_APPLY,
i
t will check whether its GVSF_MODIFIED flag has been set; if it has, it will send out its apply message. If a GenValue is operating in immediate mode, these actions will happen immediately, resulting in an immediate action.
GVLI_
destination
specifies the destination object (or process) to send the GVLI_
applyMsg
to. (This may also be a
TravelOption
, such as TO_APP_TARGET.)
Code Display 8-8 Sending an Apply Message
@object GenValueClass MyValue = { GI_visMoniker = "My Value"; GVLI_value = MakeWWFixed(1.0); GVLI_applyMsg = MSG_MY_VALUE_DOUBLE_VALUE; GVLI_destination = process; }
/* Retrieve the current value. This value will be a fixed point dword. */
@method MyValueProcessClass, MSG_MY_VALUE_DOUBLE_VALUE { WWFixedAsDWord curValue;
curValue = @call MyValue::MSG_GEN_VALUE_GET_VALUE(); curValue = curValue*2; @call MyValue::MSG_GEN_VALUE_SET_VALUE(curValue, 0); }
A GenValue's changes are typically applied when the user hits the Return key and the GenValue has the focus. You can change this behavior, though, with the following hints:
HINT_VALUE_CUSTOM_RETURN_PRESS
allows a textually-oriented GenValue to send the specified message to the destination object when the Return key is pressed.
HINT_VALUE_NAVIGATE_TO_NEXT_FIELD_ON_RETURN_PRESS
instructs the GenValue to navigate (via the UI) to the next textually-activated object (as the tab key works in many situations).
To change a GenValue's apply message or destination, send it
MSG_GEN_VALUE_SET_APPLY_MSG
or
MSG_GEN_VALUE_SET_DESTINATION
, respectively. Use
MSG_GEN_VALUE_GET_APPLY_MSG
or
MSG_GEN_VALUE_GET_DESTINATION
to return the current apply message or destination.
The apply message should be defined on the prototype
GEN_VALUE_APPLY_MSG
, whose values are shown below.
void GEN_VALUE_APPLY_MSG( WWFixedAsDWord value, word stateFlags);
This prototype defines the message sent out when the GenValue is "applied." The output of the GenValue should handle a message with these parameters.
Source: GenValue, when "applied."
Destination: The GenValue's output (
GVLI_destination
) object.
Parameters:
value
The current value of the GenValue.
stateFlags
GenValueStateFlags
stored in
GVLI_stateFlags
.Return: Nothing.
Interception: The destination object should handle the apply message with this format.
Message MSG_GEN_VALUE_GET_APPLY_MSG();
This message returns the GenValue's GVLI_
applyMsg
.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The apply message of the GenValue.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_APPLY_MSG( Message message);
This message sets the apply message (in GVLI_
applyMsg
) for a GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: message The apply message to set for the GenValue.
Return: Nothing.
Interception: Generally not intercepted.
optr MSG_GEN_VALUE_GET_DESTINATION();
This message returns the current destination object (or process) that the GenValue sends its apply messages to.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The destination optr (GVLI_
destination
) of the GenValue.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_DESTINATION( optr dest);
This message sets the
GVLI_destination
field of the range to the passed optr. The object can be a pointer to a specific object in the system (i.e. the GenProcess object) or can be a pointer to a generic location in the system (i.e. a
TravelOption
).
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: dest The optr of the new destination object.
Return: Nothing.
Interception: Generally not intercepted.
Besides altering instance data, there are several other messages and mechanisms for your use in
GenValueClass
.
Adjusting the Value Indirectly
MSG_GEN_VALUE_INCREMENT, MSG_GEN_VALUE_DECREMENT, MSG_GEN_VALUE_SET_VALUE_TO_MINIMUM, MSG_GEN_VALUE_SET_VALUE_TO_MAXIMUM
To increase the value of GVLI_
value
by the increment in GVLI_
increment
, send the GenValue
MSG_GEN_VALUE_INCREMENT
. To decrease the value of GVLI_
value
by the increment in GVLI_
increment
, send the GenValue
MSG_GEN_VALUE_DECREMENT
. These messages are equivalent to clicking on the UI controls provided to increment or decrement the GenValue (usually up and down arrows). Both of these messages clear the indeterminate state of the object and
do not change
its modified state.
To set the value of GVLI_
value
to the minimum in GVLI_
minimum
, send the GenValue
MSG_GEN_VALUE_SET_VALUE_TO_MINIMUM
. To set the value of GVLI_
value
to the maximum in GVLI_
maximum
, send the GenValue
MSG_GEN_VALUE_SET_VALUE_TO_MAXIMUM
. Both of these messages clear the indeterminate state of the GenValue and
do not change
its modified state.
Note that
HINT_VALUE_NOT_INCREMENTABLE
has no effect on these messages; that hint only removes any user controls for incrementing or decrementing a value.
void MSG_GEN_VALUE_INCREMENT();
This message increases the value of GVLI_
value
within the GenValue by the increment in GVLI_
increment
. This message will clear the indeterminate flag of the GenValue but will not affect its modified flag.
Source: Unrestricted. This message is also used internally when responding to user actions.
Destination: Any GenValue object.
Parameters: None.
Return: Nothing. GVLI_
value
will be incremented (or set to the maximum if increasing the value would push it over the maximum).
Interception: Generally not intercepted.
void MSG_GEN_VALUE_DECREMENT();
This message decreases the value of GVLI_
value
within the GenValue by the increment in GVLI_
increment
. This message will clear the indeterminate flag of the GenValue but will not affect its modified flag.
Source: Unrestricted. This message is also used internally when responding to user actions.
Destination: Any GenValue object.
Parameters: None.
Return: Nothing. GVLI_
value
will be decremented (or set to the minimum if decreasing the value would push it below the minimum).
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_VALUE_TO_MINIMUM();
This message sets the value of GVLI_
value
to the minimum value in GVLI_
minimum
. This message will clear the indeterminate flag of the GenValue but will not affect its modified flag.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: Nothing.
GVLI_value
will be set to GVLI_
minimum
.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_VALUE_TO_MAXIMUM();
This message sets the value of GVLI_
value
to the maximum value in GVLI_
maximum
. This message will clear the indeterminate flag of the GenValue but will not affect its modified flag.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: Nothing.
GVLI_value
will be set to GVLI_
maximum
.
Interception: Generally not intercepted.
ATTR_GEN_VALUE_STATUS_MSG, MSG_GEN_VALUE_SEND_STATUS_MSG
If your GenValue is operating in delayed mode, there usually occur times when your GenValue's state may not reflect the most recent changes. In most cases this is fine, but in some cases you may wish other UI objects to be notified of a change in your GenValue's state without sending out an apply message. This can be done with a status message.
A status message allows your GenValue to send out a message whenever the user interacts with the GenValue, regardless of whether that change will be immediately applied. This is most useful for cases in which two UI objects are representing information that depends on each other. The status message allows one UI object to inform its friend that its state has changed, and that the friend should change its state to reflect the new information.
To give a GenValue a status message, include ATTR_GEN_VALUE_STATUS_MSG in the object's declaration. Use the prototype GEN_VALUE_STATUS_MSG to define your status message. This prototype ensures that the status message passes the correct parameters (the current value and state flags of the GenValue).
Any user changes that do not result in the sending of the object's apply message will result in the sending of the object's status message. For an object in immediate mode, this ATTR will have no effect. You may also manually send an object's status message by sending the GenValue
MSG_GEN_VALUE_SEND_STATUS_MSG
.
void GEN_VALUE_STATUS_MSG( WWFixedAsDWord value, word stateFlags);
This prototype should be used to define the status message of the GenValue.
Source: The GenValue, when its status message is sent.
Destination: The GenValue's destination object (
GVLI_destination
).
Parameters:
value
The current user value of the GenValue.
stateFlags
GVLI_stateFlags
.Return: Nothing.
Interception: Must be handled by the output object if the status message is to have any effect.
void MSG_GEN_VALUE_SEND_STATUS_MSG( Boolean modifiedState);
This message sends the status message stored in the object's ATTR_GEN_VALUE_STATUS_MSG instance field. You should pass this message the modified State you wish to send. This modified state may or not reflect the GVSF_MODIFIED flag in the GenValue's GVLI_
stateFlags
.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: modifiedState TRUE if this message should pass the modified bit (GVSF_MODIFIED) set, FALSE if it should pass GVSF_MODIFIED cleared.
Return: Nothing.
Interception: Generally not intercepted.
MSG_GEN_VALUE_GET_VALUE_TEXT, MSG_GEN_VALUE_SET_VALUE_FROM_TEXT, MSG_GEN_VALUE_GET_MAX_TEXT_LEN, MSG_GEN_VALUE_SET_MAX_TEXT_LEN, MSG_GEN_VALUE_SELECT_TEXT
The GenValue's numeric values are displayed within a special text field. In addition to retrieving the numeric value of the GenValue, you may also retrieve the textual representation of that number with
MSG_GEN_VALUE_GET_VALUE_TEXT
. Similarly, you can set the value of the GenValue from a textual representation with
MSG_GEN_VALUE_SET_VALUE_FROM_TEXT
.
You must pass these messages a
GenValueType
which specifies the instance data field you are wishing to set or get. The
GenValueType
types are:
typedef enum /* word */ { GVT_VALUE, /* GVLI_value */ GVT_MINIMUM, /* GVLI_minimum */ GVT_MAXIMUM, /* GVLI_maximum */ GVT_INCREMENT , /* GVLI_increment */ GVT_LONG, /* Longest value we can * create. */ GVT_RANGE_LENGTH, /* End of the displayed * range, if applicable. */ GVT_RANGE_END, /* Last value in the range, * if applicable. */ GVT_VALUE_AS_RATIO_OF_AVAILABLE_RANGE /* The current value, * relative to minimum. */ } GenValueType;
Some special subclasses of the GenValue will want to calculate how many characters it will allow the user to type into its text field. By default, the number of characters is determined by the maximum and minimum values, but subclasses can handle
MSG_GEN_VALUE_GET_MAX_TEXT_LEN
to set it specifically. This message is sent by the range to itself when deciding how big the text field should be. The maximum text length allowed is thirty characters long.
If you wish to select a GenValue's text, send the GenValue MSG_GEN_VALUE_SELECT_TEXT. The specific UI has final say on whether it allows a GenValue to exhibit selectable text.
void MSG_GEN_VALUE_GET_VALUE_TEXT( char *buffer, GenValueType valueType);
This message retrieves a fixed point value (either
GVLI_value
, GVLI_
minimum
, GVLI_
maximum
, or GVLI_
increment
) from the GenValue and stores its textual representation (in a null-terminated text string) in the passed buffer. This message is not affected by the indeterminate state of the GenValue.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: buffer The pointer to the buffer to store the null-terminated text string. This buffer must be at least GEN_VALUE_MAX_TEXT_LEN bytes long.
GenValueType
, specifying the instance data to retrieve and convert into text.Return: Nothing. The buffer will be filled in with text.
Interception: Can be intercepted by a subclass of GenValue to allow custom text formats to be displayed on the screen. In this case you would also subclass
MSG_GEN_VALUE_SET_VALUE_FROM_TEXT
.
void MSG_GEN_VALUE_SET_VALUE_FROM_TEXT( char *text, GenValueType valueType);
This message sets a fixed point value (either
GVLI_value
, GVLI_
minimum
, GVLI_
maximum
, or GVLI_
increment
) of the GenValue from a textual representation (in a null-terminated text string) in the passed buffer. This message clears the indeterminate state of the GenValue but does not change its modified state.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: text The pointer to a null-terminated text string to set the GenValue's text to.
GenValueType
, specifying the instance data to convert into a fixed point value from the passed text.Return: Nothing. The instance field will be updated.
Interception: Can be intercepted by a subclass of GenValue to allow custom text formats to be displayed on the screen. In this case, you would also subclass
MSG_GEN_VALUE_GET_VALUE_TEXT
.
byte MSG_GEN_VALUE_GET_MAX_TEXT_LEN();
This message retrieves the maximum number of characters allowed to be typed into a textual GenValue. By default, this number is calculated from the minimums and maximums specified. Subclasses of GenValue may wish to intercept this message to allow different text lengths (such as values represented with floating point or enumerated type instance data).
Source: The GenValue object sends this to itself when it needs to figure out its maximum text length.
Destination: Itself.
Return: Maximum number of allowable characters
Interception: May be intercepted to allow different text lengths.
void MSG_GEN_VALUE_SELECT_TEXT();
This message selects a GenValue's text, if allowed by the specific UI.
Source: Unrestricted.
Destination: Any GenValue object.
Interception: Generally not intercepted.
MSG_GEN_VALUE_GET_VALUE_RATIO, MSG_GEN_VALUE_SET_VALUE_FROM_RATIO
Instead of setting or getting a specific value, you may want in some cases to set or get a value as a ratio; this ratio is determined as the percentage of the difference between the minimum and maximum. For example, if the minimum of a GenValue is 10 and the maximum is 100, the 50% ratio would be 55 (halfway between 10 and 100).
To retrieve the value of a GenValue as a ratio, send it
MSG_GEN_VALUE_GET_VALUE_RATIO
. This message will return the ratio as a dword value. You must also pass this message the
GenValueType
telling it which instance data you wish to retrieve.
To set a value within a GenValue as a ratio, send it
MSG_GEN_VALUE_SET_VALUE_RATIO
, passing it the ratio and the
GenValueType
(instance data field) to set. The correct value will be computed and set within your GenValue's instance data.
WWFixedAsDWord MSG_GEN_VALUE_GET_VALUE_RATIO( GenValueType valueType);
This message gets the value of a GenValue (GVLI_
value
) as a ratio of its distance between the minimum value and the maximum value. It returns this ratio as a dword (0000.0000h meaning 0%, ffff.ffffh meaning 100%).
Source: Unrestricted.
Destination: Any GenValue object.
Parameters:
valueType
GenValueType
of the instance data field to get the value ratio for.
Return: The ratio as a dword.
Interception: You may intercept subclasses of
GenValueClass
to allow custom text formats to be displayed on the screen. Someone subclassing this message for this reason would also want to subclass
MSG_GEN_VALUE_SET_VALUE_FROM_TEXT
to correctly parse text to yield a new value.
void MSG_GEN_VALUE_SET_VALUE_RATIO( WWFixed ratio, GenValueType valueType);
This message sets the value (GVLI_
value
) of a GenValue as a ratio of the distance between its minimum and the maximum values. This ratio should be in the form of a dword (0000.0000h meaning 0%, ffff.ffffh meaning 100%).
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: ratio The dword ratio value.
GenValueType
of the instance data to set as a ratio.Return: Nothing.
Interception: Generally not intercepted.
MSG_GEN_VALUE_GET_TEXT_FILTER
One of the GenValue's components is a text field to enter values into. When this visual component is being built, the GenValue will send
MSG_GEN_VALUE_GET_TEXT_FILTER
to itself to set up a text filter. A text filter allows a textual object to accept or reject certain characters on a number of bases. The default
VisTextFilter
provides numeric-only filtering with no spaces and no tabs on GVDF_INTEGER or GVDF_DECIMAL display formats; no tabs on distance unit display formats.
You may set up your own filter by intercepting this message and returning a
VisTextFilter
of your own choosing.
VisTextFilter MSG_GEN_VALUE_GET_TEXT_FILTER();
This message retrieves the text filtering in use on a GenValue object. By default, GenValues use numeric-only filtering with no spaces and no tabs for numbers and a filtering of no tabs for distance units.
Source: Unrestricted. This message is normally sent by a GenValue to itself when building its textual component.
Destination: Any GenValue object.
Parameters: None.
Return:
VisTextFilter
in use by the textual portion of the GenValue.
Interception: Usually, you will want to intercept this message if you subclass
GenValueClass
and provide your own custom filtering.
HINT_VALUE_DISPLAYS_RANGE, MSG_GEN_VALUE_SET_RANGE_LENGTH, MSG_GEN_VALUE_GET_RANGE_LENGTH, MSG_GEN_VALUE_ADD_RANGE_LENGTH, MSG_GEN_VALUE_SUBTRACT_RANGE_LENGTH
Special GenValue objects may actually display ranges rather than individual values within a range--for example, the GEOS scrollbars in OSF/Motif display the percentage of the document visible in the view.
For your GenValue to display a range, use
HINT_VALUE_DISPLAYS_RANGE
. If this hint is not present, the GenValue is assumed to have a range size of zero. This hint takes an argument of
WWFixedAsDWord
to indicate the size of the range.
To get the range length, use
MSG_GEN_VALUE_GET_RANGE_LENGTH
. To set the range, use
MSG_GEN_VALUE_SET_RANGE_LENGTH
. Two other messages,
MSG_GEN_VALUE_ADD_RANGE_LENGTH
and
MSG_GEN_VALUE_SUBTRACT_RANGE_LENGTH
, add or subtract the value of the GenValue by the range length.
WWFixedAsDWord MSG_GEN_VALUE_GET_RANGE_LENGTH();
This message returns the value stored in
HINT_VALUE_DISPLAYS_RANGE
.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters: None.
Return: The value stored in
HINT_VALUE_DISPLAYS_RANGE
. If this hint is not set, the return value will be zero.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SET_RANGE_LENGTH( WWFixedAsDWord value);
This message has the effect of adding or changing the hint
HINT_VALUE_DISPLAYS_RANGE
for the GenValue. Setting a value of zero will cause the GenValue to act as if it did not have this hint.
Source: Unrestricted.
Destination: Any GenValue object.
Parameters:
value
The new range length.
Return: Nothing.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_ADD_RANGE_LENGTH();
This message adds the range length to the current value of the GenValue object. It has the effect of incrementing the
GVLI_value
field by the range length.
Source: Unrestricted.
Destination: Any GenValue object.
Interception: Generally not intercepted.
void MSG_GEN_VALUE_SUBTRACT_RANGE_LENGTH();
This message subtracts the range length from the current value of the GenValue object. It has the effect of decrementing the
GVLI_value
field by the range length.
Source: Unrestricted.
Destination: Any GenValue object.
Interception: Generally not intercepted.


Login
Register
feamer
beam up your files
Show Details
Checkout on GitHub
Share your data everywhere
Share all your date with just one click from every
Don't waste your time
Share the data with just one click
Cross-Plattform ready!
Any Data at any device.


referenced
by Axa Mei Liauw at 2020-02-04 02:01:15.merged
by Axa Mei Liauw at 2020-02-04 02:01:16.closed
by Axa Mei Liauw at 2020-02-04 02:01:16.head_ref_deleted
by Axa Mei Liauw at 2020-02-04 02:01:19.head_ref_force_pushed
by Axa Mei Liauw at 2020-02-04 01:45:02.head_ref_force_pushed
by None at 2020-02-04 14:03:52.renamed
by Kevin Reiss at 2020-02-04 14:21:34.referenced
by Kevin Reiss at 2020-02-04 14:22:26.merged
by Kevin Reiss at 2020-02-04 14:22:26.closed
by Kevin Reiss at 2020-02-04 14:22:26.head_ref_deleted
by Kevin Reiss at 2020-02-04 14:22:45.referenced
by Kevin Reiss at 2020-02-04 14:23:58.merged
by Kevin Reiss at 2020-02-04 14:23:58.closed
by Kevin Reiss at 2020-02-04 14:23:58.head_ref_deleted
by Kevin Reiss at 2020-02-04 14:24:02.mentioned
by Axa Mei Liauw at 2020-02-04 15:37:36.subscribed
by Axa Mei Liauw at 2020-02-04 15:37:36.referenced
by None at 2020-02-04 15:43:22.merged
by None at 2020-02-04 15:43:22.closed
by None at 2020-02-04 15:43:22.labeled
by Kevin Reiss at 2020-02-04 14:28:29.assigned
by None at 2020-02-04 15:53:12.assigned
by None at 2020-02-04 16:02:34.referenced
by None at 2020-02-04 16:08:22.referenced
by None at 2020-02-04 16:17:08.review_requested
by None at 2020-02-04 16:01:42.referenced
by Kevin Reiss at 2020-02-04 16:09:01.merged
by Kevin Reiss at 2020-02-04 16:09:01.closed
by Kevin Reiss at 2020-02-04 16:09:01.head_ref_deleted
by Kevin Reiss at 2020-02-04 16:09:05.head_ref_force_pushed
by None at 2020-02-04 16:17:09.renamed
by None at 2020-02-04 16:18:33.review_requested
by None at 2020-02-04 16:24:43.referenced
by Kevin Reiss at 2020-02-04 16:25:33.merged
by Kevin Reiss at 2020-02-04 16:25:33.closed
by Kevin Reiss at 2020-02-04 16:25:33.head_ref_deleted
by Kevin Reiss at 2020-02-04 16:25:36.head_ref_force_pushed
by None at 2020-02-04 20:21:38.ready_for_review
by None at 2020-02-04 20:36:03.referenced
by Kevin Reiss at 2020-02-04 20:43:33.merged
by Kevin Reiss at 2020-02-04 20:43:33.closed
by Kevin Reiss at 2020-02-04 20:43:34.head_ref_deleted
by Kevin Reiss at 2020-02-04 20:43:37.@escowles wrote:
received a request to update one of the western americana items from Sara Logue, who said a user alerted her to a problem with this item: I noticed the catalog description doesn't match the caption on the photo. http://arks.princeton.edu/ark:/88435/n583xv70q
given the discussions have had about those items, just ingesting WC055 first and taking that item down maybe makes more sense
unfortunately, i'm looking at the data, and the only match point i can find between the EAD (which has the component IDs we need to link to) and the MODS (which has the ARKs we need to update) is this:
from the EAD, c/did/container: Volume Folio 2, Leaf 3, Photograph q
from the MODS, location/holdingSimple/shelfLocator: (WA) WC055, Folio 2, Leaf 3, Photograph q
the MODS file is also pudl0017/wc055/1139550/002/00000005/q.mets, so maybe it's possible to turn the EAD structure into that....
the one thing that's definitely important is to ingest the items with the ARKs (or add them before making the items public) — that is the key to having figgy update the existing ARKs instead of minting duplicate ones
here's the rake task for doing bulk ingest: https://github.com/pulibrary/figgy/blob/master/lib/tasks/bulk.rake#L20 — you likely want to write a custom script or update this rake task to allow also specifying the ARKs
mentioned
by Esmé Cowles at 2020-02-04 14:34:29.subscribed
by Esmé Cowles at 2020-02-04 14:34:29.labeled
by Esmé Cowles at 2020-02-04 16:06:12.labeled
by Esmé Cowles at 2020-02-04 16:06:12.This is still happening.
reopened
by Trey Pendragon at 2020-02-04 16:45:52.Yeah, that's a good call on the text thing. We'll have to change this:
Rubocop is complaining about a non-existent problem.
head_ref_force_pushed
by Trey Pendragon at 2020-02-04 19:43:01.head_ref_force_pushed
by Trey Pendragon at 2020-02-04 19:44:06.referenced
by Trey Pendragon at 2020-02-04 20:05:16.merged
by Trey Pendragon at 2020-02-04 20:05:16.closed
by Trey Pendragon at 2020-02-04 20:05:16.head_ref_deleted
by Trey Pendragon at 2020-02-04 20:05:20.I found a seed that causes this, I'm running rspec --bisect
now. The branch is puo_structure
, and the seed is 47790
labeled
by Nikitas Tampakis at 2020-02-04 20:52:35.renamed
by Nikitas Tampakis at 2020-02-04 20:52:44.This is also true for the "master" field. These fields need to pull from the numismatic people dataset.
renamed
by Trey Pendragon at 2020-02-04 16:23:09.labeled
by Trey Pendragon at 2020-02-04 16:23:46.labeled
by Nikitas Tampakis at 2020-02-04 20:56:51.labeled
by Nikitas Tampakis at 2020-02-04 20:56:51.labeled
by Nikitas Tampakis at 2020-02-04 20:56:51.labeled
by Nikitas Tampakis at 2020-02-04 21:04:48.labeled
by Nikitas Tampakis at 2020-02-04 21:04:48.labeled
by Nikitas Tampakis at 2020-02-04 21:06:26.labeled
by Nikitas Tampakis at 2020-02-04 21:06:26.labeled
by Nikitas Tampakis at 2020-02-04 21:09:37.labeled
by Nikitas Tampakis at 2020-02-04 21:09:37.labeled
by Nikitas Tampakis at 2020-02-04 21:09:37.labeled
by Nikitas Tampakis at 2020-02-04 21:13:24.labeled
by Nikitas Tampakis at 2020-02-04 21:13:24.labeled
by Nikitas Tampakis at 2020-02-04 21:13:24.labeled
by Nikitas Tampakis at 2020-02-04 21:17:00.labeled
by Nikitas Tampakis at 2020-02-04 21:17:00.labeled
by Nikitas Tampakis at 2020-02-04 21:19:02.labeled
by Nikitas Tampakis at 2020-02-04 21:19:02.labeled
by Nikitas Tampakis at 2020-02-04 21:19:02.labeled
by Nikitas Tampakis at 2020-02-04 21:23:42.labeled
by Nikitas Tampakis at 2020-02-04 21:23:42.closed
by Esmé Cowles at 2020-02-04 21:50:36.renamed
by Trey Pendragon at 2020-02-04 18:19:47.referenced
by Esmé Cowles at 2020-02-04 21:50:35.merged
by Esmé Cowles at 2020-02-04 21:50:35.closed
by Esmé Cowles at 2020-02-04 21:50:36.head_ref_deleted
by Esmé Cowles at 2020-02-04 21:50:40.labeled
by Trey Pendragon at 2020-02-04 23:05:39.labeled
by Trey Pendragon at 2020-02-04 23:07:04.referenced
by Christina Chortaria at 2020-02-04 23:15:37.merged
by Christina Chortaria at 2020-02-04 23:15:37.closed
by Christina Chortaria at 2020-02-04 23:15:38.labeled
by Trey Pendragon at 2020-02-04 22:33:53.referenced
by Trey Pendragon at 2020-02-04 22:43:41.closed
by Christina Chortaria at 2020-02-04 23:15:38.labeled
by Trey Pendragon at 2020-02-04 22:07:43.referenced
by Trey Pendragon at 2020-02-04 23:03:42.closed
by Christina Chortaria at 2020-02-04 23:21:49.referenced
by Christina Chortaria at 2020-02-04 23:21:49.merged
by Christina Chortaria at 2020-02-04 23:21:49.closed
by Christina Chortaria at 2020-02-04 23:21:49.Priority update: They need this done by the end of the day 01/07/20. If it doesn't show up in the DPUL collection appropriately that's a separate bug we can tackle with a different priority.
mentioned
by Kim Leaman at 2020-02-04 14:26:39.subscribed
by Kim Leaman at 2020-02-04 14:26:39.renamed
by None at 2020-02-04 18:43:19.renamed
by Trey Pendragon at 2020-02-04 18:51:37.labeled
by Trey Pendragon at 2020-02-04 19:05:43.This still works under my personal account, but other users are reporting that this is still preventing uploads.
From the user reporting the issue:
The Shared drive would be set up by the supervisor and shared with the students via their princeton gmail accounts
I will attempt to reproduce this and proceed.
I am currently able to access resources in Team Drives from my account over the REST API for Drive using https://developers.google.com/drive/api/v3/reference/files/list?apix=true&apix_params=%7B%22corpora%22%3A%22allDrives%22%2C%22includeItemsFromAllDrives%22%3Atrue%2C%22includeTeamDriveItems%22%3Atrue%2C%22supportsAllDrives%22%3Atrue%2C%22supportsTeamDrives%22%3Atrue%2C%22fields%22%3A%22files(name%2Cparents%2CwebContentLink)%22%7D#try-it
All of these boolean parameters are being passed through the various Ruby Gems, so I suspect that the request is somehow being improperly formatted.
reopened
by James R. Griffin III at 2020-02-04 19:27:14.Seems legible, though as someone that continues to develop bare metal, its a bit beyond my common usage. Though this next computer I'm getting will probably push me towards standardized development environments.
head_ref_force_pushed
by Trey Pendragon at 2020-02-05 00:45:22.It looks like someone put the RTL character at the end of their barcode? I'm not really sure if we should handle this. @tampakis
Yeah just saw that, maybe we should sanitize the input? From the form, ascii characters only? I would say only alphanumeric but we recently found a net id with a .
character
mentioned
by Nikitas Tampakis at 2020-02-04 16:57:58.subscribed
by Nikitas Tampakis at 2020-02-04 16:57:58.@hackmastera No, I think they decided on a different way of grouping these items. I'll go ahead and close this ticket.
closed
by Esmé Cowles at 2020-02-04 13:09:42.mentioned
by None at 2020-02-04 13:09:42.subscribed
by None at 2020-02-04 13:09:42.closed
by Francis Kayiwa at 2020-02-04 16:12:58.head_ref_deleted
by Francis Kayiwa at 2020-02-04 16:13:02.closed
by Francis Kayiwa at 2020-02-04 17:32:25.head_ref_deleted
by Francis Kayiwa at 2020-02-04 17:32:30.closed
by Francis Kayiwa at 2020-02-04 17:33:15.head_ref_deleted
by Francis Kayiwa at 2020-02-04 17:33:18.head_ref_force_pushed
by None at 2020-02-04 20:05:38.referenced
by Francis Kayiwa at 2020-02-04 21:16:49.review_requested
by Francis Kayiwa at 2020-02-04 21:17:44.


Scramble ... Play Scramble online, a game similar to Boggle.
Originally hosted at the Delphi web site, it ran there for decades. Delphi discontinued it just before 2000, when SunKing2 wrote a version in Java with crazyg's scoring scheme. It ran online for years, being hosted by dedicated Scramblers. It has a forum and the official site where the game is hosted is Scramblelovers.com.
We welcome feedback, suggestions, requests or bug reports.
If you want to redesign the web site, or just help, that is welcome too. The code is open source and hosted on Github.
Although you are in no way obligated, some users have requested a way to support the project.
A big thank you goes out to all the donors who have already contributed. Your kindness is very much appreciated.


The State of Charge (SOC)% at which the pack is deemed to be fully charged. This setting is used to compute total Pack Health by comparing a relationship between observed capacity and expected capacity.
NOTE: This value has no affect on when the BMS finishes charging UNLESS it is configured to stop charging at this SOC. Details are on the Cell Settings tab of the profile settings.
| < SOC (State of Charge) Settings | Discharged SOC > |


Status
{{if .activeRealmKey}}
{{if not $realm.UseAuthenticatedSMS}}
Warning! Do not enable this unless you are working with Apple and Google to enable this feature.
Enabling this feature will increase the length of your SMS messages such that they are split across multiple messages, which will increase costs.
{{template "clippy" "certKeyID"}}
This is the Key ID (kid) of the currently active key.
{{template "clippy" "activePublicKey"}}
This is the currently active public key.
There are no SMS signing keys active for this realm.
Signing keys
To manual rotate your Authenticated SMS signing key:
- Create a new key by clicking the button below
- Communicate that key version and public key to Google and Apple
- Wait for confirmation from Google AND Apple that the new key is live
- Activate the new key in this system
- Wait at least 48 hours post activation to delete old keys
There is a limit of {{.maximumKeyVersions}} key versions. Destroy an existing key version to create another.
{{else}}
Create new signing key version
{{end}}
{{if .realmKeys}}
| Key ID | Public key |
|---|---|
| {{$rk.GetKID}} {{if $rk.Active}}Active{{end}} |
{{template "clippy" $rk.GetKID}}
Backed by:
{{template "clippy" (printf "key-%d" $rk.ID)}}
Your server operator may ask for this.
{{if not $rk.Active}}
{{end}}
|


Best Office Depot and OfficeMax Black Friday 2019 deals
by Sean PortnoyWe combed through Office Depot and OfficeMax's Black Friday 2019 ad and found the best tech deals.
Two of the major office superstore chains merged a few years ago, which has resulted in a joint Black Friday ad in recent holiday shopping seasons.
Also: Check out CNET for even more Black Friday deals
Among the listings for desks, office chairs, and shredders are also several deals on laptops and desktops for home and small business offices -- and even some gaming systems for those you like to work hard and play hard.
When is Office Depot and OfficeMax's Black Friday Sale?
Office Depot's Black Friday's sales event will kick off on Nov. 29 for in-store savings, while online shoppers can get started a day earlier on Nov. 28 at just after midnight. Office Depot and OfficeMax will also have deals going on throughout the entire month.
Black Friday 2019: Best Office Depot and OfficeMax deals
If these deals aren't yet available, they will be when Office Depot and OfficeMax's Black Friday 2019 sale goes live.
HP Officejet 3830 Wireless Printer for $40 ($60 off)
- See it now: Office Depot and OfficeMax
It might not be your typical humongous office printer, but this all-in-one device can do all of your printing, copying, and scanning needs from the office and at home while saving 60% off.
HP Chromebook 11-v010nr Laptop for $100 ($80 off)
- See it now: Office Depot and OfficeMax
While it's 99 cents more than Lenovo's $99 laptop deal on Black Friday, this bargain is actually cheaper than what HP is selling the same Chromebook for during Black Friday. With Intel Celeron N3060 CPU, 4GB of RAM, 16GB of built-in storage, and an 11.6-inch display, the 11-v010nr isn't exactly a powerhouse, but it can get the job done for basic computing tasks -- at a price you can't argue with anyway.
Dell Inspiron 14 5000 2-In-1 Laptop for $400
- See it now: Office Depot and OfficeMax
A bigger, more powerful -- and pricier -- Inspiron 2-in-1 than the 3000 series featured in our Dell Black Friday coverage, the 5000 edition upgrades the processor to an Intel Core i3 and the touchscreen to 14 inches and doubles the built-in storage to 128GB while retaining 4GB of RAM.
HP 22-c0226 All-In-One PC for $280 ($150 off)
- See it now: Office Depot and OfficeMax
This deal provides a complete desktop system for under $300, with space savings to boot. That's thanks to the all-in-one design, where a 21.5-inch full HD display houses an AMD A6 processor, 4 gigs of RAM, and a terabyte hard drive.
Lenovo IdeaCentre T540 Gaming Desktop for $750 ($380 off)
- See it now: Office Depot and OfficeMax
Office Depot and OfficeMax offer a big sale on a well-spec'd midrange gaming PC with an understated look. For well under $1,000, the T540 is stacked with an Intel Core i7 processor, 16GB of memory, a 512GB solid-state drive, and an Nvidia GeForce GTX 1660 graphics card.
HP Envy 13-aq0050od Laptop for $550 ($200 off)
- See it now: Office Depot and OfficeMax
Privacy lovers will appreciate the features that this stylish Envy 13 configuration has to offer, such as the ability to shut off its webcam at the touch of a button, a SureView integrated privacy screen, and a built-in fingerprint reader. The SureView technology is part of the 13.3-inch full HD display, which is complemented by a Core i5 processor, 8GB of memory, and a 256GB SSD.
Lenovo IdeaPad S340 Laptop for $450 ($330 off)
- See it now: Office Depot and OfficeMax
A solid laptop at a solid discount, the S340 features a Core i7 chip and a 15.6-inch full HD screen, not to mention 8 gigs of RAM and a 256GB SSD. All of this comes in a package that's a shade under 4 pounds and just 0.7 inches at its thinnest.
More Office Depot and OfficeMax Black Friday 2019 deals
Didn't find what you were looking for in the above deals? Office Depot and OfficeMax have plenty of other Black Friday specials, including the following:
Laptops and Desktops
- Lenovo Legion Y540 Laptop (Core i7 processor, 8GB of RAM, 256GB SSD, Nvidia GeForce GTX 1650 graphics, 15.6-inch screen) for $799.99 ($280 off)
- iBuyPower Gaming Desktop PC (Core i5 processor, 8GB of RAM, 1TB hard drive, Nvidia GeForce GTX 1650 graphics) for $649.99
- HP 15-dy1095od Laptop (Core i7 processor, 16GB of RAM, 256GB SSD, 15.6-inch display) for $549.99 ($350 off)
- Lenovo IdeaCentre 510A Desktop (Core i5 processor, 8GB of RAM, 1TB hard drive) for $369.99 ($100 off)
- Lenovo Flex 14 (Core i7 processor, 8GB of RAM, 256GB SSD, 14-inch touchscreen) for $649.99
- HP Pavilion 590-p0016 Desktop (Core i3 processor, 8GB of RAM, 1TB hard drive) for $329.99 ($180 off)
Other tech deals
- Brother Ptouch Labelmaker for $20 ($20 off)
- Lexar 128GB MicroSD for $30 ($70 off)
- Norton 360 Deluxe for $10 ($80 off)
- Western Digital My Passport SSD with 64GB USB Drive for $130 ($70 off)
Disclosure: ZDNet may earn a commission from some of the products featured on this page.


Phone Number:
Location:
Close
Discover a Doctor You'll Love
Search a database of over 1,000,000 physicians.
A free service for individuals searching for available doctors in a certain area. Enter your location and specialty desired and we'll do the rest!
Enter your location
Select your specialty:
Find


Statistics
This shows you several data charts, most common names, number of multimedia objects and other useful facts. Of particular note are the two data indicators. The Data Quality indicator gives a star rating from 1 to 5 based on the percentage of events which have citations. A key part of genealogy is accurate information so this indicator is of significance. The second indicator reports on how complete the data is. The more people who have key data fields complete, the higher the Data Status rating. Although data status is not likely to be 100%, it gives you some indication of how much or how little information has been collected.
Fig 1. Statistics Panel
Family.Show Help
Copyright © 2009


I suppose that if there are many sensor nodes, there is a significant chance of collisions. Are these detected and will the emonTH retry the transmission?
Suppose you want to cover a 6-storey building with emonTH, say 2 sensor nodes per storey, so a total of 12 sensor nodes. And suppose that we find that 2 base stations are required to receive transmissions from all the 12 sensors. The layout might be like this:
L6 - 2 x emonTH: n27 & n28 L5 - 2 x emonTH: n25 & n26 , and a RPi with baseid=16 L4 - 2 x emonTH: n23 & n24 L3 - 2 x emonTH: n21 & n22 L2 - 2 x emonTH: n19 & n20 , and a RPi with baseid=15 L1 - 2 x emonTH: n17 & n18
Does this look OK?
Can both RPi send readings to the same emoncms.org account?
What happens if both RPi's "hear" the same transmission from n21 for example? I suppose both basestations might send the same data to emoncms.org there should be no bad effects right?
Or should I split them into 2 different network groups? Say group 210 for the lower 3 floors, and 211 for the upper 3 floors?
Also, do I understand correctly that there is no feature for privacy and excluding unwanted neighbors' transmissions? We simply have to choose different group id's if we ever encounter unwanted readings from neighbors?
Re: Questions about the radio link between EmonTH and RFM12Pi.
You can send from multiple base stations to one emoncms.org account no problem, the default max number of nodes is 32, which can only be overridden if you have your own emoncms server.
The 2 Pi approach should work ok to get the network spread you need although that will depend a lot on positioning and obstacles (walls and floors).
Depending on where you are in the world you may be able to consider 2 different frequencies for the 2 networks to avoid cross network collisions altogether,
It is difficult to know whether 2 distinct networks or 1 network with 2 base stations would give better coverage. 2 networks on the same frequency could reduce workload for each receiver but wouldn't reduce collisions, where as the single network may give better coverage to the overlapping area since the same packet can be received by either Pi.
To avoid collisions the best practice would be to use the time transmission facility used for setting the glcd's time to trigger the very first transmission from each node and also include a small delay to stagger the transmissions across the repeated interval. Doing this could be more complex with just one network as 2 time signals will be confusing and one time signal is unlikely to reach all nodes.
If legislation allows, the 2 frequency approach is probably easiest to implement with minimal fuss, but personally I would probably opt for a single frequency for flexibility, add the synchronization code and then experiment with 1 verses 2 groups and positioning.
The network transmissions are very simple, the 200+ group ids and fairly short range is usually adequate to get an exclusive network.
The transmissions from the nodes are not acknowledged or retransmitted so synchronizing the transmissions is highly recommended if there is a lot of traffic.
Paul
Re: Questions about the radio link between EmonTH and RFM12Pi.
May I know approx how many microseconds or milliseconds does the transmission of an emonTH last? If it is short enough, I probably can live with the tiny percentage of collisions.
What is the "time transmission facility" that you mention? Which box can transmit time?
Speaking of time, I do not remember setting up the real time clocks or NTP in the emonTH's or the RaspberryPi's, am I right that they data times I see on emoncms.org must be stamped by emoncms.org? The emonTH's transmissions do not include time stamp, and the basestations also don't include timestamps when inputting to emoncms.org right?
Thank you pb66 for the info.
Re: Questions about the radio link between EmonTH and RFM12Pi.
"May I know approx how many microseconds or milliseconds does the transmission of an emonTH last"
I think knowledge of the size of the payload and this page gives you that: http://jeelabs.org/2011/06/09/rf12-packet-format-and-design/
Time is normally broadcast by the Base node following interrogation of the server, which can be the RPi, emoncms.org or another server running emonCMS.
Re: Questions about the radio link between EmonTH and RFM12Pi.
I was referring to the time packet transmitted via the rfm2pi by emonHub, it is intended to keep the emonGLCD's time updated but could easily be used as a trigger for synchronizing the transmissions from the nodes.
The nodes are not time aware as they do not have an rtc or an internet connection for ntp so emonHub allocates a timestamp upon receipt of each packet. The Pi uses NTP by default if running Raspbian.
As Robert points out the duration of the payload will dependent on the size, the thing to bear in mind is although the collisions maybe reduced if the payloads are shorter, as the intervals are intended to be regular any collisions could be repeated in a cycle and/or if not controlled the pattern could shift slightly resulting in more (or less) lost packets.
Re: Questions about the radio link between EmonTH and RFM12Pi.
Thanks, according to the jeelabs packet description page, he said the no-payload minimal packet is 9 bytes = 72 bits ~ 1.5ms at 50 kbits / s.
I believe the payload of the emonTH is 4 ints = 8 bytes = 64 bits. So the packet is 64 + 72 = 136. So that takes about 2.72 ms to send.
I understand what pd66 means about the regular intervals though. Would be nice to add a random fudge of say 1% of the interval, to prevent long runs of bad packets.
Re: Questions about the radio link between EmonTH and RFM12Pi.
When we were having big problems with collisions and the emonGLCD, which turned out to be a problem in the library, one suggestion was that the conflicting transmitting nodes should transmit at intervals that were all prime multiples of the time unit, so that the possibility of a slowly creeping overlap (which I imagine your 1% dither is intended to alleviate) would be largely avoided. That and Paul's are two completely opposite approaches to the same problem, Paul is suggesting synchronising and the other relies on probability.
Bu there's a problem with Paul's suggestion: if the emonTH (or any node) is battery powered, it can't continuously listen for a time transmission in order to synchronise, on account of battery life. The best it can do, which will still be expensive in terms of power consumption, would be to turn on the receiver just before it expects a time packet; and when it sees it, send its packet immediately, or sleep until its slot comes round or whatever; and then sleep. If it doesn't hear it after a suitable interval, it must give up and wait for the next - and there obviously needs to be a strategy there to allow it to synchronise after a reasonable period if the transmissions are there. If the node is mains powered, listening continuously isn't a problem, so if there's only one battery-powered sensor node in the system, it makes sense for that to be the master clock and it will then never need to listen - the rest of the system will synchronise to that.
Re: Questions about the radio link between EmonTH and RFM12Pi.
oops! yeah sorry I overlooked the fact they were all battery powered emonTH's, I had a similar discussion some time ago about 30 emonTx's and just continued that thought process.
I think I would still favor synchronization over chance, but agree it's not such an easy task when considering sleep functions and power consumption.


This is my story
I have been in the gaming industry for 15 years, and professionally for the last 5. I like to have the option of building my own rigs or buying high end ones.
Through the years I have spent thousands of dollars on many sites, but with newegg.com I have finally found a home for all my technology needs.


Technical Leadership | Operations | Software Engineering
What am I all about?I'm a technical leader with over 10 years of experience administering Linux and Windows servers and related applications, specializing in virtualization, configuration management, and automation on premise and in the cloud.
What's my experience?Verica | 2021 - 2022
SportsEngine | 2021
SportsEngine | 2020 - 2021
SportsEngine | 2019 - 2020
SportsEngine | 2018 - 2019
SportsEngine | 2015 - 2018
Bethel University | 2013 - 2015
Bethel University | 2012 - 2013


Group the selected node when created
Inheritance
System.Object
CommentBlock
Assembly: com.alelievr.NodeGraphProcessor.Runtime.dll
[Serializable]
public class CommentBlock
Constructors
|
Improve this Doc
View Source
Declaration
public CommentBlock(string title, Vector2 position)
Parameters
| Type |
Name |
Description |
| System.String |
title |
|
| UnityEngine.Vector2 |
position |
|
Fields
|
Improve this Doc
View Source
Declaration
Field Value
| Type |
Description |
| UnityEngine.Color |
|
|
Improve this Doc
View Source
Declaration
public List<string> innerNodeGUIDs
Field Value
| Type |
Description |
| System.Collections.Generic.List<System.String> |
|
|
Improve this Doc
View Source
Declaration
Field Value
| Type |
Description |
| UnityEngine.Rect |
|
|
Improve this Doc
View Source
Declaration
Field Value
| Type |
Description |
| UnityEngine.Vector2 |
|
|
Improve this Doc
View Source
Declaration
Field Value
| Type |
Description |
| System.String |
|
Methods
|
Improve this Doc
View Source
Declaration
public virtual void OnCreated()


- formatVersion
- The version of the CSV-LD format that a processor should assume for this spreadsheet.
- vocabBase
- The "vocabulary base" for terms in this spreadsheet.
- prefix
- Defines a prefix so that common URI bases can be prefixes of term URIs.
- id
- The URI for this sheet.
- csvw
- The URI for JSON-LD CSVW metadata for this sheet.
- type
- A category assigned to a subject. a subject may have multiple types.
- label
- A human-readable name for the subject.
- A description of the subject resource.
- line
- An identifier for the line of a changesheet. Useful if you want to annotate the change
represented by that one line.
- block
- An identifier for a block, a set of lines, of a changesheet.
Useful if you want to annotate the change represented by the block.
A block is analogous to a git commit or database transaction.
- in or out
- Is this line being asserted ('in') or retracted ('out')? If left blank, assumes asserted.
- namespace
- Do you want to add this to the "main" namespace? A "test" namespace. If left blank, "main" is
assumed. Analogous to a named graph or git branch.
- subject
-
An identifier for the subject of the statement to be asserted or retracted.
If left blank and if previous row's object cell is also blank, then an identifier
is generated for both. If left blank, if previous row's object cell is NOT also blank,
and if this row is not the first row, then the subject of the previous row is assumed.
If not in the form of a URL or CURIE (using a registered #prefix),
then the cell value is interpreted to be a variable so as to unify with its usages in
other cells in the changesheet -- an identifier is generated to substitute for the variable.
- predicate
- An identifier or recognized label for the predicate/attribute part of the statement.
- object
- An identified or literal value for the object/value part of the statement.
May not be blank if subject of statement is also blank.
If left blank and if next row's subject cell is also blank, then an identifier
is generated for both. If the value is the same as that of a variable introduced
earlier in the current sheet for a statement's subject, then the value is interpreted
as an instance of that variable, rather than as a literal string value with the same sequence
of characters.


Synergy 1.4
-
Greg Hurrell
At last, I can release Synergy 1.4 to the world... 40 days after ordering the Internet connection, ya.com finally gets around to installing the ADSL line and shipping me the modem. I packaged this release up some time ago, thinking I'd be able to release it, then I've been sitting on it while I waited for ya.com to get into gear... In any case, in the meantime I've been busy on a huge update to WinSwitch as well as some other neat stuff...
Anyway:
What's new
Synergy website
Other Wincent products
Direct download link
-
anonymous
I'm having a problem with 1.4. After waking from sleep, Synergy generally stops responding. I have to go to Activity Monitor to force-quit it, and then to System Prefs to re-launch it. It's a big pain....
-
Greg Hurrell
I can't reproduce this issue here, so I suggest you file a bug report at bugs.wincent.com and we'll see if we can collect some information to narrow down the circumstances which are triggering the problem.
Reply
This topic is now closed.


Introduction
coding.js and web-worker-interpreters make it possible for you to make your tutorial, blog post or textbook interactive. Writing code fragments that your users can edit and run is as easy as calling the prompt function with the id of the div element your code lives in.

 (+ 137 349)

try editing the (+ 137 349), then press Ctrl-Enter and watch the evaluated answer (originally 486) change.
Including coding.js
To use coding.js on your own website, simply clone the coding-js github project and include the coding.js file. We can create a CodingJS object, which by default to a scheme interpreter.

In this example, the language is set to scheme, so coding.js invokes a scheme interpreter behind the scenes whenever your user edits your code. The interpreter path is the relative path to the directory coding.js lives in and is used to load additional files (as the files are loaded relative to this page and not coding.js). For instance if you place coding.js in a js/ext/ subdirectory, and want to use the language logic, do this instead.

Dependency management
Often, code fragments depend on each other. We have a prompt with a function definition:

 (define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))

We can reuse this definition of factorial in other code fragments:

 (factorial 10);

This is done by passing an additional argument to prompt, an array which lists the id's of all the dependencies. When a dependency is updated, everything that depends on it is changed as well; try modifying the definition of factorial and watch the call to (factorial 10) change.
Related functions
prompt is part of a family of functions designed to be used "as-is". The other functions in the family introduce slight variations on prompt. They include frozen_prompt, no_output_prompt, no_output_frozen_prompt and hidden_prompt.
frozen_prompt makes a prompt that is not editable. Useful for exercise where users must wirte some definition for a function to be true.

 (define x 10)

 (define x 10) (* x x);

no_output_prompt suppresses the output, so only the code is visible. It is not very useful.
no_output_frozen_prompt is a frozen prompt that suppresses output. It is useful for showing off language features as it suppresses error messages.

 (if <predicate> <consequent> <alternative>)

Lastly, hidden_prompt makes both the code and the output invisible, and can be used for exercise scaffolding, black-box functions, etc.
Internals
This example demonstrates using some internal functions. make_editable causes a div to be converted into a CodeMirror editor instance, preloaded with the code it contained.
the compute function calls a scheme (or language of your choice) interpreter, and in fact we can get all our functionality by binding it to the onBlur event listener that CodeMirror gives us.


--- layout: post title: With Power comes Responsibllty tags: - Personal Opinion status: publish type: post published: true meta: {} --- Kathy Sierra has had a very unpleasant experience: Creating Passionate Users: Death threats against bloggers are NOT "protected speech" (why I cancelled my ETech presentations)
Death threats against bloggers are NOT "protected speech"This post is my small message of support and a plea for this sort of insanity to stop. We are a privileged generation to have access to the Internet, it is a resource that no one in human history has ever had before. We have new ways of talking, making money and governing ourselves which are still evolving and taking human society in new directions (it will be even better once we can get the rest of the world on the net). However the type of abuse that Kathy suffered (and other types of abuse) slows down the spread of the net in all sorts of ways:
powered by performancing firefox


"Well, it's that time of the month again. Payroll checks for our employees,
which require your signatures. And no forgetting to sign the big ones!"
-- Trading Places
Many countries use different conventions for the thousands separator and decimal mark. For example in the Netherlands one million one thousand two hundred and eighty one-hundredths is written as 1.001.200,80, but in the US this is written as 1,001,200.80. Use your coding skills to convert dollars in the first style (Netherlands, Germany, Russia, Turkey, Brazil, and others) to the second style (US, UK, Canada, China, Japan, Mexico, and others).
Only currency amounts in dollars should be converted: $1.234,50 to $1,234.50, $1.000 to $1,000, and $4,57 to $4.57. Don't accidentally convert your router's IP address <IP_ADDRESS>. You should leave currency noted in the US style unchanged.
Input: A string containing dollar amounts to be converted.
Output: A string with converted currencies.
Example:
checkio("Lot 192.001 costs $1.000,94.") == "Lot 192.001 costs $1,000.94." checkio("$1,23 + $2,34 = $3,57.") == "$1.23 + $2.34 = $3.57."
How it is used: This is an exercise in working with strings and using the Python standard library.
Precondition:
0 < len(text) ≤ 1000;
len(fractional_part_of_currency) in {0,2};
all(s[-1].isdigit() for s in currency_substrings);
all(s[0] == '$' for s in currency_substrings)


Hi, I'am
MUGISHA THIERRY
I'am a Rwandan teenager
"Make it work, make it right, make it fast.” – Kent Beck"
A student from Moringa School
*Why Programming: The reason to why i decided to study programing it's because i love computer science and i see IT as my future carrier.
*Education Level: I am a high school graduate from New Life Christian High School where i persued A0 in Mathematics,Pysics and Computer science.
*Job experience: From October to December 2018, i was a translator at compassion international Rwanda. In December 2019, i worked in ICASA 2019 in transportation and hotel management department


SIMPIC Second Round console
Round counter
0
Change
0
Eliminate
0
Eliminate
0
Eliminate
0
Eliminate
Submit
Clear
Clear Judge
Save Image


Id: 334
Name: Stealy
Status: Alive
Species: Poopybutthole
Type:
Gender: Male
OriginName: unknown
OriginUrl:
LocationName: Interdimensional Cable
LocationUrl: https://rickandmortyapi.com/api/location/6
Image: https://rickandmortyapi.com/api/character/avatar/334.jpeg
Episode: ['https://rickandmortyapi.com/api/episode/19']
Url: https://rickandmortyapi.com/api/character/334
Created: 2018-01-10T16:36:06.982Z


In the previous section, we discussed an example that used runtime-type identification (RTTI) to enable a given input or output operation to adapt its behavior based on the properties of the respective stream type.
Before RTTI was introduced into the C++ language in the form of the new style dynamic_cast<>, the problem was solved using iword(), pword(), and xalloc() as substitutes for RTTI. We describe this alternative technique only briefly because, as the previous example suggests, the use of dynamic casts is clearly preferable to this technique.
The basic idea of the traditional technique is that the stream class and all functions and classes that need the runtime type information, like the inserter and the manipulator function, agree on two things:
An index into the arrays for additional storage; in other words, Where do I find the RTTI?
The content or type identification that all concerned parties expect to find there; in other words, What will I find?
In the following sketch, the derived stream class reserves an index into the additional storage. The index is a static data member of the derived stream class, and identifies all objects of that stream class. The content of that particular slot in the stream's additional storage, which is accessible through pword(), is expected to be the respective stream object's this pointer.
Here are the modifications to the derived class odatstream:
template <class charT, class Traits=char_traits<charT> > class odatstream : public basic_ostream <charT,Traits> { public: static const int xindex; //1 odatstream(std::basic_ostream<charT,Traits>& ostr, const char* fmt = "%x") : std::basic_ostream<charT,Traits>(ostr.rdbuf()) { pword(xindex()) = this; //2 fmt_=new charT[strlen(fmt)]; std::use_facet<ctype<charT> >(ostr.getloc()) .widen(fmt, fmt+strlen(fmt), fmt_); } // ... }; template <class charT, class Traits> const int odatstream<charT, Traits>::xindex = std::ios_base::xalloc ();
| //1 | The static const member xindex is initialized with an index unique to each specialization of odatstream. |
| //2 | The reserved slot in the arrays for additional storage is filled with the object's own address. |
Here are the corresponding modifications to the manipulator:
template <class charT, class Traits> inline basic_ostream<charT,Traits>& sfmt(std::basic_ostream<charT,Traits>& ostr, const char* f) { if (ostr.pword(odatstream<charT,Traits>::xindex()) == &ostr) //1 ((odatstream<charT,Traits>&)ostr).fmt(f); return ostr; }
| //1 | The manipulator function checks whether the content of the reserved slot in the stream's storage is the stream's address. If it is, the stream is considered to be a date output stream. |
Note that the technique described in this section is not safe. There is no way to ensure that date output streams and their related functions and classes are the only ones that access the reserved slot in a date output stream's additional storage. In principle, every stream object of any type can access all entries through iword() or pword(). It's up to your programming discipline to restrict access to the desired functions. It is unlikely, however, that all streams will make the same assumptions about the storage's content. Instead of agreeing on each stream object's address as the run-time-type identification, we also could have stored certain integers, pointers to certain strings, etc. Remember, it's the combination of reserved index and assumed content that represents the RTTI substitute.


| Home | Trees | Indices | Help |
|
|---|
|
|
Since: 0.4
|
|||
|
klass This class is used when a strongly typed object is decoded but there is no registered class to apply it to. |
|
|||
|
|||
|
|||
|
|||
|
Inherited from Inherited from Inherited from |
|
|||
|
Inherited from |
|
x.__init__(...) initializes x; see x.__class__.__doc__ for signature
|
Creates an instance of the klass.
|
This function is used to check if the class being aliased fits certain
criteria. The default is to check that the
|
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Mon Sep 7 23:17:42 2009 | http://epydoc.sourceforge.net |


World renowned Josh Little is the founder and president of the Duke City FRA (Ferret Racing Association). Josh enjoys the semi-annual events as they are exceptional fundraisers, but mostly appreciates that the winning ferret has 6 months of bragging rights.


ThorDeal
Simple, fast and maximum discounts for you.
Home
Latest Offers
Top deals
Amazon offers
Flipkart Offers
Myntra & Others
My Space
Registration link
Contact Us
Join Us!!
Loading…
Click here
to Claim Cashbacks!!


#include <constraint_solver.h>
Definition at line 4769 of file constraint_solver.h.
◆ SequenceVarElement() [1/2]
| operations_research::SequenceVarElement::SequenceVarElement |
( |
| ) |
|
◆ SequenceVarElement() [2/2]
| operations_research::SequenceVarElement::SequenceVarElement |
( |
SequenceVar *const |
var | ) |
|
|
explicit |
◆ Reset()
| void operations_research::SequenceVarElement::Reset |
( |
SequenceVar *const |
var | ) |
|
◆ Clone()
◆ Copy()
◆ Var()
| SequenceVar* operations_research::SequenceVarElement::Var |
( |
| ) |
const |
|
inline |
◆ Store()
| void operations_research::SequenceVarElement::Store |
( |
| ) |
|
◆ Restore()
| void operations_research::SequenceVarElement::Restore |
( |
| ) |
|
◆ LoadFromProto()
| void operations_research::SequenceVarElement::LoadFromProto |
( |
const SequenceVarAssignment & |
sequence_var_assignment_proto | ) |
|
◆ WriteToProto()
| void operations_research::SequenceVarElement::WriteToProto |
( |
SequenceVarAssignment * |
sequence_var_assignment_proto | ) |
const |
◆ ForwardSequence()
| const std::vector<int>& operations_research::SequenceVarElement::ForwardSequence |
( |
| ) |
const |
◆ BackwardSequence()
| const std::vector<int>& operations_research::SequenceVarElement::BackwardSequence |
( |
| ) |
const |
◆ Unperformed()
| const std::vector<int>& operations_research::SequenceVarElement::Unperformed |
( |
| ) |
const |
◆ SetSequence()
| void operations_research::SequenceVarElement::SetSequence |
( |
const std::vector< int > & |
forward_sequence, |
|
|
const std::vector< int > & |
backward_sequence, |
|
|
const std::vector< int > & |
unperformed |
|
) |
| |
◆ SetForwardSequence()
| void operations_research::SequenceVarElement::SetForwardSequence |
( |
const std::vector< int > & |
forward_sequence | ) |
|
◆ SetBackwardSequence()
| void operations_research::SequenceVarElement::SetBackwardSequence |
( |
const std::vector< int > & |
backward_sequence | ) |
|
◆ SetUnperformed()
| void operations_research::SequenceVarElement::SetUnperformed |
( |
const std::vector< int > & |
unperformed | ) |
|
◆ Bound()
| bool operations_research::SequenceVarElement::Bound |
( |
| ) |
const |
|
inline |
◆ DebugString()
| std::string operations_research::SequenceVarElement::DebugString |
( |
| ) |
const |
◆ operator==()
| bool operations_research::SequenceVarElement::operator== |
( |
const SequenceVarElement & |
element | ) |
const |
◆ operator!=()
| bool operations_research::SequenceVarElement::operator!= |
( |
const SequenceVarElement & |
element | ) |
const |
|
inline |
The documentation for this class was generated from the following file:


(defun transaction-rollback (transaction &key (rucksack (current-rucksack))) (transaction-rollback-1 transaction (rucksack-cache rucksack) rucksack))


Registration Form
Firstname
Lastname
Password
Select your gender
Male
Female
Select your vehicle type
2 wheeler
4 wheeler
Coca-cla pepsi, balayaa babu sexy


I got a busy day lined up for you. We’re starting off with Steem Visions. It’s a Saturday morning panel discussion hosted by @stellabelle and @juliakponsford. We’ve lined up some great artists to present their work and talk about it. I’m excited to share this with you! I’ll play some music starting in about an hour to give people time to come into the Peace, Abundance, and Liberty Discord Channel. The show starts at 11am EST (90 min from when this posts, and 1600 UTC).
Here’s the major details to Steem Visions!
Guests include:
@elohprojects
@everlove
@yusaymon
@poeticsnake
@overkillcoin
@alexandravart
@denniskonstantin
@mrblinddraw
@paolobeneforti
@drawingly
@reinhard-schmid
@zipporah
Hosts include: @stellabelle and @juliakponsford.
Boston Meetup
After this morning’s presentation I’m going into Boston to host a meetup. It’s not too late to join us. It’s all happening on Beacon St in Brookline. We’re going to start by getting some Sushi at 2pm and we’ll wrap up by playing some board games at Knight Moves.
You can find the details for the Boston meetup here.
Peace Academy
Ok, wrapping up a busy Saturday is the Peace Academy. At 9pm EST (0200 UTC) I’ll have just gotten home from Brookline and I’ll dive right in with my cohost @isaria and we’ll talk about how to live in state of Peace, Abundance, and Liberty. This week will likely include a discussion of dealing with grief and how to break free from a victim mentality.
We’ll be doing this online at msp-waves and in Discord. I hope to see you there!
Witness work
Witnesses are two things. They are a server and a person running the server. The server’s job is to responsibly and ethically create the blockchain. Servers have to stay up to date and not attempt to put fake transactions to enrich individuals into the block. As for people they typically fall into the category of developer or community builder. Most of the witnesses in the top 20 are developers. A handful are community builders. There’s 1-2 unicorns in there that can do both.
All of these kinds of projects listed above represent contributions I’m making to add value to the Steem blockchain. The goals remain the same since I started my Witness campaign: Spread the Values of Peace, Abundance, and Liberty, Help Steem grow, and Train and Retain Minnows on the Platform. If you like what I’m doing and what I stand for I would ask that you consider voting for my witness.
 Normally in my life when bad things happen it tends to pour in.  He was the last remaining member of my mother’s side of that generation. Down to me, my brother and two cousins… I’m now down to my Dad and his sister as the remaining members of the generation above mine. It’s a lonely feeling. Anyway, please send my family some love, prayers, white light, or whatever. It’s a rough time, and if today doesn’t go perfectly that seems likely to be part of the day’s plan. Please bear with me.
This page is synchronized from the post: ‘Steem Visions, Boston Meetup, Peace Academy all Today!’


--- layout: post status: publish published: true title: '"My ant wanna know..." - Episode 8.17' author: display_name: Corey Fineran login: Corey email<EMAIL_ADDRESS>url: '' author_login: Corey author_email<EMAIL_ADDRESS>wordpress_id: 11804 wordpress_url: http://ivyenvy.com/?p=11804 date: '2016-05-01 21:47:32 +0000' date_gmt: '2016-05-02 02:47:32 +0000' categories: - Podcast tags: [] comments: [] ---
Thanks for downloading the 395th episode of The Ivy Envy Podcast. Rain and crummy weather has imposed it's will on baseball games at Wrigley this week. For the 2nd straight series, the Cubs and opponents were only able to complete two games.
We use a shortened series with the Braves as an opportunity to focus on some of the players that have been performing very well, but we haven't spent much time on yet this year. We mainly focus on the bullpen and the bench players.
We have several scary stats and internet muscle flexes to share on this episode.
If you're interested in our 2016 Ivy Envy Weekend at the Lake, click here for the Facebook event.