📄 sync_fa.m
字号:
%%% parameters %%%
function [out] = sync_fa(LOG, in)
%events
SYNC_OK = 1;
SFD_OK = 3;
SFD_LATE = 7;
SFD_EARLY = 8;
SYNC_START = 0;
CHEST_DONE = 2;
%%% parse the log file %%%
fid = fopen(LOG);
log = true;
timing = false;
events = [];
pkts = [];
while 1
tline = fgetl(fid);
if ~ischar(tline), break, end
if(log) %we are in the log part
if(isempty(strmatch('Packet',tline)))
%find semicolon
k = strfind(tline, ':');
%register event
events = [events; str2num(tline(1:k-1)) str2num(tline(k+1:k+2))];
else
log = false;
timing = true;
end
elseif(timing) %we are in the timing part
if(isempty(strmatch('Parameters',tline)))
%find semicolon
k = strfind(tline, ':');
%register pkt
pkts = [pkts; str2num(tline(1:k-1)) str2num(tline(k+1:end))];
else
timing = false;
end
else %we are in the Parameter part
if(~isempty(strmatch('sync_len',tline)))
%find semicolon
k = strfind(tline, ':');
sync_len = str2num(tline(k+1:end));
elseif(~isempty(strmatch('sfd_len',tline)))
%find semicolon
k = strfind(tline, ':');
sfd_len = str2num(tline(k+1:end));
elseif(~isempty(strmatch('packet_len',tline)))
%find semicolon
k = strfind(tline, ':');
packet_len = str2num(tline(k+1:end));
end
end
end
fclose(fid);
%%% do the processing %%%
pre_len = sync_len + sfd_len;
total_len = pre_len + packet_len;
%get pkts of UOI
%only take those after the simulation start event
sim_start = events(1,1)
pkts_after_sim_start_idx = find(pkts(:,1)>=sim_start);
uoi_pkts_idx = find(pkts(pkts_after_sim_start_idx,2)==1);
uoi_pkts_start = pkts(uoi_pkts_idx,1);
uoi_pkts_sfd_start = uoi_pkts_start + sync_len;
uoi_pkts_data_start = uoi_pkts_start + pre_len;
%get pkts of IFs
if_pkts_idx = find(pkts(:,2)~=1);
if_pkts_start = pkts(if_pkts_idx,1);
%get all sync ok events
times_sync_ok = events(events(:,2)==SYNC_OK,1);
temp = [];
for i=1:length(times_sync_ok)
%check the difference to a good sync event
current = times_sync_ok(i);
%find the corresponding pkt start
pkt_starts_before = pkts(pkts(:,1)<current,:);
closest_start = pkt_starts_before(end,1);
closest_user = pkt_starts_before(end,2);
% [diff2closest, closest_idx] = min(abs(pkts(:,1)-current));
% closest_start = pkts(closest_idx,1);
% closest_user = pkts(closest_idx,2)
diff = current - closest_start;
slot_len = sync_len / 64 / 31;
%get the difference to the closest code start
slot_nr = mod(round(diff/slot_len),31);
%check whether there is an sfd event after sync ok
stop = current + pre_len;
sfd_event = 0;
for j = [SFD_OK SFD_EARLY SFD_LATE]
times_sfd_event = events(events(:,2)==j,1);
times_sfd_event(times_sfd_event<current)=0;
times_sfd_event(times_sfd_event>stop)=0;
if(sum(times_sfd_event))
sfd_event = j;
break;
end
end
temp = [temp; closest_user, slot_nr, sfd_event];
end
out = [in; temp];
percentage = 0;
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -