Skip to content
Snippets Groups Projects
Commit c20a1ddd authored by Tim Stadtmann's avatar Tim Stadtmann
Browse files

Corrupt USB-packets will now be recognized

Relocated "checking-for-corrupt-packets" to Command class
and enhanced it to all detectable error cases in replies.
parent df977406
No related branches found
No related tags found
No related merge requests found
......@@ -12,7 +12,8 @@
% addSystemCommand Adds a system command to the command object
% addDirectCommand Adds a direct command to the command object
%
% checkForError @MMI Checks error byte in received package.
% checkForError @MMI Checks error byte in received package
% isCorrupt @MMI Checks whether reply packet is corrupt
%
% clear Clears the command msg
% display Displays the command msg (decimal)
......@@ -286,12 +287,45 @@ classdef Command < handle
function cmd = Command(varargin)
% Command.cmd Create an empty command
%
% c = Command(OPTIONS) is an object that represents an EV3 command
% c = Command() is an object that represents an EV3 command
% c = Command([...]) is an object that represents an EV3 reply
%
% Example::
% c = Command();
cmd.msg = uint8([]);
if nargin > 0 % Packet is a reply
try
cmd.msg = uint8(varargin{1});
catch ME
id = [ID(), ':', 'InvalidParameter'];
msg = 'Failed to create reply-packet with Command-class.';
baseException = MException(id, msg);
baseException = addCause(baseException, ME);
throw(baseException);
end
% If corrupt, throw error
corrupt = cmd.isValidReply();
if corrupt < 1
msg = 'Invalid reply packet';
id = [ID(), ':', 'CorruptPacket'];
ME = MException(id, msg);
switch corrupt
case 0
causeMsg = 'Reply packet too short';
case -1
causeMsg = ['Specified packet length (bytes 1&2) does not equal ',...
'actual packet length'];
case -2
causeMsg = 'Error type (byte 5) is not valid';
end
cause = MException(id, causeMsg);
ME = addCause(ME, cause);
throw(ME);
end
else % Packet is a command
cmd.msg = uint8([]);
end
end
function delete(cmd)
......@@ -322,6 +356,43 @@ classdef Command < handle
end
end
function state = isValidReply(cmd)
% Command.isValidReply Check if reply-packet is valid
%
% state = cmd.isValidReply checks cmd against reply-packet-format and returns
% whether if cmd is valid (that is, does not fit the
% format).
% Notes:
% - state = 1, if reply is not corrupted (at least not in a way that can be
% tested)
% - state = 0, if reply is too short (minimum length = 5 bytes)
% - state = -1, if reply is corrupted due to invalid length/length indicator
% - state = -2, if reply is corrupted due to invalid error type byte
% - IMPORTANT: Of course, the packet can still contain invalid information which
% cannot be tested properly without context. This corruption-test
% only checks the contextless information.
%
state = 1;
% Minimum length of a reply packet is 5, for a packet without response buffer
minLength = 5;
if length(cmd.msg) < minLength
state = 0;
return
end
% Note: The two things that can be checked without context are the length and the
% command type, the remainder varies from packet to packet.
pLength = double(typecast(cmd.msg(1:2),'uint16')) + 2;
pCmdType = cmd.msg(5);
if pLength ~= length(cmd.msg)
state = -1;
elseif pCmdType ~= 2 && pCmdType ~=4
state = -2;
end
end
function addHeaderSystem(cmd,counter)
% Command.addHeaderSystem Add a system header with no reply
%
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment