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
Ranger/Ranger.h@0:a5d13af495af, 2011-12-21 (annotated)
- Committer:
- bapowell
- Date:
- Wed Dec 21 22:29:59 2011 +0000
- Revision:
- 0:a5d13af495af
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bapowell | 0:a5d13af495af | 1 | #ifndef RANGER_H_INCLUDED |
bapowell | 0:a5d13af495af | 2 | #define RANGER_H_INCLUDED |
bapowell | 0:a5d13af495af | 3 | |
bapowell | 0:a5d13af495af | 4 | #include <vector> |
bapowell | 0:a5d13af495af | 5 | #include <stdarg.h> |
bapowell | 0:a5d13af495af | 6 | |
bapowell | 0:a5d13af495af | 7 | /** |
bapowell | 0:a5d13af495af | 8 | * Perform range-type functions on a list of numbers. |
bapowell | 0:a5d13af495af | 9 | * The numbers must be in ascending order. |
bapowell | 0:a5d13af495af | 10 | * |
bapowell | 0:a5d13af495af | 11 | * Example: |
bapowell | 0:a5d13af495af | 12 | * @code |
bapowell | 0:a5d13af495af | 13 | * |
bapowell | 0:a5d13af495af | 14 | * #include "mbed.h" |
bapowell | 0:a5d13af495af | 15 | * #include "Ranger.h" |
bapowell | 0:a5d13af495af | 16 | * |
bapowell | 0:a5d13af495af | 17 | * AnalogIn hatSwitch(p16); |
bapowell | 0:a5d13af495af | 18 | * |
bapowell | 0:a5d13af495af | 19 | * int main() { |
bapowell | 0:a5d13af495af | 20 | * |
bapowell | 0:a5d13af495af | 21 | * Ranger<float> hatSwitchInputRanger(4, 0.59, 0.68, 0.78, 0.92); |
bapowell | 0:a5d13af495af | 22 | * int hatSwitchDegreesByRange[5] = {0, -90, 180, 90, 0}; |
bapowell | 0:a5d13af495af | 23 | * |
bapowell | 0:a5d13af495af | 24 | * while(1) { |
bapowell | 0:a5d13af495af | 25 | * int newRange = hatSwitchInputRanger.range(hatSwitch.read()); |
bapowell | 0:a5d13af495af | 26 | * if (hatSwitchInputRanger.rangeChanged()) { |
bapowell | 0:a5d13af495af | 27 | * int degrees = hatSwitchDegreesByRange[newRange]; |
bapowell | 0:a5d13af495af | 28 | * } |
bapowell | 0:a5d13af495af | 29 | * wait(0.1); |
bapowell | 0:a5d13af495af | 30 | * } |
bapowell | 0:a5d13af495af | 31 | * } |
bapowell | 0:a5d13af495af | 32 | * @endcode |
bapowell | 0:a5d13af495af | 33 | */ |
bapowell | 0:a5d13af495af | 34 | |
bapowell | 0:a5d13af495af | 35 | template<typename N> |
bapowell | 0:a5d13af495af | 36 | class Ranger { |
bapowell | 0:a5d13af495af | 37 | public: |
bapowell | 0:a5d13af495af | 38 | |
bapowell | 0:a5d13af495af | 39 | /** |
bapowell | 0:a5d13af495af | 40 | * Create a Ranger object from the given set of passed-in numbers. |
bapowell | 0:a5d13af495af | 41 | * The numbers in the variable argument list must be in ascending order. |
bapowell | 0:a5d13af495af | 42 | * |
bapowell | 0:a5d13af495af | 43 | * @param argCount number of arguments that follow |
bapowell | 0:a5d13af495af | 44 | * @param ... numbers, in ascending order, which define the ranges |
bapowell | 0:a5d13af495af | 45 | */ |
bapowell | 0:a5d13af495af | 46 | Ranger(int argCount, ... ); |
bapowell | 0:a5d13af495af | 47 | |
bapowell | 0:a5d13af495af | 48 | /** |
bapowell | 0:a5d13af495af | 49 | * Create a Ranger object from the given vector. |
bapowell | 0:a5d13af495af | 50 | * The numbers in the vector must be in ascending order. |
bapowell | 0:a5d13af495af | 51 | * |
bapowell | 0:a5d13af495af | 52 | * @param vect vector to copy from |
bapowell | 0:a5d13af495af | 53 | */ |
bapowell | 0:a5d13af495af | 54 | Ranger(vector<N> vect); |
bapowell | 0:a5d13af495af | 55 | |
bapowell | 0:a5d13af495af | 56 | /** |
bapowell | 0:a5d13af495af | 57 | * Create a Ranger object from the given array. |
bapowell | 0:a5d13af495af | 58 | * The numbers in the array must be in ascending order. |
bapowell | 0:a5d13af495af | 59 | * |
bapowell | 0:a5d13af495af | 60 | * @param count number of elements to copy from the array |
bapowell | 0:a5d13af495af | 61 | * @param arr array to copy from |
bapowell | 0:a5d13af495af | 62 | */ |
bapowell | 0:a5d13af495af | 63 | Ranger(int count, N arr[]); |
bapowell | 0:a5d13af495af | 64 | |
bapowell | 0:a5d13af495af | 65 | /** |
bapowell | 0:a5d13af495af | 66 | * Return the range that the given number falls in. |
bapowell | 0:a5d13af495af | 67 | * The range is a slice index (zero-based), based on the Ranger's vector/array. |
bapowell | 0:a5d13af495af | 68 | * |
bapowell | 0:a5d13af495af | 69 | * @param input value to determine range from |
bapowell | 0:a5d13af495af | 70 | */ |
bapowell | 0:a5d13af495af | 71 | int range(N input); |
bapowell | 0:a5d13af495af | 72 | |
bapowell | 0:a5d13af495af | 73 | /** |
bapowell | 0:a5d13af495af | 74 | * Check if the last call to range() resulted in a change of range from the previous call. |
bapowell | 0:a5d13af495af | 75 | */ |
bapowell | 0:a5d13af495af | 76 | bool rangeChanged() const; |
bapowell | 0:a5d13af495af | 77 | |
bapowell | 0:a5d13af495af | 78 | /** |
bapowell | 0:a5d13af495af | 79 | * Print a representation of this instance to outputStream. |
bapowell | 0:a5d13af495af | 80 | */ |
bapowell | 0:a5d13af495af | 81 | void toString(FILE * outputStream); |
bapowell | 0:a5d13af495af | 82 | |
bapowell | 0:a5d13af495af | 83 | private: |
bapowell | 0:a5d13af495af | 84 | |
bapowell | 0:a5d13af495af | 85 | /** |
bapowell | 0:a5d13af495af | 86 | * Common initialization, called from each constructor. |
bapowell | 0:a5d13af495af | 87 | */ |
bapowell | 0:a5d13af495af | 88 | void init(); |
bapowell | 0:a5d13af495af | 89 | |
bapowell | 0:a5d13af495af | 90 | vector<N> _nbrVector; |
bapowell | 0:a5d13af495af | 91 | N _lastInput; |
bapowell | 0:a5d13af495af | 92 | int _lastRange; |
bapowell | 0:a5d13af495af | 93 | bool _rangeChanged; |
bapowell | 0:a5d13af495af | 94 | }; |
bapowell | 0:a5d13af495af | 95 | |
bapowell | 0:a5d13af495af | 96 | |
bapowell | 0:a5d13af495af | 97 | template<typename N> |
bapowell | 0:a5d13af495af | 98 | void Ranger<N>::init() { |
bapowell | 0:a5d13af495af | 99 | _lastRange = -1; |
bapowell | 0:a5d13af495af | 100 | _rangeChanged = false; |
bapowell | 0:a5d13af495af | 101 | } |
bapowell | 0:a5d13af495af | 102 | |
bapowell | 0:a5d13af495af | 103 | template<typename N> |
bapowell | 0:a5d13af495af | 104 | Ranger<N>::Ranger(int argCount, ... ) { |
bapowell | 0:a5d13af495af | 105 | va_list argList; |
bapowell | 0:a5d13af495af | 106 | va_start(argList, argCount); |
bapowell | 0:a5d13af495af | 107 | for (int i = 0; i < argCount; i++) { |
bapowell | 0:a5d13af495af | 108 | _nbrVector.push_back(va_arg(argList, N)); |
bapowell | 0:a5d13af495af | 109 | } |
bapowell | 0:a5d13af495af | 110 | va_end(argList); |
bapowell | 0:a5d13af495af | 111 | |
bapowell | 0:a5d13af495af | 112 | init(); |
bapowell | 0:a5d13af495af | 113 | } |
bapowell | 0:a5d13af495af | 114 | |
bapowell | 0:a5d13af495af | 115 | template<typename N> |
bapowell | 0:a5d13af495af | 116 | Ranger<N>::Ranger(vector<N> vect) : _nbrVector(vect) { |
bapowell | 0:a5d13af495af | 117 | init(); |
bapowell | 0:a5d13af495af | 118 | } |
bapowell | 0:a5d13af495af | 119 | |
bapowell | 0:a5d13af495af | 120 | template<typename N> |
bapowell | 0:a5d13af495af | 121 | Ranger<N>::Ranger(int count, N arr[]) : _nbrVector(arr, arr + count) { |
bapowell | 0:a5d13af495af | 122 | init(); |
bapowell | 0:a5d13af495af | 123 | } |
bapowell | 0:a5d13af495af | 124 | |
bapowell | 0:a5d13af495af | 125 | template<typename N> |
bapowell | 0:a5d13af495af | 126 | int Ranger<N>::range(N input) { |
bapowell | 0:a5d13af495af | 127 | |
bapowell | 0:a5d13af495af | 128 | int newRange = -1; |
bapowell | 0:a5d13af495af | 129 | |
bapowell | 0:a5d13af495af | 130 | for (int i=0; i < _nbrVector.size(); i++) { |
bapowell | 0:a5d13af495af | 131 | if (input < _nbrVector[i]) { |
bapowell | 0:a5d13af495af | 132 | newRange = i; |
bapowell | 0:a5d13af495af | 133 | break; |
bapowell | 0:a5d13af495af | 134 | } |
bapowell | 0:a5d13af495af | 135 | } |
bapowell | 0:a5d13af495af | 136 | |
bapowell | 0:a5d13af495af | 137 | if (newRange == -1) { |
bapowell | 0:a5d13af495af | 138 | newRange = _nbrVector.size(); |
bapowell | 0:a5d13af495af | 139 | } |
bapowell | 0:a5d13af495af | 140 | |
bapowell | 0:a5d13af495af | 141 | _rangeChanged = (_lastRange != newRange); |
bapowell | 0:a5d13af495af | 142 | _lastInput = input; |
bapowell | 0:a5d13af495af | 143 | _lastRange = newRange; |
bapowell | 0:a5d13af495af | 144 | |
bapowell | 0:a5d13af495af | 145 | return newRange; |
bapowell | 0:a5d13af495af | 146 | } |
bapowell | 0:a5d13af495af | 147 | |
bapowell | 0:a5d13af495af | 148 | template<typename N> |
bapowell | 0:a5d13af495af | 149 | bool Ranger<N>::rangeChanged() const { |
bapowell | 0:a5d13af495af | 150 | return _rangeChanged; |
bapowell | 0:a5d13af495af | 151 | } |
bapowell | 0:a5d13af495af | 152 | |
bapowell | 0:a5d13af495af | 153 | template<typename N> |
bapowell | 0:a5d13af495af | 154 | void Ranger<N>::toString(FILE * outputStream) { |
bapowell | 0:a5d13af495af | 155 | fprintf(outputStream, "Ranger: size=%d, lastRange=%d, changed=%d", |
bapowell | 0:a5d13af495af | 156 | _nbrVector.size(), _lastRange, _rangeChanged); |
bapowell | 0:a5d13af495af | 157 | } |
bapowell | 0:a5d13af495af | 158 | |
bapowell | 0:a5d13af495af | 159 | #endif // RANGER_H_INCLUDED |