clear;close all;clc;tic;
dirOutput = dir('*.dat'); % 罗列所有后缀-1.dat的文件列表,罗列BDDATA的数据
filenames = string({dirOutput.name}'); % 提取文件名
%% 丢包统计
FILENAMES = [""];
LOSS_YTJ = [ ];
LOSS_RAD = [ ];
LOSS_ETH = [ ];
LOSS_YK = [ ];
j=1;
%% 批处理
for i = 1:length(filenames)
%% 文件名
filename = char(filenames(i));
filename = string(filename([1:end-16])); % 例如:20090111-190130-2
%% 加载数据文件
TELEMETRY_fileID = fopen(filename+'TELEMETRY-v1.dat'); % 获取 TELEMETRY 文件ID
DATA_TELEMETRY = fread(TELEMETRY_fileID); % 读取 TELEMETRY 文件数据
fclose(TELEMETRY_fileID); % 关闭文件
%% 解析数据文件
TELEMETRY_RAW = reshape(DATA_TELEMETRY,[ 239 length(DATA_TELEMETRY)/239])'; % 帧格式转换
cnt_yaoce_link = TELEMETRY_RAW(:,17); % 遥测链路cnt (239字节的第17字节)
time_yitiji = (TELEMETRY_RAW(:,234)*2^8 + TELEMETRY_RAW(:,233)) ; % 一体机时间 (239字节的第234、233字节)
cnt_gnd_eth = TELEMETRY_RAW(:,13); % 地面接口网口cnt (239字节的第13字节)
ip_config = TELEMETRY_RAW(:,30); % 电台反馈IP (239字节的第30字节)
cfk_ml = TELEMETRY_RAW(:,31); % 最近测发控指令 (239字节的第31字节)
signal_power = TELEMETRY_RAW(:,32); % 遥控信号能量值单字节 (239字节的第32字节)
zijian = TELEMETRY_RAW(:,33); % 自检完成 (239字节的第33字节)
state_yaokong = TELEMETRY_RAW(:,32); % 遥控链路通断状态 (239字节的第32字节)
control_yaokong = TELEMETRY_RAW(:,36)*2^8+TELEMETRY_RAW(:,35); % 地面遥控指令是否连续 (239字节的第36、35字节)
angle_cabrage = (TELEMETRY_RAW(:,50)*2^8 + TELEMETRY_RAW(:,49)) * 0.01; % 飞行姿态 俯仰 (239字节第50、49)
angle_roll = (TELEMETRY_RAW(:,52)*2^8 + TELEMETRY_RAW(:,51)) * 0.01; % 飞行姿态 滚动 (239字节第52、51)
angle_Heading = (TELEMETRY_RAW(:,54)*2^8 + TELEMETRY_RAW(:,53)) * 0.01; % 飞行姿态 航向 (239字节第54、53)
speed_bd = TELEMETRY_RAW(:,149)*0.005; % 靶弹飞行速度 (239字节第149字节)
high_bd = (TELEMETRY_RAW(:,88)*2^8+TELEMETRY_RAW(:,87))*0.2-500; % 靶弹飞行高度 (239字节第88、87字节)
len_tele = length(cnt_yaoce_link); % TELEMETRY 数据长度
%% 数据处理
% 遥测链路是否丢包,前后相减是否为1
diubao_yaoce_link = diff(cnt_yaoce_link);
diubao_yaoce_link(diubao_yaoce_link <= 0) = diubao_yaoce_link(diubao_yaoce_link <= 0) + 256; % 处理负数
flag_diubao_yaoce_link = diubao_yaoce_link ~= 1; % 遥测链路丢包时刻
count_diubao_yaoce_link = sum(diubao_yaoce_link-1); % 遥测链路丢包数
% 遥测是否丢包,基于一体机,前后相减是否为1
diubao_yaoce_yitiji = diff(time_yitiji);
% diubao_yaoce_yitiji(diubao_yaoce_yitiji == -65535) = 1; % 处理负数
diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) = diubao_yaoce_yitiji(diubao_yaoce_yitiji < 0) + 65536; % 处理负数
flag_diubao_yaoce_yitiji = diubao_yaoce_yitiji ~= 1; % 遥测丢包时刻
count_diubao_yaoce_yitiji = sum(diubao_yaoce_yitiji-1); % 遥测总丢包数
% 地面网口接口是否丢包,前后相减是否为1
diubao_gnd_eth = diff(cnt_gnd_eth);
diubao_gnd_eth(diubao_gnd_eth <= 0) = diubao_gnd_eth(diubao_gnd_eth <= 0) + 256; % 处理负数
flag_diubao_gnd_eth = diubao_gnd_eth ~= 1; % 地面网口丢包时刻
count_diubao_gnd_eth = sum(diubao_gnd_eth-1); % 地面网口丢包数
% 链路能量情况,整个字节显示
% 自检完成,加载成功,判断是否等于FF
state_zijian = zijian == 0xff;
% 遥控链路通断状态(大于0即可)
state_yk_link = state_yaokong > 0;
% 地面遥控指令是否连续(是否存在00)
state_yk_zl = control_yaokong == 0;
k=1;
while state_yk_zl(k) == 1 && k < 500 % 清除错误的数值,容错前50个。
state_yk_zl(k) = 0;
k = k+1;
end
count_state_yk_zl = sum(state_yk_zl); % 遥控总丢包数
flag_state_yk_zl = state_yk_zl ~= 0;
% 遥控指令切换状态,切换计数器
% 角度负数处理
angle_cabrage(angle_cabrage>327.67) = angle_cabrage(angle_cabrage>327.67) - 655.36;
angle_roll(angle_roll>327.67) = angle_roll(angle_roll>327.67) - 655.36;
angle_Heading(angle_Heading>327.67) = angle_Heading(angle_Heading>327.67) - 655.36;
% 统计丢包数(网络、链路、遥测、遥控)
FILENAMES(j) = filename; % 文件名称
% LOSS_YTJ(j) = count_diubao_yaoce_yitiji - count_diubao_yaoce_link; % 一体机丢包
% LOSS_RAD(j) = count_diubao_yaoce_link - count_diubao_gnd_eth; % 遥测链路丢包
LOSS_YTJ(j) = count_diubao_yaoce_yitiji ; % 一体机丢包
LOSS_RAD(j) = count_diubao_yaoce_link ; % 遥测链路丢包
LOSS_ETH(j) = count_diubao_gnd_eth; % 以太网丢包
LOSS_YK(j) = count_state_yk_zl; % 遥控丢包
disp('如上图所示,网络丢'+string(LOSS_ETH(j))+'包,遥测链路丢'+string(LOSS_RAD(j))+'包,一体机丢'+string(LOSS_YTJ(j))+'包。'); % 快速报告
j=j+1;
%% 创建对应文件名的文件夹
mkdir(filename);
%% 绘制第一类图 : 丢包 帧计数(网络、链路、遥测、指令) ( BD 指令和指令切换时刻)
img = gcf;
clf(img);
hold on;
plot(flag_diubao_gnd_eth*150,'--');
plot(flag_diubao_yaoce_link*140,'.');
plot(flag_diubao_yaoce_yitiji*130,'s');
plot(cfk_ml,'r');
plot([0,len_tele],[97,97],'linestyle','--');
plot([0,len_tele],[113,113],'linestyle','--');
legend('网络丢包','链路丢包','一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
title('丢包与帧计数(网络、链路、遥测、指令)');
ylim([-0.3 155]);
hold off;
print(img,'-dpng','-r800',filename+'/1_1丢包帧计数与指令.png');
savefig(img,filename+'/1_1丢包帧计数与指令.fig');
% clf(img);
% hold on;
% plot(state_yk_qie(:,2),'r');
% plot(yk_zl_qiehuan*150,'g--');
% plot([0,len_bd],[97,97],'linestyle','--');
% plot([0,len_bd],[113,113],'linestyle','--');
% legend('指令','指令切换时刻','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
% ylim([-0.3 155]);
% hold off;
% print(img,'-dpng','-r800',filename+'/1_2靶弹指令和指令切换时刻.png');
% savefig(img,filename+'/1_2靶弹指令和指令切换时刻.fig');
%% 绘制第二类图 遥控信号能量 & 遥控丢包 & 自检完成
clf(img);
hold on;
plot(signal_power,'r');
% 通断、其余未断链
plot([0,len_tele],[0,0],'linestyle','--');
% 大信号
plot([0,len_tele],[48,48],'linestyle','--');
plot([0,len_tele],[95,95],'linestyle','--');
% 中信号
plot([0,len_tele],[96,96],'linestyle','--');
plot([0,len_tele],[143,143],'linestyle','--');
% 小信号
plot([0,len_tele],[144,144],'linestyle','--');
plot([0,len_tele],[191,191],'linestyle','--');
% 遥控丢包
plot(flag_state_yk_zl*150,'g');
% 自检
plot(state_zijian * 10); % 自检
title('遥控信号能量 & 遥控丢包 & 自检完成');
legend('遥控信号能量','通断','大信号上限','大信号下限', ...
'中信号下限','中信号上限','小信号下限','小信号上限',...
'遥控丢包','自检完成','Location','NorthEastOutside');
hold off;
print(img,'-dpng','-r800',filename+'/2_遥控丢包_遥控能量.png');
savefig(img,filename+'/2_遥控丢包_遥控能量.fig');
%% 绘制第三类图 飞行 (俯仰、滚动、航向)
% clf(img);
% hold on;
% plot(angle_cabrage);
% plot(angle_roll);
% plot(angle_Heading);
% title('俯仰、滚动、航向');
% ylim([-180 180]);
% hold off;
% print(img,'-dpng','-r800',filename+'/3_飞行角度.png');
% savefig(img,filename+'/3_飞行角度.fig');
%% 绘制第四类图 IP分析图
% clf(img);
% plot(ip_config);
% title('IP反馈图');
% print(img,'-dpng','-r800',filename+'/4_IP反馈图.png');
% savefig(img,filename+'/4_IP反馈图.fig');
%% 纯链路丢包
clf(img);
hold on;
plot((flag_diubao_yaoce_link-flag_diubao_gnd_eth)*150,'--');
plot(cfk_ml,'r');
plot([0,len_tele],[97,97],'linestyle','--');
plot([0,len_tele],[113,113],'linestyle','--');
legend('链路丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
title('链路丢包与帧计数(链路、指令)');
ylim([-0.3 155]);
hold off;
print(img,'-dpng','-r800',filename+'/5丢包帧计数与指令.png');
savefig(img,filename+'/5纯链路丢包帧计数与指令.fig');
%% 纯一体机丢包
clf(img);
hold on;
plot((flag_diubao_yaoce_yitiji-flag_diubao_yaoce_link)*150,'--');
plot(cfk_ml,'r');
plot([0,len_tele],[97,97],'linestyle','--');
plot([0,len_tele],[113,113],'linestyle','--');
legend('一体机丢包','指令','0x61大小功率','0x71数据装订','Location','NorthEastOutside');
title('一体机丢包与帧计数(链路、指令)');
ylim([-0.3 155]);
hold off;
print(img,'-dpng','-r800',filename+'/6丢包帧计数与指令.png');
savefig(img,filename+'/6纯一体丢包帧计数与指令.fig');
%% 纯网络丢包
clf(img);
hold on;
plot
"