function fieldchangeapp(varargin) if nargin==0 %initial screen %data data.fields = {'MSL_FIELD_A_a','MSL_FIELD_B_a'}; data.pc = [cellstr(strcat('turtle',int2str([1:6]')));{'devpc'}]; data.names = [{'all fields'},data.fields]; %create figure data.c = []; figure('units','normalized','position',[.3 .3 .4 .3]) w = 1/length(data.names); h = 1/(length(data.pc)+1); for i=1:length(data.names) data.b(i) = uicontrol('units','normalized','position',[(i-1)*w 1-h w h],'style','pushbutton','string',['ping ' data.names{i}],'callback',['fieldchangeapp(''all'',''' data.names{i} ''')']); for j=1:length(data.pc) if i==1 data.c(j,i) = uicontrol('units','normalized','position',[(i-1)*w 1-(j+1)*h w h],'style','pushbutton','callback',['fieldchangeapp(''ping'',''' data.pc{j} ''')'],'string',data.pc{j}); else data.c(j,i) = uicontrol('units','normalized','position',[(i-1)*w 1-(j+1)*h w h],'style','checkbox','callback',['fieldchangeapp(''checkbox'',[' int2str([j i-1]) '])']); end if j==length(data.pc) && i==1 set(data.c(j,i),'callback','') end end end set(gcf,'userdata',data) currentfield else %commands cmd = varargin{1}; val = varargin{2}; data = get(gcf,'userdata'); %process inputs set(data.c,'enable','off') set(data.b,'enable','off') if isequal(cmd,'all') if isequal(val,data.names{1}) %ping/field check fld = currentfield; set(data.c,'backgroundcolor',[0.7020 0.7020 0.7020]) for i=1:length(data.fields) changefield(data.fields{i}) for j=1:6 pingturtle(['turtle' int2str(j)]); end end changefield(fld) else %check all fields of active turtles fld = currentfield; changefield(val) for i=1:6 pingturtle(['turtle' int2str(i)]); end changefield(fld); end elseif isequal(cmd,'ping') fld = currentfield; set(data.c(str2num(val(end)),:),'backgroundcolor',[0.7020 0.7020 0.7020]) for i=1:length(data.fields) changefield(data.fields{i}) pause(2) pingturtle(val); end changefield(fld) elseif isequal(cmd,'checkbox') if val(1)==length(data.pc) %devpc changefield(data.fields{val(2)}); else %turtle set(data.c(val(1),:),'backgroundcolor',[0.7020 0.7020 0.7020]) set(data.c(val(1),:),'value',0) drawnow turtle = data.pc{val(1)}; changefieldturtle(turtle,data.fields{val(2)}); end else error('pruts code') end set(data.c,'enable','on') set(data.b,'enable','on') end function found = pingturtle(turtle) data = get(gcf,'userdata'); j = str2num(turtle(end)); [fld,i] = currentfield; [a,b]=system(['ping ' turtle ' -w4']); if ~isempty(findstr(b,'time=')) %robot is at same field as devpc found = 1; set(data.c(j,i+1),'BackgroundColor',[0 .5 0]) set(data.c(j,i+1),'value',1) else found = 0; set(data.c(j,i+1),'BackgroundColor',[1 0 0]) set(data.c(j,i+1),'value',0) end drawnow function [fld,fldi] = currentfield data = get(gcf,'userdata'); fid = fopen('/etc/Robocup/field.conf','r'); tmp = fgetl(fid); while ischar(tmp) fld = tmp(regexp(tmp,'MSL_\w+'):end); if ~isempty(fld) && tmp(1)~='#' fclose(fid); fldi = 1; while ~isequal(data.fields{fldi},fld) fldi = fldi+1;end set(data.c(end,:),'value', 0); set(data.c(end,fldi+1),'value', 1); drawnow return; end tmp = fgetl(fid); end fclose(fid); error('can''t find field') function changefield(fld) data = get(gcf,'userdata'); fldcur = currentfield; if isequal(fldcur,fld) return; end %load data fid = fopen('/etc/Robocup/field.conf','r'); tmp = fgets(fid); str={}; while ischar(tmp) str{end+1}=tmp; tmp = fgets(fid); end fclose(fid); %change data for i=1:length(str) if ~isempty(strfind(str{i},fld)) str{i} = sprintf('%s\n',fld); elseif str{i}(1)~='#' str{i} = ['# ' str{i}]; end end %save data fid = fopen('/etc/Robocup/field.conf','w'); tmp = fgets(fid); for i=1:length(str) fwrite(fid,str{i},'char'); end fclose(fid); [a,b]=system('sudo /etc/Robocup/robocup_network'); pause(1) currentfield; function createnewfieldconf(fld) %load data fid = fopen('/etc/Robocup/field.conf','r'); tmp = fgets(fid); str={}; while ischar(tmp) str{end+1}=tmp; tmp = fgets(fid); end fclose(fid); %change data for i=1:length(str) if ~isempty(strfind(str{i},fld)) str{i} = sprintf('%s\n',fld); elseif str{i}(1)~='#' str{i} = ['# ' str{i}]; end end %save data fid = fopen('/etc/Robocup/field.conf','w'); tmp = fgets(fid); for i=1:length(str) fwrite(fid,str{i},'char'); end fclose(fid); function changefieldturtle(turtle,field) data = get(gcf,'userdata'); fldcur = currentfield; for i=1:length(data.fields) changefield(data.fields{i}); if pingturtle(turtle) %this sequence still can be optimized for speed.... createnewfieldconf(field); [a,b]=system(['sudo scp /etc/Robocup/field.conf root@' turtle ':/etc/Robocup']); pause(2) [a,b]=system(['ssh ' turtle ' sudo /etc/Robocup/robocup_network&']); pause(8) !sudo killall -9 ssh changefield(data.fields{i}); pause(1) pingturtle(turtle); pause(2) changefield(field); pause(4) [a,b]=system('sudo /etc/Robocup/robocup_network'); pause(8) pingturtle(turtle); changefield(fldcur) return; end end changefield(fldcur)