Serial Wombat Arduino Library
SerialWombatAbstractProcessedInput.h
Go to the documentation of this file.
1 #pragma once
2 /*
3 Copyright 2021 Broadwell Consulting Inc.
4 
5 "Serial Wombat" is a registered trademark of Broadwell Consulting Inc. in
6 the United States. See SerialWombat.com for usage guidance.
7 
8 Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14 
15 The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17 
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  * OTHER DEALINGS IN THE SOFTWARE.
25 */
26 
27 #include "SerialWombat.h"
28 #include "limits.h"
29 
80 {
81 public:
88 
89 
90  enum Period {
102 
103  };
104 
105  enum OutputValue {
106  RAW = 0,
108  AVERAGE = 2,
109  };
110 
111  enum Transform {
112  NONE = 0,
115  };
116 
124  int16_t writeInverted(bool inverted)
125  {
126  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
127  pin(),
128  swPinModeNumber(),
129  3,
130  (uint8_t) inverted,
131  0x55,0x55,0x55
132  };
133 
134  int16_t result = _pisw.sendPacket(tx);
135 
136  return(result);
137  }
138 
159  int16_t writeFirstOrderFilteringConstant(uint16_t constant)
160  {
161  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
162  pin(),
163  swPinModeNumber(),
164  11,
165  SW_LE16(constant),
166  0x55,0x55
167  };
168  return (_pisw.sendPacket(tx));
169  }
170 
181  int16_t writeAveragingNumberOfSamples(uint16_t numberOfSamples)
182  {
183  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
184  pin(),
185  swPinModeNumber(),
186  1,
187  SW_LE16(numberOfSamples),
188  0x55,0x55
189  };
190 
191  int16_t result = _pisw.sendPacket(tx);
192 
193  return(result);
194  }
195 
207  int16_t writeExcludeBelowAbove(uint16_t low, uint16_t high)
208  {
209  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
210  pin(),
211  swPinModeNumber(),
212  2,
213  SW_LE16(low),
214  SW_LE16(high)
215  };
216 
217  int16_t result = _pisw.sendPacket(tx);
218 
219  return(result);
220  }
221 
222 
238  int16_t configureQueue(SerialWombatQueue* queue, Period period, bool queueHighByte = true, bool queueLowByte = true)
239  {
240  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
241  pin(),
242  swPinModeNumber(),
243  5,
244  SW_LE16(queue->startIndex)
245  ,(uint8_t)period,
246  (uint8_t)((((uint8_t) queueHighByte) << (uint8_t)1) | (uint8_t)queueLowByte)
247  };
248  int16_t result = _pisw.sendPacket(tx);
249  return(result);
250  }
251 
257  int16_t configureOutputValue(OutputValue outputValue)
258  {
259  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
260  pin(),
261  swPinModeNumber(),
262  4,
263  (uint8_t)outputValue,
264  0x55,0x55,0x55
265  };
266 
267  int16_t result = _pisw.sendPacket(tx);
268 
269  return(result);
270  }
271 
287  int16_t writeTransformScaleRange(uint16_t min, uint16_t max)
288  {
289  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
290  pin(),
291  swPinModeNumber(),
292  6,
293  SW_LE16(min),
294  SW_LE16(max)
295  };
296 
297  int16_t result = _pisw.sendPacket(tx);
298 
299  return(result);
300  }
301 
315  int16_t writeTransformLinearMXB(int32_t m, int32_t b)
316  {
317  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
318  pin(),
319  swPinModeNumber(),
320  7,
321  SW_LE32(((uint32_t)m)),
322  };
323 
324  int16_t result = _pisw.sendPacket(tx);
325  if (result < 0)
326  {
327  return(result);
328  }
329 
330  uint8_t tx2[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
331  pin(),
332  swPinModeNumber(),
333  8,
334  SW_LE32(((uint32_t)b)),
335  };
336  result = _pisw.sendPacket(tx2);
337  return(result);
338  }
339 
344  int16_t writeProcessedInputEnable(bool enabled)
345  {
346  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
347  pin(),
348  swPinModeNumber(),
349  0,
350  (uint8_t)enabled,
351  0x55,0x55,0x55
352  };
353 
354  int16_t result = _pisw.sendPacket(tx);
355 
356  return(result);
357  }
358 
366  uint16_t readMinimum(bool resetAfterRead = false)
367  {
368  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
369  pin(),
370  swPinModeNumber(),
371  9,
372  (uint8_t)resetAfterRead,
373  0x55,0x55,0x55
374  };
375  uint8_t rx[8];
376  int16_t result = _pisw.sendPacket(tx,rx);
377  if (result < 0)
378  {
379  return (65535);
380  }
381  return(rx[4] + 256*rx[5]);
382  }
383 
391  uint16_t readMaximum(bool resetAfterRead = false)
392  {
393  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
394  pin(),
395  swPinModeNumber(),
396  10,
397  (uint8_t)resetAfterRead,
398  0x55,0x55,0x55
399  };
400  uint8_t rx[8];
401  int16_t result = _pisw.sendPacket(tx, rx);
402  if (result < 0)
403  {
404  return (65535);
405  }
406  return(rx[4] + 256 * rx[5]);
407  }
408 
415  uint16_t readAverage()
416  {
417  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
418  pin(),
419  swPinModeNumber(),
420  11,
421  0x55,0x55,0x55,0x55
422  };
423  uint8_t rx[8];
424  int16_t result = _pisw.sendPacket(tx, rx);
425  if (result < 0)
426  {
427  return (0);
428  }
429  return(rx[4] + 256 * rx[5]);
430  }
436  uint16_t readFiltered()
437  {
438  uint8_t tx[] = { (uint8_t)SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS,
439  pin(),
440  swPinModeNumber(),
441  11,
442  0x55,0x55,0x55,0x55
443  };
444  uint8_t rx[8];
445  int16_t result = _pisw.sendPacket(tx, rx);
446  if (result < 0)
447  {
448  return (0);
449  }
450  return(rx[6] + 256 * rx[7]);
451  }
455  virtual uint8_t pin() = 0;
456 
460  virtual uint8_t swPinModeNumber() = 0;
461 
462 private:
463  SerialWombatChip& _pisw;
464 };
465 
466 
SerialWombatAbstractProcessedInput::PERIOD_4mS
@ PERIOD_4mS
Definition: SerialWombatAbstractProcessedInput.h:93
SerialWombatChip
Class for a Serial Wombat chip. Each Serial Wombat chip on a project should have its own instance.
Definition: SerialWombat.h:283
SerialWombatAbstractProcessedInput::readFiltered
uint16_t readFiltered()
Retreive the filtered value.
Definition: SerialWombatAbstractProcessedInput.h:436
SerialWombatAbstractProcessedInput::SCALE_RANGE
@ SCALE_RANGE
Scale the input signal to a 0-65535 value based on input high and low limits.
Definition: SerialWombatAbstractProcessedInput.h:113
SerialWombatAbstractProcessedInput::NONE
@ NONE
Don't transform the input signal.
Definition: SerialWombatAbstractProcessedInput.h:112
SerialWombatAbstractProcessedInput::writeFirstOrderFilteringConstant
int16_t writeFirstOrderFilteringConstant(uint16_t constant)
Set a first order filtering constant to be applied to the signal Higher is heavier filtering.
Definition: SerialWombatAbstractProcessedInput.h:159
SerialWombatAbstractProcessedInput::readMinimum
uint16_t readMinimum(bool resetAfterRead=false)
Retreive the maximum public data output value since the last call with reset= true.
Definition: SerialWombatAbstractProcessedInput.h:366
SerialWombatQueue::startIndex
uint16_t startIndex
Definition: SerialWombatQueue.h:338
SerialWombatAbstractProcessedInput::pin
virtual uint8_t pin()=0
Used for inheritance.
SerialWombatAbstractProcessedInput::RAW
@ RAW
Use the unfiltered signal for the pin's public data.
Definition: SerialWombatAbstractProcessedInput.h:106
SerialWombatAbstractProcessedInput::configureOutputValue
int16_t configureOutputValue(OutputValue outputValue)
Configures whether the pin's public data value is averaged, filtered, or neither.
Definition: SerialWombatAbstractProcessedInput.h:257
SerialWombatAbstractProcessedInput::Transform
Transform
Definition: SerialWombatAbstractProcessedInput.h:111
SerialWombatAbstractProcessedInput::PERIOD_1mS
@ PERIOD_1mS
Definition: SerialWombatAbstractProcessedInput.h:91
SerialWombatAbstractProcessedInput::PERIOD_512mS
@ PERIOD_512mS
Definition: SerialWombatAbstractProcessedInput.h:100
SerialWombatAbstractProcessedInput::PERIOD_128mS
@ PERIOD_128mS
Definition: SerialWombatAbstractProcessedInput.h:98
SerialWombatAbstractProcessedInput::PERIOD_8mS
@ PERIOD_8mS
Definition: SerialWombatAbstractProcessedInput.h:94
SerialWombatAbstractProcessedInput::PERIOD_32mS
@ PERIOD_32mS
Definition: SerialWombatAbstractProcessedInput.h:96
SerialWombatAbstractProcessedInput::writeExcludeBelowAbove
int16_t writeExcludeBelowAbove(uint16_t low, uint16_t high)
Sets input value ranges which are discarded rather than processed.
Definition: SerialWombatAbstractProcessedInput.h:207
SerialWombatAbstractProcessedInput::PERIOD_16mS
@ PERIOD_16mS
Definition: SerialWombatAbstractProcessedInput.h:95
SerialWombatAbstractProcessedInput::writeAveragingNumberOfSamples
int16_t writeAveragingNumberOfSamples(uint16_t numberOfSamples)
Set a number of samples to average for each update of the downstream signal.
Definition: SerialWombatAbstractProcessedInput.h:181
SerialWombatAbstractProcessedInput::PERIOD_64mS
@ PERIOD_64mS
Definition: SerialWombatAbstractProcessedInput.h:97
SerialWombat.h
SerialWombatAbstractProcessedInput::swPinModeNumber
virtual uint8_t swPinModeNumber()=0
Used for ineheritance.
SerialWombatAbstractProcessedInput::OutputValue
OutputValue
Definition: SerialWombatAbstractProcessedInput.h:105
SW_LE32
#define SW_LE32(_a)
Convert a uint32_t to four bytes in little endian format for array initialization.
Definition: SerialWombat.h:44
SerialWombatAbstractProcessedInput::LINEAR_MXB
@ LINEAR_MXB
Scale the input signal based on a linear mx+b equation.
Definition: SerialWombatAbstractProcessedInput.h:114
SerialWombatAbstractProcessedInput::AVERAGE
@ AVERAGE
Use an averaged signal for the pin's public data (updates less often)
Definition: SerialWombatAbstractProcessedInput.h:108
SerialWombatAbstractProcessedInput::readMaximum
uint16_t readMaximum(bool resetAfterRead=false)
Retreive the minimum public data output value since the last call with reset= true.
Definition: SerialWombatAbstractProcessedInput.h:391
SerialWombatChip::sendPacket
int sendPacket(uint8_t tx[], uint8_t rx[])
Send an 8 byte packet to the Serial Wombat chip and wait for 8 bytes back.
Definition: SerialWombat.cpp:114
SerialWombatAbstractProcessedInput::PERIOD_1024mS
@ PERIOD_1024mS
Definition: SerialWombatAbstractProcessedInput.h:101
SerialWombatAbstractProcessedInput::configureQueue
int16_t configureQueue(SerialWombatQueue *queue, Period period, bool queueHighByte=true, bool queueLowByte=true)
Sets up the queueing feature for this pin mode. Queue must have been initialized prior to this queue.
Definition: SerialWombatAbstractProcessedInput.h:238
SerialWombatAbstractProcessedInput::writeInverted
int16_t writeInverted(bool inverted)
if enabled subtract the input value from 65535 before doing any other processing.
Definition: SerialWombatAbstractProcessedInput.h:124
SerialWombatAbstractProcessedInput
SerialWombatAnalogInput, SerialWombatPulseTimer, SerialWombatResistanceInput and others inherit from ...
Definition: SerialWombatAbstractProcessedInput.h:79
SerialWombatAbstractProcessedInput::PERIOD_2mS
@ PERIOD_2mS
Definition: SerialWombatAbstractProcessedInput.h:92
SerialWombatAbstractProcessedInput::SerialWombatAbstractProcessedInput
SerialWombatAbstractProcessedInput(SerialWombatChip &sw)
Constructor for the SerialWombatAbstractScaledOutput Class.
Definition: SerialWombatAbstractProcessedInput.h:87
SerialWombatAbstractProcessedInput::readAverage
uint16_t readAverage()
Retreive the last completed averaged value.
Definition: SerialWombatAbstractProcessedInput.h:415
SerialWombatAbstractProcessedInput::writeTransformLinearMXB
int16_t writeTransformLinearMXB(int32_t m, int32_t b)
Scale incoming values based on an mx+b linear equation.
Definition: SerialWombatAbstractProcessedInput.h:315
SerialWombatCommands::CONFIGURE_PIN_INPUTPROCESS
@ CONFIGURE_PIN_INPUTPROCESS
(211)
SW_LE16
#define SW_LE16(_a)
Convert a uint16_t to two bytes in little endian format for array initialization.
Definition: SerialWombat.h:41
SerialWombatAbstractProcessedInput::Period
Period
Definition: SerialWombatAbstractProcessedInput.h:90
SerialWombatQueue
A Class representing a Queue in the User Ram area on the Serial Wombat Chip.
Definition: SerialWombatQueue.h:41
SerialWombatAbstractProcessedInput::writeProcessedInputEnable
int16_t writeProcessedInputEnable(bool enabled)
Enables or disables all input processing functions If disabled, the raw input value is placed directl...
Definition: SerialWombatAbstractProcessedInput.h:344
SerialWombatAbstractProcessedInput::PERIOD_256mS
@ PERIOD_256mS
Definition: SerialWombatAbstractProcessedInput.h:99
SerialWombatAbstractProcessedInput::FIRST_ORDER_FILTERED
@ FIRST_ORDER_FILTERED
Use a first order filtered signal for the pin's public data.
Definition: SerialWombatAbstractProcessedInput.h:107
SerialWombatAbstractProcessedInput::writeTransformScaleRange
int16_t writeTransformScaleRange(uint16_t min, uint16_t max)
Scale incoming values to a range of 0 to 65535.
Definition: SerialWombatAbstractProcessedInput.h:287