mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-05 23:49:00 +08:00
1108 lines
34 KiB
Matlab
1108 lines
34 KiB
Matlab
%--------------------------------------------------------------------
|
|
%A simple MATLAB GUI for paparazzi autopilot log-file plotting
|
|
%Paparazzi Project [http://www.nongnu.org/paparazzi/]
|
|
%by Roman Krashhanitsa 28/10/2005
|
|
%adjustable parabeters:
|
|
% maxnum - increase if dialog window hangs up or doesnt refresh
|
|
% Nres - number or interpolated points in the plot, decrease to improve
|
|
% plotting performance or increase to improve resolution
|
|
%--------------------------------------------------------------------
|
|
function varargout = dialog(varargin)
|
|
% DIALOG M-file for dialog.fig
|
|
% DIALOG, by itself, creates a new DIALOG or raises the existing
|
|
% singleton*.
|
|
%
|
|
% H = DIALOG returns the handle to a new DIALOG or the handle to
|
|
% the existing singleton*.
|
|
%
|
|
% DIALOG('CALLBACK',hObject,eventData,handles,...) calls the local
|
|
% function named CALLBACK in DIALOG.M with the given input arguments.
|
|
%
|
|
% DIALOG('Property','Value',...) creates a new DIALOG or raises the
|
|
% existing singleton*. Starting from the left, property value pairs are
|
|
% applied to the GUI before dialog_OpeningFunction gets called. An
|
|
% unrecognized property name or invalid value makes property application
|
|
% stop. All inputs are passed to dialog_OpeningFcn via varargin.
|
|
%
|
|
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
|
|
% instance to run (singleton)".
|
|
%
|
|
% See also: GUIDE, GUIDATA, GUIHANDLES
|
|
|
|
% Edit the above text to modify the response to help dialog
|
|
|
|
% Last Modified by GUIDE v2.5 18-Sep-2006 11:05:50
|
|
|
|
% Begin initialization code - DO NOT EDIT
|
|
gui_Singleton = 1;
|
|
gui_State = struct('gui_Name', mfilename, ...
|
|
'gui_Singleton', gui_Singleton, ...
|
|
'gui_OpeningFcn', @dialog_OpeningFcn, ...
|
|
'gui_OutputFcn', @dialog_OutputFcn, ...
|
|
'gui_LayoutFcn', [] , ...
|
|
'gui_Callback', []);
|
|
if nargin & isstr(varargin{1})
|
|
gui_State.gui_Callback = str2func(varargin{1});
|
|
end
|
|
|
|
if nargout
|
|
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
|
|
else
|
|
gui_mainfcn(gui_State, varargin{:});
|
|
end
|
|
% End initialization code - DO NOT EDIT
|
|
|
|
function [m,n]=set2Plot(handles,section,field)
|
|
|
|
axes(handles.axes1);
|
|
|
|
global labelsSections;
|
|
global sectionsIndex;
|
|
global labelsFields;
|
|
global fieldsIndex;
|
|
N=max(size(labelsSections));
|
|
n=1; while n<=N && ~strcmpi(labelsSections(n),section), n=n+1; end;
|
|
if strcmpi(labelsSections(n),section),
|
|
set(handles.ListSections,'Value',n);
|
|
ListSections_Callback(0, 0, handles);
|
|
M=max(size(labelsFields));
|
|
m=1; while m<=M && ~strcmpi(labelsFields(m),field), m=m+1; end;
|
|
if strcmpi(labelsFields(m),field),
|
|
return;
|
|
end;
|
|
end;
|
|
m=0;
|
|
n=0;
|
|
return;
|
|
|
|
function [x,y]=setXY2plot(m,n,k)
|
|
%fetch xy data for section n, field m
|
|
global X0;
|
|
global logData;
|
|
global x;
|
|
global y;
|
|
x=[]; y=[];
|
|
len=max(size(logData));
|
|
last_time=0;
|
|
for j=1:len,
|
|
if logData(j).type==n && logData(j).plane_id==k,
|
|
if logData(j).time>last_time,
|
|
x=[x;logData(j).time];
|
|
y=[y;logData(j).fields(m)];
|
|
last_time=x(max(size(x)));
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
x=x-X0; % shift timer to start at the boot time
|
|
|
|
function h=plotlog(x,y)
|
|
%plot data for section n, field m, plane_id k
|
|
|
|
% minimum number of points in the plot (resolution)
|
|
%if actual number of points if greater we dont need to change anything, but
|
|
%if it is less, interpolate using nearest neighbor as closest model of
|
|
%signals incoming to ground station. Previous value is used in the ap
|
|
%until a new value is obtained
|
|
Nres=1000;
|
|
|
|
if ~isempty(x) && ~isempty(y),
|
|
MIN=min(x);
|
|
MAX=max(x);
|
|
X=MIN:(MAX-MIN)/Nres:MAX;
|
|
if max(size(X))<=max(size(x)) %plot as it is
|
|
h=plot(x,y);
|
|
else
|
|
h=plot(x,y,'x');
|
|
%plot(X,interp1(x,y,X,'nearest')); %interpolate using nearest neighbor
|
|
end;
|
|
end;
|
|
|
|
% --- Executes just before dialog is made visible.
|
|
function dialog_OpeningFcn(hObject, eventdata, handles, varargin)
|
|
% This function has no output args, see OutputFcn.
|
|
% hObject handle to figure
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
% varargin command line arguments to dialog (see VARARGIN)
|
|
|
|
% Choose default command line output for dialog
|
|
handles.output = hObject;
|
|
|
|
% Update handles structure
|
|
guidata(hObject, handles);
|
|
|
|
if strcmp(get(hObject,'Visible'),'off')
|
|
plot([0 1],[0 0]);
|
|
end
|
|
|
|
set(handles.ListSections,'Enable','off');
|
|
set(handles.ListFields,'Enable','off');
|
|
set(handles.ListDevices,'Enable','off');
|
|
|
|
global X0;
|
|
X0=0;
|
|
% UIWAIT makes dialog wait for user response (see UIRESUME)
|
|
% uiwait(handles.figure1);
|
|
|
|
|
|
% --- Outputs from this function are returned to the command line.
|
|
function varargout = dialog_OutputFcn(hObject, eventdata, handles)
|
|
% varargout cell array for returning output args (see VARARGOUT);
|
|
% hObject handle to figure
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Get default command line output from handles structure
|
|
if ~isempty(handles)
|
|
varargout{1} = handles.output;
|
|
end;
|
|
|
|
% --------------------------------------------------------------------
|
|
function FileMenu_Callback(hObject, eventdata, handles)
|
|
% hObject handle to FileMenu (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
|
|
% --------------------------------------------------------------------
|
|
function OpenMenuItem_Callback(hObject, eventdata, handles)
|
|
% hObject handle to OpenMenuItem (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
file = uigetfile('*.fig');
|
|
if ~isequal(file, 0)
|
|
open(file);
|
|
end
|
|
|
|
% --------------------------------------------------------------------
|
|
function PrintMenuItem_Callback(hObject, eventdata, handles)
|
|
% hObject handle to PrintMenuItem (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
printdlg(handles.figure1)
|
|
|
|
% --------------------------------------------------------------------
|
|
function CloseMenuItem_Callback(hObject, eventdata, handles)
|
|
% hObject handle to CloseMenuItem (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],...
|
|
['Close ' get(handles.figure1,'Name') '...'],...
|
|
'Yes','No','Yes');
|
|
if strcmp(selection,'No')
|
|
return;
|
|
end
|
|
|
|
delete(handles.figure1)
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function popupmenu1_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to popupmenu3 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: popupmenu controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
set(hObject, 'String', {'plot(rand(5))', 'plot(sin(1:0.01:25))', 'comet(cos(1:.01:10))', 'bar(1:10)', 'plot(membrane)', 'surf(peaks)'});
|
|
|
|
% --- Executes on selection change in popupmenu3.
|
|
function popupmenu1_Callback(hObject, eventdata, handles)
|
|
% hObject handle to popupmenu3 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: contents = get(hObject,'String') returns popupmenu3 contents as cell array
|
|
% contents{get(hObject,'Value')} returns selected item from popupmenu3
|
|
|
|
|
|
|
|
% --- Executes on button press in loadButton.
|
|
function loadButton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to loadButton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global logData;
|
|
global labelsSections;
|
|
|
|
res=0;
|
|
[FileName,PathName,res] = uigetfile('*.log','Open Log file...');
|
|
if res~=0,
|
|
%read protocol specification
|
|
global nodeList;
|
|
global labelsSections;
|
|
global sectionsIndex;
|
|
global labelsFields;
|
|
global fieldsIndex;
|
|
global id_Devices;
|
|
try
|
|
node=xmlread(fullfile(PathName,FileName));
|
|
catch
|
|
warning('File ',fullfile(PathName,FileName),' does not exist');
|
|
close(gcf);
|
|
return;
|
|
end;
|
|
|
|
%find name of the data file
|
|
dataFileName=char(node.getFirstChild.getAttributes.item(0).getValue);
|
|
%find ground altitude
|
|
global ground_alt;
|
|
j=0;
|
|
found=0
|
|
while ~found && j<=node.getFirstChild.getChildNodes.item(1).getChildNodes.item(1).getChildNodes.item(1).getAttributes.getLength,
|
|
if ~strcmpi(node.getFirstChild.getChildNodes.item(1).getChildNodes.item(1).getChildNodes.item(1).getAttributes.item(j).getName,'GROUND_ALT'),
|
|
j=j+1;
|
|
found=1;
|
|
end;
|
|
end;
|
|
if j<=node.getFirstChild.getChildNodes.item(1).getChildNodes.item(1).getChildNodes.item(1).getAttributes.getLength,
|
|
ground_alt=str2num(char(node.getFirstChild.getChildNodes.item(1).getChildNodes.item(1).getChildNodes.item(1).getAttributes.item(j).getValue));
|
|
else ground_alt=0;
|
|
end;
|
|
|
|
|
|
%---read protocol---------------------------------
|
|
set(handles.text1,'String','Reading protocol specification');
|
|
notfound=1; %found messages or not
|
|
finish=0; %structure traversing finished
|
|
nodeList=node.getChildNodes;
|
|
i=1; %level in the structure
|
|
J=[0];
|
|
val='';
|
|
while notfound && ~finish,
|
|
while J(i)<nodeList.getLength && notfound,
|
|
drawnow; %flash event queue
|
|
val=node.getNodeName;
|
|
notfound=~strcmp(val,'message');
|
|
if notfound
|
|
while node.getChildNodes.getLength~=0 && notfound %go to the next level
|
|
nodeList=node.getChildNodes;
|
|
i=i+1;
|
|
J(i)=0;
|
|
node=nodeList.item(J(i));
|
|
val=node.getNodeName;
|
|
notfound=~strcmp(val,'message');
|
|
end;
|
|
J(i)=J(i)+1;
|
|
if J(i)<nodeList.getLength
|
|
node=nodeList.item(J(i));
|
|
end;
|
|
end;
|
|
end;
|
|
if i>=3 && notfound % if not a root node
|
|
nodeList=node.getParentNode.getParentNode.getChildNodes;
|
|
i=i-1;
|
|
J(i)=J(i)+1;
|
|
if J(i)<nodeList.getLength
|
|
node=nodeList.item(J(i));
|
|
end;
|
|
else
|
|
%nothing, will get caught by while loop
|
|
finish=1;
|
|
end;
|
|
end;
|
|
%make labels for the first list menu
|
|
count=nodeList.getLength;
|
|
labelsSections=[];
|
|
lineSections=[];
|
|
sectionsIndex=[];
|
|
for j=0:count-1,
|
|
if (nodeList.item(j).getNodeName=='message')
|
|
lineSections=[lineSections,char(nodeList.item(j).getAttributes.item(1).getValue),'|'];
|
|
sectionsIndex=[sectionsIndex,j];
|
|
labelsSections=[labelsSections,{char(nodeList.item(j).getAttributes.item(1).getValue)}];
|
|
end;
|
|
end;
|
|
lineSections=lineSections(1:max(size(lineSections))-1); %cut off last '|' character
|
|
set(handles.ListSections,'String',lineSections);
|
|
%make labels for the fields list (submenu)
|
|
nn=get(handles.ListSections,'Value');
|
|
nn=nn(1);
|
|
childList=nodeList.item(sectionsIndex(nn)).getChildNodes;
|
|
count=childList.getLength;
|
|
labelsFields=[];
|
|
for j=0:count-1,
|
|
if childList.item(j).getNodeName=='field',
|
|
attr=childList.item(j).getAttributes;
|
|
cattr=attr.getLength; k=0;
|
|
while k<cattr && ~strcmp(attr.item(k).getName,'name'),
|
|
k=k+1;
|
|
end;
|
|
labelsFields=[labelsFields,char(attr.item(k).getValue),'|'];
|
|
fieldsIndex=[fieldsIndex,k];
|
|
end;
|
|
end;
|
|
labelsFields=labelsFields(1:max(size(labelsFields))-1); %cut off last '|' character
|
|
set(handles.ListFields,'String',labelsFields);
|
|
|
|
%--- read data ----------------------------
|
|
try
|
|
fid=fopen(fullfile(PathName,dataFileName));
|
|
catch
|
|
warning('File ',fullfile(PathName,dataFileName),' does not exist');
|
|
end;
|
|
|
|
fseek(fid,0,'eof'); %ff to end
|
|
endpos=ftell(fid); %find file size
|
|
fseek(fid,0,'bof'); %rewind to start
|
|
tline = fgetl(fid);
|
|
% while ~(feof(fid) || ~isempty(findstr(tline,'<data>'))),
|
|
% tline = fgetl(fid);
|
|
% end;
|
|
%read data
|
|
logData=[];
|
|
num=0; maxnum=100; %used to flush event queue
|
|
while ~feof(fid),
|
|
tline = fgetl(fid);
|
|
[tok,tline]=strtok(tline);
|
|
t=sscanf(tok,'%g'); %extract time
|
|
[tok,tline]=strtok(tline);
|
|
plane=sscanf(tok,'%g'); %airplane id?
|
|
[lab,tline]=strtok(tline); %extract message label
|
|
fld=sscanf(tline,'%g'); %extract a vector of fields
|
|
found=0; j=1; count=max(size(labelsSections));
|
|
%find index of the message label in the protocol
|
|
while j<count+1 && ~found,
|
|
%found=~isempty(strmatch(lab,cell2mat(labelsSections(j))));
|
|
found=strcmp(lab,cell2mat(labelsSections(j)));
|
|
j=j+1;
|
|
end;
|
|
j=j-1;
|
|
if ~found,
|
|
warning('Protocol specification in messages.xml does not match protocol in log file.');
|
|
else % if found
|
|
s=struct('time',t,'type',j,'plane_id',plane,'fields',fld);
|
|
logData=[logData,s];
|
|
end;
|
|
pos=ftell(fid);
|
|
set(handles.text1,'String',[num2str(double(pos)/double(endpos)*100.0,'%5.2f'),'%']);
|
|
num=num+1;
|
|
if num>maxnum,
|
|
num=0;
|
|
drawnow; %flash event queue
|
|
end;
|
|
end;
|
|
|
|
%make labels for Device ID listbox
|
|
global id_Devices;
|
|
id_Devices=[];
|
|
count=max(size(logData));
|
|
for j=1:count,
|
|
k=1; nn=max(size(id_Devices));
|
|
tag=logData(j).plane_id; notfound=1;
|
|
while k<=nn && notfound,
|
|
notfound=~(tag==id_Devices(k));
|
|
if notfound,
|
|
k=k+1;
|
|
end;
|
|
end;
|
|
if notfound,
|
|
id_Devices=[id_Devices,tag];
|
|
end;
|
|
end;
|
|
labelsDevices=num2str(id_Devices(1));
|
|
for j=2:max(size(id_Devices)),
|
|
labelsDevices=[labelsDevices,'|',num2str(id_Devices(j))];
|
|
end;
|
|
set(handles.ListDevices,'String',labelsDevices);
|
|
|
|
|
|
|
|
set(handles.text1,'String',FileName);
|
|
set(handles.ListSections,'Enable','on');
|
|
set(handles.ListFields,'Enable','on');
|
|
set(handles.ListDevices,'Enable','on');
|
|
else
|
|
%file was not selected
|
|
end;
|
|
|
|
j=1;
|
|
while (~strcmp(labelsSections{j},'BOOT') && j<max(size(labelsSections)) )
|
|
j=j+1;
|
|
end;
|
|
k=1;
|
|
while logData(k).type~=j && k<max(size(logData))
|
|
k=k+1;
|
|
end;
|
|
if (k<max(size(logData)))
|
|
X0=logData(k).time;
|
|
else
|
|
warning('BOOT message not found.. Corrupted log?');
|
|
end;
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function ListFields_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to ListFields (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: listbox controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
|
|
% --- Executes on selection change in ListFields.
|
|
function ListFields_Callback(hObject, eventdata, handles)
|
|
% hObject handle to ListFields (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: contents = get(hObject,'String') returns ListFields contents as cell array
|
|
% contents{get(hObject,'Value')} returns selected item from ListFields
|
|
|
|
%make labels for the fields list (submenu)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
% --- Executes on button press in keepToggleButton.
|
|
function keepToggleButton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to keepToggleButton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hint: get(hObject,'Value') returns toggle state of keepToggleButton
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function ListSections_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to ListSections (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: listbox controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
% --- Executes on selection change in ListSections.
|
|
function ListSections_Callback(hObject, eventdata, handles)
|
|
% hObject handle to ListSections (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: contents = get(hObject,'String') returns ListSections contents as cell array
|
|
% contents{get(hObject,'Value')} returns selected item from ListSections
|
|
% global nodeList;
|
|
% global labelsSections;
|
|
% global sectionsIndex;
|
|
% global labelsFields;
|
|
% global fieldsIndex;
|
|
%
|
|
% nn=get(handles.ListSections,'Value');
|
|
% nn=nn(1);
|
|
% childList=nodeList.item(sectionsIndex(nn)).getChildNodes;
|
|
% count=childList.getLength;
|
|
% labelsFields=[];
|
|
% for j=0:count-1,
|
|
% if childList.item(j).getNodeName=='field',
|
|
% attr=childList.item(j).getAttributes;
|
|
% cattr=attr.getLength; k=0;
|
|
% while k<cattr && ~strcmp(attr.item(k).getName,'name'),
|
|
% k=k+1;
|
|
% end;
|
|
% labelsFields=[labelsFields,char(attr.item(k).getValue),'|'];
|
|
% fieldsIndex=[fieldsIndex,k];
|
|
% end;
|
|
% end;
|
|
% labelsFields=labelsFields(1:max(size(labelsFields))-1); %cut off last '|' character
|
|
% set(handles.ListFields,'String',labelsFields);
|
|
% set(handles.ListFields,'Value',1);
|
|
|
|
|
|
|
|
global nodeList;
|
|
global labelsSections;
|
|
global sectionsIndex;
|
|
global labelsFields;
|
|
global fieldsIndex;
|
|
|
|
nn=get(handles.ListSections,'Value');
|
|
nn=nn(1);
|
|
childList=nodeList.item(sectionsIndex(nn)).getChildNodes;
|
|
count=childList.getLength;
|
|
labelsFields=[];
|
|
lineFields=[];
|
|
fieldsIndex=[];
|
|
for j=0:count-1,
|
|
if childList.item(j).getNodeName=='field',
|
|
attr=childList.item(j).getAttributes;
|
|
cattr=attr.getLength; k=0;
|
|
while k<cattr && ~strcmp(attr.item(k).getName,'name'),
|
|
k=k+1;
|
|
end;
|
|
labelsFields=[labelsFields,{char(attr.item(k).getValue)}];
|
|
lineFields=[lineFields,char(attr.item(k).getValue),'|'];
|
|
fieldsIndex=[fieldsIndex,k];
|
|
end;
|
|
end;
|
|
lineFields=lineFields(1:max(size(lineFields))-1); %cut off last '|' character
|
|
set(handles.ListFields,'String',lineFields);
|
|
set(handles.ListFields,'Value',1);
|
|
|
|
|
|
|
|
% --- Executes on button press in plotButton.
|
|
function plotButton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to plotButton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global logData;
|
|
global id_Devices;
|
|
global x;
|
|
global y;
|
|
|
|
Nres=1000; % minimum number of points in the plot (resolution)
|
|
%if actual number of points if greater we dont need to change anything, but
|
|
%if it is less, interpolate using nearest neighbor as closest model of
|
|
%signals incoming to ground station. Previous value is used in the ap
|
|
%until a new value is obtained
|
|
|
|
axes(handles.axes1);
|
|
|
|
if ~get(handles.keepToggleButton,'Value')
|
|
cla;
|
|
else
|
|
hold on;
|
|
end;
|
|
n=get(handles.ListSections,'Value');
|
|
n=n(1);
|
|
m=get(handles.ListFields,'Value'); m=m(1);
|
|
k=get(handles.ListDevices,'Value');
|
|
global id_Devices;
|
|
k=id_Devices(k);
|
|
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
xlim([t1 t2]);
|
|
axis 'auto y';
|
|
end;
|
|
|
|
% --- Executes on button press in printButton.
|
|
function printButton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to printButton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
printpreview(gcf);
|
|
|
|
|
|
% --- Executes on button press in edit.
|
|
function edit_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
if ~get(handles.edit,'Value')
|
|
plotedit off;
|
|
else
|
|
plotedit(gcf);
|
|
end;
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function ListDevices_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to ListDevices (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: listbox controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
|
|
% --- Executes on selection change in ListDevices.
|
|
function ListDevices_Callback(hObject, eventdata, handles)
|
|
% hObject handle to ListDevices (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: contents = get(hObject,'String') returns ListDevices contents as cell array
|
|
% contents{get(hObject,'Value')} returns selected item from ListDevices
|
|
|
|
|
|
% --- Executes on button press in zoomin.
|
|
function zoomin_Callback(hObject, eventdata, handles)
|
|
% hObject handle to zoomin (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
if get(hObject,'Value')==get(hObject,'Max')
|
|
zoom on;
|
|
else
|
|
zoom off;
|
|
end;
|
|
|
|
% --- Executes on button press in zoomout.
|
|
function zoomout_Callback(hObject, eventdata, handles)
|
|
% hObject handle to zoomout (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
if get(hObject,'Value')==get(hObject,'Min')
|
|
zoom on;
|
|
else
|
|
zoom off;
|
|
end;
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function edit1_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to edit1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
|
|
|
|
function edit1_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit1 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of edit1 as text
|
|
% str2double(get(hObject,'String')) returns contents of edit1 as a double
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function edit2_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to edit2 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
% Hint: edit controls usually have a white background on Windows.
|
|
% See ISPC and COMPUTER.
|
|
if ispc
|
|
set(hObject,'BackgroundColor','white');
|
|
else
|
|
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
|
|
end
|
|
|
|
|
|
|
|
function edit2_Callback(hObject, eventdata, handles)
|
|
% hObject handle to edit2 (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hints: get(hObject,'String') returns contents of edit2 as text
|
|
% str2double(get(hObject,'String')) returns contents of edit2 as a double
|
|
|
|
|
|
% --- Executes on button press in rotate3d.
|
|
function rotate3d_Callback(hObject, eventdata, handles)
|
|
% hObject handle to rotate3d (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
|
|
% Hint: get(hObject,'Value') returns toggle state of rotate3d
|
|
|
|
if get(hObject,'Value')==get(hObject,'Min')
|
|
rotate3d off;
|
|
else
|
|
rotate3d on;
|
|
end;
|
|
|
|
|
|
|
|
% --- Executes on button press in roll_button_button.
|
|
function roll_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to roll_button_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global id_Devices;
|
|
|
|
axes(handles.axes1);
|
|
[m,n]=set2Plot(handles,'attitude','phi');
|
|
k=get(handles.ListDevices,'Value'); k=id_Devices(k);
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold on;
|
|
[m,n]=set2Plot(handles,'desired','roll');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',2.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold off;
|
|
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
|
|
legend('estimated\_roll','desired\_roll');
|
|
|
|
|
|
% --- Executes on button press in pitch_button.
|
|
function pitch_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to pitch_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global id_Devices;
|
|
|
|
axes(handles.axes1);
|
|
|
|
k=get(handles.ListDevices,'Value'); k=id_Devces(k);
|
|
|
|
[m,n]=set2Plot(handles,'attitude','theta');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold on;
|
|
[m,n]=set2Plot(handles,'desired','pitch');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',2.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold off;
|
|
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
|
|
legend('estimated\_pitch','desired\_pitch');
|
|
|
|
% --- Executes on button press in heading_button.
|
|
function heading_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to heading_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global id_Devices;
|
|
|
|
axes(handles.axes1);
|
|
k=get(handles.ListDevices,'Value'); k=id_Devices(k);
|
|
|
|
[m,n]=set2Plot(handles,'GPS','course');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold on;
|
|
[m,n]=set2Plot(handles,'navigation','desired_course');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',2.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold off;
|
|
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
|
|
legend('estimated\_course','desired\_course');
|
|
|
|
|
|
% --- Executes on button press in altitude_button.
|
|
function altitude_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to altitude_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global id_Devices;
|
|
|
|
axes(handles.axes1);
|
|
k=get(handles.ListDevices,'Value'); k=id_Devices(k);
|
|
|
|
[m,n]=set2Plot(handles,'GPS','alt');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold on;
|
|
[m,n]=set2Plot(handles,'desired','desired_altitude');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',2.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold off;
|
|
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
|
|
legend('estimated\_altitude','desired\_altitude');
|
|
|
|
|
|
% --- Executes on button press in traj_button.
|
|
function traj_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to traj_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global z;
|
|
global t;
|
|
global id_Devices;
|
|
|
|
axes(handles.axes1);
|
|
|
|
xx=[];
|
|
yy=[];
|
|
zz=[];
|
|
k=get(handles.ListDevices,'Value'); k=id_Devices(1);
|
|
|
|
[m,n]=set2Plot(handles,'navigation','pos_x');
|
|
if m*n~=0,
|
|
[tx,xx]=setXY2plot(m,n,k);
|
|
end;
|
|
[m,n]=set2Plot(handles,'navigation','pos_y');
|
|
if m*n~=0,
|
|
[ty,yy]=setXY2plot(m,n,k);
|
|
yy=interp1(ty,yy,tx);
|
|
end;
|
|
[m,n]=set2Plot(handles,'GPS','alt');
|
|
if m*n~=0,
|
|
[tz,zz]=setXY2plot(m,n,k);
|
|
zz=interp1(tz,zz,tx);
|
|
end;
|
|
|
|
x=xx;
|
|
y=yy;
|
|
global ground_alt;
|
|
z=zz-ground_alt;
|
|
t=tx;
|
|
|
|
if ~isempty(x) && ~isempty(y) && ~isempty(z) && ~isempty(t),
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2 && t1<=t(max(size(t)-1)),
|
|
N=max(size(t));
|
|
n1=1; while n1<=N && t(n1)<t1, n1=n1+1; end;
|
|
n2=n1+1; while n2<=N && t(n2)<t2, n2=n2+1; end;
|
|
h=plot3(x(n1:n2),y(n1:n2),z(n1:n2));
|
|
else
|
|
h=plot3(x,y,z);
|
|
end;
|
|
set(h,'LineWidth',1.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
box;
|
|
grid on;
|
|
end;
|
|
|
|
% --- Executes on button press in vel_button.
|
|
function vel_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to vel_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
global z;
|
|
global t;
|
|
|
|
|
|
axes(handles.axes1);
|
|
k=get(handles.ListDevices,'Value');
|
|
global id_Devices;
|
|
k=id_Devices(k);
|
|
|
|
[m,n]=set2Plot(handles,'GPS','speed');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold on;
|
|
|
|
xx=[];
|
|
yy=[];
|
|
zz=[];
|
|
|
|
[m,n]=set2Plot(handles,'navigation','pos_x');
|
|
if m*n~=0,
|
|
[tx,xx]=setXY2plot(m,n,k);
|
|
end;
|
|
[m,n]=set2Plot(handles,'navigation','pos_y');
|
|
if m*n~=0,
|
|
[ty,yy]=setXY2plot(m,n,k);
|
|
yy=interp1(ty,yy,tx);
|
|
end;
|
|
[m,n]=set2Plot(handles,'GPS','alt');
|
|
if m*n~=0,
|
|
[tz,zz]=setXY2plot(m,n,k);
|
|
zz=interp1(tz,zz,tx);
|
|
end;
|
|
v=[];N=max(size(xx));
|
|
for j=2:N, v=[v sqrt((xx(j)-xx(j-1))^2+(yy(j)-yy(j-1))^2+(zz(j)-zz(j-1))^2)/(tx(j)-tx(j-1))]; end;
|
|
y=v;
|
|
x=tx(2:N);
|
|
h=plotlog(x,y);
|
|
if ~isempty(x) && ~isempty(y),
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2 && t1<=t(max(size(t)-1)),
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
set(h,'LineWidth',2.0);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
hold off;
|
|
legend('GPS\_speed','computed\_speed');
|
|
|
|
% --- Executes on button press in gaz_button.
|
|
function gaz_button_Callback(hObject, eventdata, handles)
|
|
% hObject handle to gaz_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
global x;
|
|
global y;
|
|
|
|
axes(handles.axes1);
|
|
k=get(handles.ListDevices,'Value');
|
|
global id_Devices;
|
|
k=id_Devices(k);
|
|
|
|
|
|
[m,n]=set2Plot(handles,'servos','thrust');
|
|
if m*n~=0,
|
|
[x,y]=setXY2plot(m,n,k);
|
|
h=plotlog(x,y);
|
|
set(h,'LineWidth',0.5);
|
|
set(h,'Marker','none');
|
|
set(h,'LineStyle','-');
|
|
end;
|
|
t1=str2num(get(handles.edit1,'String'));
|
|
t2=str2num(get(handles.edit2,'String'));
|
|
if t1~=t2 && t1<t2,
|
|
axis([t1 t2 -inf inf]); axis 'auto y';
|
|
end;
|
|
|
|
% --- Executes on button press in ap_mode_pushbutton_pushbutton.
|
|
function ap_mode_pushbutton_Callback(hObject, eventdata, handles)
|
|
% hObject handle to ap_mode_pushbutton_pushbutton (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles structure with handles and user data (see GUIDATA)
|
|
xl=xlim;
|
|
yl=ylim;
|
|
xscale=xl(2)-xl(1);
|
|
yscale=yl(2)-yl(1);
|
|
|
|
|
|
k=get(handles.ListDevices,'Value');
|
|
global id_Devices;
|
|
k=id_Devices(k);
|
|
|
|
|
|
[m,n]=set2Plot(handles,'PPRZ_MODE','ap_mode');
|
|
if m*n==0,
|
|
return;
|
|
end;
|
|
n1=1;
|
|
[x,y]=setXY2plot(m,n,k);
|
|
N=max(size(x));
|
|
while x(n1)<xl(1) && n1<N, n1=n1+1; end;
|
|
while x(n1)<xl(2) && n1<N,
|
|
m1=y(n1+1);
|
|
C=[0 0 0]; %color
|
|
switch m1
|
|
case 0
|
|
C=[1 0.3 0];
|
|
txt='manual';
|
|
case 1
|
|
C=[1 0.5 0];
|
|
txt='auto1';
|
|
case 2
|
|
C=[1 0.7 0];
|
|
txt='auto2';
|
|
case 3
|
|
C=[1 1 0];
|
|
txt='home';
|
|
end;
|
|
n2=n1+1; while y(n2)==m1 && x(n2)<xl(2) && n2<N, n2=n2+1; end;
|
|
hold on;
|
|
if x(n1)<xl(1), t1=xl(1)+0.01*xscale; else t1=x(n1); end;
|
|
if x(n2)>xl(2), t2=xl(2)-0.01*xscale; else t2=x(n2); end;
|
|
line([t1 t2],[yl(1)+0.1*yscale yl(1)+0.1*yscale],'LineWidth',0.5,'Color',C);
|
|
if x(n1)>=xl(1), patch([1,0,1]*xscale*0.01+x(n1),[-1 0 1]*yscale*0.01+yl(1)+0.1*yscale,C); end;
|
|
if x(n2)<=xl(2), patch(-1*[1,0,1]*xscale*0.01+x(n2),[-1 0 1]*yscale*0.01+yl(1)+0.1*yscale,C); end;
|
|
if t2-t1>0.15*xscale, text(t1+0.5*(t2-t1),yl(1)+0.1*yscale,txt,...
|
|
'EdgeColor',C,'BackgroundColor',get(handles.axes1,'Color'),'HorizontalAlignment','Center'); end;
|
|
hold off;
|
|
n1=n2;
|
|
end;
|
|
legend_handle=legend;
|
|
if ~isempty(legend_handle), legend(legend_handle); end; %refresh legend
|
|
|
|
|
|
|
|
% --- Executes during object creation, after setting all properties.
|
|
function vel_button_CreateFcn(hObject, eventdata, handles)
|
|
% hObject handle to vel_button (see GCBO)
|
|
% eventdata reserved - to be defined in a future version of MATLAB
|
|
% handles empty - handles not created until after all CreateFcns called
|
|
|
|
|
|
|
|
|