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
XPlaneUdp/XPlaneUdpDecoder.cpp@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 | #include <stdio.h> |
bapowell | 0:a5d13af495af | 2 | #include <string.h> |
bapowell | 0:a5d13af495af | 3 | #include "XPlaneUdp.h" |
bapowell | 0:a5d13af495af | 4 | #include "XPlaneUdpDecoder.h" |
bapowell | 0:a5d13af495af | 5 | #include "XPlaneUdpDATA.h" |
bapowell | 0:a5d13af495af | 6 | |
bapowell | 0:a5d13af495af | 7 | void XPlaneUdpDecoder::setDebug(bool debug) { |
bapowell | 0:a5d13af495af | 8 | _debug = debug; |
bapowell | 0:a5d13af495af | 9 | } |
bapowell | 0:a5d13af495af | 10 | |
bapowell | 0:a5d13af495af | 11 | void XPlaneUdpDecoder::setReverseByteOrder(bool reverseByteOrder) { |
bapowell | 0:a5d13af495af | 12 | _reverseByteOrder = reverseByteOrder; |
bapowell | 0:a5d13af495af | 13 | } |
bapowell | 0:a5d13af495af | 14 | |
bapowell | 0:a5d13af495af | 15 | XPlaneUdpMessageType XPlaneUdpDecoder::setUdpBuffer(char * buf, int bufLen) { |
bapowell | 0:a5d13af495af | 16 | _udpPacketMsgType = UNKNOWN; |
bapowell | 0:a5d13af495af | 17 | _udpBuffer = buf; |
bapowell | 0:a5d13af495af | 18 | _udpBufferLen = bufLen; |
bapowell | 0:a5d13af495af | 19 | //_udpBuffer[bufLen] = 0; // only need to do this if treating buffer like a string, e.g. printing it |
bapowell | 0:a5d13af495af | 20 | |
bapowell | 0:a5d13af495af | 21 | if (_udpBufferLen >= 5) { |
bapowell | 0:a5d13af495af | 22 | if (strncmp(_udpBuffer, "DATA", 4) == 0) { |
bapowell | 0:a5d13af495af | 23 | if (_debug) printf("Got DATA pkt \n"); |
bapowell | 0:a5d13af495af | 24 | _udpPacketMsgType = DATA; |
bapowell | 0:a5d13af495af | 25 | } |
bapowell | 0:a5d13af495af | 26 | } |
bapowell | 0:a5d13af495af | 27 | |
bapowell | 0:a5d13af495af | 28 | return _udpPacketMsgType; |
bapowell | 0:a5d13af495af | 29 | } |
bapowell | 0:a5d13af495af | 30 | |
bapowell | 0:a5d13af495af | 31 | int XPlaneUdpDecoder::putIntoDATAMap(XPlaneUdpDATAMap & DATAMap, bool filter) { |
bapowell | 0:a5d13af495af | 32 | int updateCount = 0; |
bapowell | 0:a5d13af495af | 33 | |
bapowell | 0:a5d13af495af | 34 | if (_udpPacketMsgType != DATA) { |
bapowell | 0:a5d13af495af | 35 | return 0; |
bapowell | 0:a5d13af495af | 36 | } |
bapowell | 0:a5d13af495af | 37 | |
bapowell | 0:a5d13af495af | 38 | if (filter && (DATAMap.size() == 0)) { |
bapowell | 0:a5d13af495af | 39 | return 0; |
bapowell | 0:a5d13af495af | 40 | } |
bapowell | 0:a5d13af495af | 41 | |
bapowell | 0:a5d13af495af | 42 | int dataMsgCount = (_udpBufferLen - 5) / XPLANE_DATA_MSG_LENGTH; |
bapowell | 0:a5d13af495af | 43 | if (_debug) printf("%d msgs in pkt \n", dataMsgCount); |
bapowell | 0:a5d13af495af | 44 | int bufOffset = 5; |
bapowell | 0:a5d13af495af | 45 | for (int msgNbr = 0; msgNbr < dataMsgCount; msgNbr++) { |
bapowell | 0:a5d13af495af | 46 | |
bapowell | 0:a5d13af495af | 47 | int index; |
bapowell | 0:a5d13af495af | 48 | memcpy(&index, _udpBuffer + bufOffset, 4); |
bapowell | 0:a5d13af495af | 49 | if (_reverseByteOrder) { |
bapowell | 0:a5d13af495af | 50 | reverse4Bytes((char*) &index); |
bapowell | 0:a5d13af495af | 51 | } |
bapowell | 0:a5d13af495af | 52 | |
bapowell | 0:a5d13af495af | 53 | XPlaneUdpDATA *DATAmsg = getXPlaneUdpDATA(DATAMap, index); |
bapowell | 0:a5d13af495af | 54 | if (DATAmsg != NULL) { |
bapowell | 0:a5d13af495af | 55 | DATAmsg->setAllData(_udpBuffer + bufOffset); |
bapowell | 0:a5d13af495af | 56 | updateCount++; |
bapowell | 0:a5d13af495af | 57 | } |
bapowell | 0:a5d13af495af | 58 | else if (! filter) { |
bapowell | 0:a5d13af495af | 59 | DATAmsg = new XPlaneUdpDATA(index, _reverseByteOrder); |
bapowell | 0:a5d13af495af | 60 | DATAmsg->setAllData(_udpBuffer + bufOffset); |
bapowell | 0:a5d13af495af | 61 | DATAMap[index] = DATAmsg; |
bapowell | 0:a5d13af495af | 62 | updateCount++; |
bapowell | 0:a5d13af495af | 63 | } |
bapowell | 0:a5d13af495af | 64 | |
bapowell | 0:a5d13af495af | 65 | bufOffset += XPLANE_DATA_MSG_LENGTH; |
bapowell | 0:a5d13af495af | 66 | } |
bapowell | 0:a5d13af495af | 67 | |
bapowell | 0:a5d13af495af | 68 | return updateCount; |
bapowell | 0:a5d13af495af | 69 | } |