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 #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 }