From 4bfe4fe88df7c6e3c014e1c0c0e110ae775a778b Mon Sep 17 00:00:00 2001 From: Chris Teubert Date: Fri, 28 Nov 2014 17:08:41 -0800 Subject: [PATCH] Completed Preliminary MATLAB Test Scripts --- MATLAB/+XPlaneConnect/closeUDP.m | 2 + MATLAB/+XPlaneConnect/openUDP.m | 2 + MATLAB/+XPlaneConnect/readDATA.m | 2 +- MATLAB/+XPlaneConnect/readUDP.m | 2 +- MATLAB/+XPlaneConnect/sendCTRL.m | 8 ++-- MATLAB/+XPlaneConnect/sendUDP.m | 14 ++----- .../UserInterfaceState.xcuserstate | Bin 33140 -> 33778 bytes .../CPP Tests/{XPC_Tests.1 => Cpp_Tests.1} | 0 .../Cpp Tests.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 56827 -> 57187 bytes TestScripts/MATLAB Tests/CTRLTest.m | 26 ++++++++++++ TestScripts/MATLAB Tests/DATATest.m | 20 +++++++++ TestScripts/MATLAB Tests/POSITest.m | 28 +++++++++++++ TestScripts/MATLAB Tests/openCloseTest.m | 12 ++++++ TestScripts/MATLAB Tests/pauseTest.m | 25 +++++++++++ TestScripts/MATLAB Tests/requestDREFTest.m | 17 ++++++++ TestScripts/MATLAB Tests/sendDREFTest.m | 19 +++++++++ TestScripts/MATLAB Tests/sendReadTest.m | 18 ++++++++ TestScripts/MATLAB Tests/setConnTest.m | 18 ++++++++ TestScripts/MATLAB Tests/struTest.m | 19 +++++++++ TestScripts/MATLAB Tests/tests.m | 39 ++++++++++++++++++ 21 files changed, 256 insertions(+), 19 deletions(-) rename TestScripts/CPP Tests/{XPC_Tests.1 => Cpp_Tests.1} (100%) create mode 100644 TestScripts/MATLAB Tests/CTRLTest.m create mode 100644 TestScripts/MATLAB Tests/DATATest.m create mode 100644 TestScripts/MATLAB Tests/POSITest.m create mode 100644 TestScripts/MATLAB Tests/openCloseTest.m create mode 100644 TestScripts/MATLAB Tests/pauseTest.m create mode 100644 TestScripts/MATLAB Tests/requestDREFTest.m create mode 100644 TestScripts/MATLAB Tests/sendDREFTest.m create mode 100644 TestScripts/MATLAB Tests/sendReadTest.m create mode 100644 TestScripts/MATLAB Tests/setConnTest.m create mode 100644 TestScripts/MATLAB Tests/struTest.m create mode 100644 TestScripts/MATLAB Tests/tests.m diff --git a/MATLAB/+XPlaneConnect/closeUDP.m b/MATLAB/+XPlaneConnect/closeUDP.m index 404cef8..0575ddb 100644 --- a/MATLAB/+XPlaneConnect/closeUDP.m +++ b/MATLAB/+XPlaneConnect/closeUDP.m @@ -23,4 +23,6 @@ function [socket] = closeUDP(socket) socket.close; +assert(isequal(socket.isClosed(),1),'closeUDP: Error- Could not close socket'); + end \ No newline at end of file diff --git a/MATLAB/+XPlaneConnect/openUDP.m b/MATLAB/+XPlaneConnect/openUDP.m index fba3a71..77aa43f 100644 --- a/MATLAB/+XPlaneConnect/openUDP.m +++ b/MATLAB/+XPlaneConnect/openUDP.m @@ -36,4 +36,6 @@ if ~isempty(varargin) end end +assert(isequal(socket.isClosed(),0),'openUDP: Error- Could not open port'); + end diff --git a/MATLAB/+XPlaneConnect/readDATA.m b/MATLAB/+XPlaneConnect/readDATA.m index bede1ee..f0492a5 100644 --- a/MATLAB/+XPlaneConnect/readDATA.m +++ b/MATLAB/+XPlaneConnect/readDATA.m @@ -67,7 +67,7 @@ function [ sensor ] = readDATA( socket ) dim1 = sensor.raw(a); dim2 = sensor.raw(a+1); if dim1 == 0 %String - value = char(sensor.raw(a+2:a+1+dim2)); + value = char(sensor.raw(a+2:a+1+dim2))'; a = a + dim2 + 2; else value = []; diff --git a/MATLAB/+XPlaneConnect/readUDP.m b/MATLAB/+XPlaneConnect/readUDP.m index cae4f2f..32a8b0c 100644 --- a/MATLAB/+XPlaneConnect/readUDP.m +++ b/MATLAB/+XPlaneConnect/readUDP.m @@ -50,7 +50,7 @@ function [ data ] = readUDP( input ) data = int16(data); data(data(:)<0) = uint8(data(data(:)<0) + 256); %fix signed issue size = int16(data(5)); %size of data stream - + %% trim trailing data for i=1:floor(length(data)/256)+1 if data(size+1:end)==0 diff --git a/MATLAB/+XPlaneConnect/sendCTRL.m b/MATLAB/+XPlaneConnect/sendCTRL.m index 15dfb10..722fdca 100644 --- a/MATLAB/+XPlaneConnect/sendCTRL.m +++ b/MATLAB/+XPlaneConnect/sendCTRL.m @@ -36,7 +36,7 @@ import XPlaneConnect.* %% Handle Input % Optional parameters - if ~exist('IP','var'), IP = "127.0.0.1"; end + if ~exist('IP','var'), IP = '127.0.0.1'; end if ~exist('port','var'), port = 49009; end if ~exist('acft','var'), acft = 0; end @@ -44,7 +44,7 @@ import XPlaneConnect.* %%BODY header = ['CTRL'-0,0]; - dataStream = [header, acft]; + dataStream = header; %TODO-ADD ACFT % Deal with position update control = [0, 0, 0, 0.8, 0, 1]; @@ -55,7 +55,7 @@ import XPlaneConnect.* dataStream = [dataStream, typecast(single(control),'uint8')]; % Send DATA - status = sendUDP(IP, port, dataStream); - + status = sendUDP(dataStream, IP, port); + end diff --git a/MATLAB/+XPlaneConnect/sendUDP.m b/MATLAB/+XPlaneConnect/sendUDP.m index bdb1989..6b0b112 100644 --- a/MATLAB/+XPlaneConnect/sendUDP.m +++ b/MATLAB/+XPlaneConnect/sendUDP.m @@ -42,16 +42,8 @@ function [ status ] = sendUDP( data, IP, port ) end end - try - IP = InetAddress.getByName(IP); - packet = DatagramPacket(data, length(data), IP, port); %create packet - socket.send(packet); - catch err - status = 1; - disp(err) - end - - - + IP = InetAddress.getByName(IP); + packet = DatagramPacket(data, length(data), IP, port); %create packet + socket.send(packet); end diff --git a/TestScripts/C Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate b/TestScripts/C Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate index 92637e314b5a43e3d16ed82e338997a0c078d842..c90ffe9acd3bb2f0740471c42cbe5da503647687 100644 GIT binary patch delta 9433 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

