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

Committer:
bapowell
Date:
Wed Dec 21 22:29:59 2011 +0000
Revision:
0:a5d13af495af

        

Who changed what in which revision?

UserRevisionLine numberNew 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