The xplane_io (X-Plane I/O) program is used to establish network communications, via UDP, with the X-Plane flight simulator running on a computer. The code consists of class libraries that abstract the lower-level UDP packet encoding and decoding details, according to the UDP protocol specifications in X-Plane version 9. Any X-Plane DATA packets can be sent and received, and any X-Plane DataRefs can be set by sending DREF packets to X-Plane.
Dependencies: EthernetNetIf mbed ConfigFile
Diff: Ranger/Ranger.h
- Revision:
- 0:a5d13af495af
diff -r 000000000000 -r a5d13af495af Ranger/Ranger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Ranger/Ranger.h Wed Dec 21 22:29:59 2011 +0000 @@ -0,0 +1,159 @@ +#ifndef RANGER_H_INCLUDED +#define RANGER_H_INCLUDED + +#include <vector> +#include <stdarg.h> + +/** + * Perform range-type functions on a list of numbers. + * The numbers must be in ascending order. + * + * Example: + * @code + * + * #include "mbed.h" + * #include "Ranger.h" + * + * AnalogIn hatSwitch(p16); + * + * int main() { + * + * Ranger<float> hatSwitchInputRanger(4, 0.59, 0.68, 0.78, 0.92); + * int hatSwitchDegreesByRange[5] = {0, -90, 180, 90, 0}; + * + * while(1) { + * int newRange = hatSwitchInputRanger.range(hatSwitch.read()); + * if (hatSwitchInputRanger.rangeChanged()) { + * int degrees = hatSwitchDegreesByRange[newRange]; + * } + * wait(0.1); + * } + * } + * @endcode + */ + +template<typename N> +class Ranger { +public: + + /** + * Create a Ranger object from the given set of passed-in numbers. + * The numbers in the variable argument list must be in ascending order. + * + * @param argCount number of arguments that follow + * @param ... numbers, in ascending order, which define the ranges + */ + Ranger(int argCount, ... ); + + /** + * Create a Ranger object from the given vector. + * The numbers in the vector must be in ascending order. + * + * @param vect vector to copy from + */ + Ranger(vector<N> vect); + + /** + * Create a Ranger object from the given array. + * The numbers in the array must be in ascending order. + * + * @param count number of elements to copy from the array + * @param arr array to copy from + */ + Ranger(int count, N arr[]); + + /** + * Return the range that the given number falls in. + * The range is a slice index (zero-based), based on the Ranger's vector/array. + * + * @param input value to determine range from + */ + int range(N input); + + /** + * Check if the last call to range() resulted in a change of range from the previous call. + */ + bool rangeChanged() const; + + /** + * Print a representation of this instance to outputStream. + */ + void toString(FILE * outputStream); + +private: + + /** + * Common initialization, called from each constructor. + */ + void init(); + + vector<N> _nbrVector; + N _lastInput; + int _lastRange; + bool _rangeChanged; +}; + + +template<typename N> +void Ranger<N>::init() { + _lastRange = -1; + _rangeChanged = false; +} + +template<typename N> +Ranger<N>::Ranger(int argCount, ... ) { + va_list argList; + va_start(argList, argCount); + for (int i = 0; i < argCount; i++) { + _nbrVector.push_back(va_arg(argList, N)); + } + va_end(argList); + + init(); +} + +template<typename N> +Ranger<N>::Ranger(vector<N> vect) : _nbrVector(vect) { + init(); +} + +template<typename N> +Ranger<N>::Ranger(int count, N arr[]) : _nbrVector(arr, arr + count) { + init(); +} + +template<typename N> +int Ranger<N>::range(N input) { + + int newRange = -1; + + for (int i=0; i < _nbrVector.size(); i++) { + if (input < _nbrVector[i]) { + newRange = i; + break; + } + } + + if (newRange == -1) { + newRange = _nbrVector.size(); + } + + _rangeChanged = (_lastRange != newRange); + _lastInput = input; + _lastRange = newRange; + + return newRange; +} + +template<typename N> +bool Ranger<N>::rangeChanged() const { + return _rangeChanged; +} + +template<typename N> +void Ranger<N>::toString(FILE * outputStream) { + fprintf(outputStream, "Ranger: size=%d, lastRange=%d, changed=%d", + _nbrVector.size(), _lastRange, _rangeChanged); +} + +#endif // RANGER_H_INCLUDED \ No newline at end of file