vCIprK4htCmm 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 J;Inht{{yIC{ow!r delta 8999 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 Y+70a;y>&=}qWYe6d*AcrXM5NG0nrSL>;M1& diff --git a/TestScripts/CPP Tests/XPC_Tests.1 b/TestScripts/CPP Tests/Cpp_Tests.1 similarity index 100% rename from TestScripts/CPP Tests/XPC_Tests.1 rename to TestScripts/CPP Tests/Cpp_Tests.1 diff --git a/TestScripts/Cpp Tests.xcodeproj/project.pbxproj b/TestScripts/Cpp Tests.xcodeproj/project.pbxproj index 02d3e37..b22b04d 100644 --- a/TestScripts/Cpp Tests.xcodeproj/project.pbxproj +++ b/TestScripts/Cpp Tests.xcodeproj/project.pbxproj @@ -26,7 +26,7 @@ /* Begin PBXFileReference section */ BE7C5C001A28F72F00F246B9 /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = main.cpp; path = "CPP Tests/main.cpp"; sourceTree = SOURCE_ROOT; }; - BE7C5C011A28F72F00F246B9 /* XPC_Tests.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = XPC_Tests.1; path = "CPP Tests/XPC_Tests.1"; sourceTree = SOURCE_ROOT; }; + BE7C5C011A28F72F00F246B9 /* Cpp_Tests.1 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.man; name = Cpp_Tests.1; path = "CPP Tests/Cpp_Tests.1"; sourceTree = SOURCE_ROOT; }; BE9C6BAB1A253FA100EBE08A /* Cpp Tests */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "Cpp Tests"; sourceTree = BUILT_PRODUCTS_DIR; }; BEB0F4F61A28F7B0001975A6 /* xplaneConnect.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = xplaneConnect.c; path = ../C/src/xplaneConnect.c; sourceTree = ""; }; BEB0F4F71A28F7B0001975A6 /* xplaneConnect.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = xplaneConnect.h; path = ../C/src/xplaneConnect.h; sourceTree = ""; }; @@ -65,7 +65,7 @@ isa = PBXGroup; children = ( BE7C5C001A28F72F00F246B9 /* main.cpp */, - BE7C5C011A28F72F00F246B9 /* XPC_Tests.1 */, + BE7C5C011A28F72F00F246B9 /* Cpp_Tests.1 */, ); name = "Cpp Tests"; path = "XPC Tests"; diff --git a/TestScripts/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate b/TestScripts/Cpp Tests.xcodeproj/project.xcworkspace/xcuserdata/cteubert.xcuserdatad/UserInterfaceState.xcuserstate index 89a6cd4cf21152ad942556779a9d01fe57c8bfc6..73c5526dbe0b3c66e72a3ad62c8039a6992b47ed 100644 GIT binary patch delta 22663 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 delta 22593 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 diff --git a/TestScripts/MATLAB Tests/CTRLTest.m b/TestScripts/MATLAB Tests/CTRLTest.m new file mode 100644 index 0000000..9bacf13 --- /dev/null +++ b/TestScripts/MATLAB Tests/CTRLTest.m @@ -0,0 +1,26 @@ +function CTRLTest( ) +%CTRLTest Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/cockpit2/controls/yoke_pitch_ratio',... + 'sim/cockpit2/controls/yoke_roll_ratio',... + 'sim/cockpit2/controls/yoke_heading_ratio',... + 'sim/flightmodel/engine/ENGN_thro',... + 'sim/cockpit/switches/gear_handle_status',... + 'sim/flightmodel/controls/flaprqst'}; +THROT = rand(); +CTRL = [0.0, 0.0, 1.0, THROT, 0.0, 1.0]; + +sendCTRL(CTRL); +result = requestDREF(DREFS); + +assert(isequal(length(result),6),'CTRLTest: requestDREF unsucessful-wrong number of elements returned'); +assert(isequal(length(result{4}),8),'CTRLTest: requestDREF unsucessful- element 1 incorrect size (should be size 8)'); +for i=1:length(CTRL)-1 + assert(abs(result{i}(1)-CTRL(i))<1e-4,['CTRLTest: DATA set unsucessful-',num2str(i)]); +end + +end + diff --git a/TestScripts/MATLAB Tests/DATATest.m b/TestScripts/MATLAB Tests/DATATest.m new file mode 100644 index 0000000..4c69a5d --- /dev/null +++ b/TestScripts/MATLAB Tests/DATATest.m @@ -0,0 +1,20 @@ +function DATATest( ) +%DATATest Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/flightmodel/engine/ENGN_thro'}; + +value = rand(); +data = struct('h',25,'d',[value,-998,-998,-998,-998,-998,-998,-998]); + +sendDATA(data); +result = requestDREF(DREFS); + +assert(isequal(length(result),1),'DATATest: requestDREF unsucessful-wrong number of elements returned'); +assert(isequal(length(result{1}),8),'DATATest: requestDREF unsucessful- element 1 incorrect size (should be size 8)'); +assert(abs(result{1}(1)-value)<1e-4,'DATATest: DATA set unsucessful'); + +end + diff --git a/TestScripts/MATLAB Tests/POSITest.m b/TestScripts/MATLAB Tests/POSITest.m new file mode 100644 index 0000000..110d769 --- /dev/null +++ b/TestScripts/MATLAB Tests/POSITest.m @@ -0,0 +1,28 @@ +function POSITest( ) +%POSITest Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/flightmodel/position/latitude', ... + 'sim/flightmodel/position/longitude', ... + 'sim/flightmodel/position/y_agl', ... + 'sim/flightmodel/position/phi', ... + 'sim/flightmodel/position/theta', ... + 'sim/flightmodel/position/psi', ... + 'sim/cockpit/switches/gear_handle_status'}; +POSI = [37.524, -122.06899, 2500, 0, 0, 0, 1]; % Gear + +sendPOSI(POSI); +result = requestDREF(DREFS); + +assert(isequal(length(result),7),'POSITest: requestDREF unsucessful-wrong number of elements returned'); +for i=1:length(POSI) + if i==3 + continue + end + assert(abs(result{i}(1)-POSI(i))<1e-4,['POSITest: DATA set unsucessful-',num2str(i)]); +end + +end + diff --git a/TestScripts/MATLAB Tests/openCloseTest.m b/TestScripts/MATLAB Tests/openCloseTest.m new file mode 100644 index 0000000..b05a497 --- /dev/null +++ b/TestScripts/MATLAB Tests/openCloseTest.m @@ -0,0 +1,12 @@ +function openCloseTest() +%OPENCLOSETEST Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +socket = openUDP( 49007 ); + +closeUDP( socket ); + +end + diff --git a/TestScripts/MATLAB Tests/pauseTest.m b/TestScripts/MATLAB Tests/pauseTest.m new file mode 100644 index 0000000..c7979a6 --- /dev/null +++ b/TestScripts/MATLAB Tests/pauseTest.m @@ -0,0 +1,25 @@ +function pauseTest( ) +%PauseTest Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/operation/override/override_planepath'}; +value = 0; % Resume + +pauseSim(value); +result = requestDREF(DREFS); + +assert(isequal(length(result),1),'pauseTest: requestDREF unsucessful-wrong number of elements returned'); +assert(abs(result{1}(1)-value)<1e-4,'pauseTest: Pause Unsuccessful'); + +value = 1; % Pause + +pauseSim(value); +result = requestDREF(DREFS); + +assert(isequal(length(result),1),'pauseTest: requestDREF unsucessful-wrong number of elements returned'); +assert(abs(result{1}(1)-value)<1e-4,'pauseTest: Pause Unsuccessful'); + +end + diff --git a/TestScripts/MATLAB Tests/requestDREFTest.m b/TestScripts/MATLAB Tests/requestDREFTest.m new file mode 100644 index 0000000..e9ce4d3 --- /dev/null +++ b/TestScripts/MATLAB Tests/requestDREFTest.m @@ -0,0 +1,17 @@ +function requestDREFTest( ) +%SENDREADTEST Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/cockpit/switches/gear_handle_status',... + 'cockpit2/switches/panel_brightness_ratio'}; + +result = requestDREF(DREFS); + +assert(isequal(length(result),2)); +assert(isequal(length(result{1}),1)); +assert(isequal(length(result{2}),4)); + +end + diff --git a/TestScripts/MATLAB Tests/sendDREFTest.m b/TestScripts/MATLAB Tests/sendDREFTest.m new file mode 100644 index 0000000..e688d08 --- /dev/null +++ b/TestScripts/MATLAB Tests/sendDREFTest.m @@ -0,0 +1,19 @@ +function sendDREFTest( ) +%SENDREADTEST Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/cockpit/switches/gear_handle_status'}; +value = randi([0 10]); + +sendDREF(DREFS{1},value); +result = requestDREF(DREFS); + +assert(isequal(length(result),1),'sendDREFTest: requestDREF unsucessful-wrong number of elements returned'); +assert(isequal(length(result{1}),1),'sendDREFTest: requestDREF unsucessful- element 1 incorrect size (should be size 1)'); + +assert(isequal(result{1},value),'sendDREFTest: DREF set unsucessful'); + +end + diff --git a/TestScripts/MATLAB Tests/sendReadTest.m b/TestScripts/MATLAB Tests/sendReadTest.m new file mode 100644 index 0000000..62bca30 --- /dev/null +++ b/TestScripts/MATLAB Tests/sendReadTest.m @@ -0,0 +1,18 @@ +function sendReadTest( ) +%SENDREADTEST Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +recvPortNum = 49074; +recvPort = openUDP(49074); + +sendUDP('test2'-0,'127.0.0.1',49074); +result = readUDP(recvPort); +closeUDP(recvPort); + +assert(~isequal(result,-998), 'no data received'); +assert(all(result(1:4)'=='test'-0)); + +end + diff --git a/TestScripts/MATLAB Tests/setConnTest.m b/TestScripts/MATLAB Tests/setConnTest.m new file mode 100644 index 0000000..e0f8c30 --- /dev/null +++ b/TestScripts/MATLAB Tests/setConnTest.m @@ -0,0 +1,18 @@ +function setConnTest( ) + +disp('Not Functional Yet!') +%setConnTest Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +DREFS = {'sim/operation/override/override_planepath'}; +value = 0; % Resume + +setConn(value); +result = requestDREF(DREFS); + +assert(isequal(length(result),1),'setConnTest: requestDREF unsucessful-wrong number of elements returned'); + +end + diff --git a/TestScripts/MATLAB Tests/struTest.m b/TestScripts/MATLAB Tests/struTest.m new file mode 100644 index 0000000..028e9bd --- /dev/null +++ b/TestScripts/MATLAB Tests/struTest.m @@ -0,0 +1,19 @@ +function struTest( ) +%STRUTEST Summary of this function goes here +% Detailed explanation goes here +addpath('../../MATLAB') +import XPlaneConnect.* + +recvNum = 49076; +recvPort = openUDP(recvNum); + +testSTRU = struct('h',15,'d',[12, 34, 55, 99, 1, 0],'test','theTest'); + +sendSTRU(testSTRU,'127.0.0.1',recvNum); +resultSTRU = readDATA(recvPort); +closeUDP(recvPort); +resultSTRU = rmfield(resultSTRU,'raw'); +assert(isequal(testSTRU,resultSTRU),'struTest: Error-structs are not equal'); + +end + diff --git a/TestScripts/MATLAB Tests/tests.m b/TestScripts/MATLAB Tests/tests.m new file mode 100644 index 0000000..4a8faae --- /dev/null +++ b/TestScripts/MATLAB Tests/tests.m @@ -0,0 +1,39 @@ +testsPassed=0; +testsFailed=0; +if ismac() + os = 'Mac'; +elseif ispc() + os = 'Win'; +else + os = 'Linux'; +end + +disp(['XPC Tests-MATLAB (', os, ')']); + +theTests = {{@openCloseTest, 'Open/Close Test', 0},... + {@sendReadTest,'Send/Read Test', 0},... + {@requestDREFTest,'Request DREF Test', 0},... + {@sendDREFTest,'Send DREF Test', 0},... + {@DATATest,'DATA Test', 0},... + {@CTRLTest,'CTRL Test', 0},... + {@POSITest,'POSI Test', 0},... + {@pauseTest,'Pause Test', 0},... + {@struTest,'Struct Test', 0}}; + +for i=1:length(theTests) + fprintf(['Test ',num2str(i),': ',theTests{i}{2},' - ']); + try + theTests{i}{1}(); + disp('SUCCESS'); + theTests{i}{3} = 1; + testsPassed = testsPassed+1; + catch err + disp('FAILURE'); + fprintf('\t%s\n',err.message); + theTests{i}{3} = -1; + testsFailed = testsFailed + 1; + end +end + +disp('Results Summary:'); +fprintf('Passed: %i\tFailed: %i\n',testsPassed, testsFailed); \ No newline at end of file