-
Notifications
You must be signed in to change notification settings - Fork 52
Data Processor URI Scheme
Metawear edited this page Aug 18, 2015
·
6 revisions
An alternative to configuring data processors is to use a string URI. The configuration URI is a combination of a scheme and query string. The scheme and query string are separated by a question mark (?) and the query fields are separated by an ampersand (&).
"[scheme]?[field1=value1]&[field2=value2]...&[fieldN=valueN]"The following tables provide a brief overview of the available transformers and filters and their scheme string. Further details about each scheme is given in the below sections.
| Processor | Type | Description | Scheme |
|---|---|---|---|
| Accumulator | transformer | Computes a running sum of all data received | accumulator |
| Average | transformer | Calculates a running average of the input data over a given sample size | average |
| Comparison | filter | Only allow data through that satisfies the comparison | comparison |
| Counter | transformer | Counts the number of data samples that pass through | counter |
| Delta | both | Only allow data through that exceeds a relative offset from a reference value | delta |
| Math | transformer | Performs a mathematical operation on the input | math |
| Passthrough | filter | A gate that users can manually control | passthrough |
| Pulse | transformer | Detects and quantifies a pulse over a set of data | pulse |
| Rms | transformer | Combines multi-component data by computing root mean square | rms |
| Rss | transformer | Combines multi-component data by computing root sum square | rss |
| Sample | filter | Only allow every Nth data sample through | sample |
| Threshold | both | Only allow data through that crosses a boundary | threshold |
| Time | both | Periodically allow data through | time |
| Field | Description | Required |
|---|---|---|
| output | Output size of the running sum. If not specified, it will infer the output size based on the input | No |
///< equivalent to: process(new Accumulator((byte) 4))
///< accumulate input and allocate 4 bytes for the output regardless of input
process("accumulator?output=4")
///< equivalent to: fromSwitch().process(new Accumulator())
///< accumulate input and infer the output size based in the input signal
///< will implicitly allocate 1 byte because switch data is only 1 byte
fromSwitch().process("accumulator")| Field | Description | Required |
|---|---|---|
| sampleSize | How many data samples to compute a running average of | Yes |
///< equivalent to: process(new Average((byte) 16))
///< Compute a running average over the past 16 samples
process("average?sampleSize=16")| Field | Description | Required |
|---|---|---|
| operation | Sets the comparison used to filter data | Yes |
| reference | Value on the right hand side of the operation the input data is compared to | Yes |
| signed | Force a signed or unsigned comparison. If not specified, this field will be inferred from the input signal | No |
| Operation | Description | Value |
|---|---|---|
| Equals | True if input and reference are equivalent | eq |
| Not equals | Opposite result of equals to comparison | neq |
| Less than | True if input is less than the reference | lt |
| Less than or Equals | True if input is less than or equal to the reference | lte |
| Greater Than | True if input is greater than the reference | gt |
| Greater Than Or Equals | True if input is greater than or equal to the reference | gte |
///< equivalent to: process(new Comparison(Comparison.Operation.EQ, 511))
///< Only allow data that is equal to 511 to pass, infer signed or unsigned based on input
process("comparison?operation=eq&reference=511")
///< equivalent to: process(new Comparison(Comparison.Operation.LTE, 511, true))
///< Only allow data less than or equal to 511 to pass, use a signed comparison
process("comparison?operation=lte&reference=511&signed=true")| Field | Description | Required |
|---|---|---|
| size | Size of the counter, between [1, 4] bytes. If not specified, defaults to 1 byte (counts to 255) | No |
///< equivalent to: process(new Counter((byte) 2))
///< Count number of samples, up to 65535
process("counter?size=2")
///< equivalent to: process(new Counter())
///< Count number of samples, up to 255
process("counter")| Field | Description | Required |
|---|---|---|
| mode | Sets the operation mode of the delta processor | Yes |
| threshold | The limit that the relative distance between the current and reference values must exceed | Yes |
| Mode | Description | Value |
|---|---|---|
| Absolute | Output the value as is | abs |
| Differential | Opposite the difference between the current and reference values | diff |
| Binary | 1 for positive difference, -1 for negative difference | bin |
///< Equivalent to: fromTemperature().process(new Delta(Delta.Mode.DIFFERENTIAL, 2.f))
///< Only allow data through that is 2 degrees or higher from a reference value
///< and output the difference
fromTemperature().process("delta?mode=diff&threshold=2.0")
///< Equivalent to: fromTemperature().process(new Delta(Delta.Mode.BINARY, 4.f))
///< Only allow data through that is 4 degrees or higher from a reference value
///< and output 1 or -1 to signify positive or negative difference, respectively
fromTemperature().process("delta?mode=bin&threshold=4.0")| Field | Description | Required |
|---|---|---|
| operation | Sets the mathematical operation to perform on the data | Yes |
| rhs | Value on the right hand side of the operation | Depends, yes if operation requires 2 inputs, no otherwise |
| signed | Force a signed or unsigned operation, If not specified, this field will be inferred from the input signal | No |
| Operation | Description | Value | # Operands |
|---|---|---|---|
| Addition | Adds the input data with an offset | add | 2 |
| Multiplication | Multiplies the input data by a scale factor | mult | 2 |
| Division | Divides the input data by a scale factor | div | 2 |
| Modulus | Computes the remainder of the input data and a divisor | mod | 2 |
| Exponent | Computes exponentiation using the input as the base, and the rhs value as the exponent | exp | 2 |
| Square Root | Computes square root of the data | sqrt | 1 |
| Left Shift | Performs a left shift of the data | lshift | 2 |
| Right Shift | Performs a right shift of the data | rshift | 2 |
| Subtraction | Subtracts the input data with an offset | sub | 2 |
| Absolute Value | Computes the absolute value of the ipnut | abs | 1 |
///< equivalent to: fromTemperature().process(new Math(Math.Operation.ADD, 273.15))
///< Add 273.15 to the input, infer signed operation based on input
fromTemperature().process("math?operation=add&rhs=273.15")
///< equivalent to: fromTemperature().process(new Math(Math.Operation.ADD, 273.15, true))
///< Add 273.15 to the input with signed addition
fromTemperature().process("math?operation=add&rhs=273.15&signed=true")| Field | Description | Required |
|---|---|---|
| mode | Sets the operation mode | Yes |
| value | Sets the value or condition corresponding to the passthrough mode | Depends, yes for conditional and count modes, no otherwise |
| Mode | Description | Value |
|---|---|---|
| All | Allow all data to pass through | all |
| Conditional | If value is 0, unconditionally block all data. If value is 1, allow all data through | conditional |
| Count | Only allow a fixed number of data samples through | count |
///< equivalent to: process(new Passthrough())
///< passthrough filter allowing all data through
process("passthrough?mode=all")
///< equivalent to: process(new Passthrough(Passthrough.Mode.CONDITIONAL, (short) 0))
///< do not allow data through for now
process("passthrough?mode=conditional&value=0")
///< equivalent to: process(new Passthrough(Passthrough.Mode.COUNT, (short) 4))
///< only allow 4 samples through
process("passthrough?mode=count&value=4")| Field | Description | Required |
|---|---|---|
| mode | Sets the output mode of the processor | Yes |
| threshold | Value the sensor data must exceed for a valid pulse | Yes |
| width | Number of samples that exceed the threshold | No |
| Mode | Description | Value |
|---|---|---|
| area | Output sum of all data samples in the pulse | area |
| peak | Output max value in the pulse | peak |
| width | Output number of samples in the pulse | width |
///< equivalent to: process(new Pulse(Pulse.OutputMode.AREA, 1.f, (short) 16))
///< pulse detector looking for a pulse above 1g consisting of min 16 samples
fromXAxis().process("pulse?mode=area&threshold=1.0&width=16")No query string required for rms.
///< equivalent to: fromAccelAxis().process(new Rms())
///< Compute RMS value of the accelerometer XYZ axis data
fromAccelAxis().process("rms")No query string required for rss.
///< equivalent to: fromAccelAxis().process(new Rss())
///< Compute RSS value of the accelerometer XYZ axis data i.e. vector magnitude
fromAccelAxis().process("rss")| Field | Description | Required |
|---|---|---|
| binSize | Number of elements to | Yes |
///< Equivalent to: process(new Sample((byte) 4))
///< Only let every 4th sample through
process("sample?binSize=4")| Field | Description | Required |
|---|---|---|
| hysteresis | Minimum distance between the limit and value to signal a successful crossing. Use with data that may frequently oscillate around the threshold limit. | No |
| limit | Boundary the data must cross | Yes |
| mode | Processor output mode | Yes |
| Mode | Description | Value |
|---|---|---|
| Absolute | Output the value as is | abs |
| Binary | 1 if data rose above the limit, -1 if data fell below the limit | bin |
///< Equivalent to: fromTemperature().process(new Threshold(30.f, Threshold.Mode.ABSOLUTE))
///< Only allow data through that crosses the 30 degree limit
fromTemperature().process("threshold?limit=30.0&mode=abs")
///< Equivalent to: fromTemperature().process(new Threshold(30.f, Threshold.Mode.BINARY))
///< Only allow data through that crosses the 30 degree limit, convert the data to
///< a 1 if higher, or -1 if lower than the limit
fromTemperature().process("threshold?limit=30.0&mode=bin")| Field | Description | Required |
|---|---|---|
| mode | Processor output mode | Yes |
| period | How often to allow data through. Specify value in milliseconds | Yes |
| Mode | Description | Value |
|---|---|---|
| Absolute | Output the value as is | abs |
| Differential | Output the difference between the current and previous value | diff |
///< equivalent to: process(new Time(10000, Time.Mode.DIFFERENTIAL))
///< Allow the difference between the current and previous value through every 10 seconds
process("time?period=10000?mode=diff")
///< equivalent to: process(new Time(15000, Time.Mode.ABSOLUTE))
///< Allow data through every 15 seconds
process("time?period=15000?mode=abs")