function [f,T,qmc,err,Lon,Lat]=pos_read_pm(file,data_path,rec_format);
% Считывание данных POS-1 из файлов, записанных программой POS Manager
%
%               [f[,T[,qmc,err[,Lon,Lat]]]]=pos_read_pm(file[,data_path,[rec_format]]);
%
% file  - имя файла POS Manager
% data_path - путь к файлу данных.
%             Если data_path=[], то имя файла содержит полный путь
%             По умолчанию - "tmp\"
% rec_format - строка, описывающая формат записи в файле, например
%               '%d %d %2c %8c %2d:%2d:%2d,%2d'. Если не задана, выбирается
%               два возможных формата:
%               короткий - '%d %d %2c %8c %2d:%2d:%2d,%2d'
%               длинный  - '%d %d %2c %8c %2d:%2d:%2d,%2d %d %d %2с'
%
% f     - модуль поля F в нТл, если NARGOUT>1, и
%         матрица [year mon day hh mm ss f qmc], если NARGOUT=1
% T     - сериальная дата
% qmc   - QMC (нТл)
% err   - код ошибок (строка из двух символов)
% Lon   - долгота (в град)
% Lat   - широта (в град)
%

% ----- короткий формат
% 57610005 00019 80 02.17.12 11:48:24,00
% 57610064 00018 80 02.17.12 11:48:27,00

% Длинный (полевой) формат
% 57577042 00016 80 02.17.12 16:56:24,00 0000000000 0000000000 OK
% 57576992 00015 80 02.17.12 16:56:27,00 0000000000 0000000000 OK

% 19.08.2009    - Хомутов С.Ю.
% 19.02.2012    - модифицировано под считывание формата с длинной строкой
%               (POS с GPS)
% 03.03.2012    - формат отпределяется автоматически
% 17.03.2012    - считываются координаты, если длинный формат
% 27.03.2012    - для MatLab вер.6 для считывания используется textread()
% 13.02.2013    - при формировании момента измерений POS учитывается
%               дробная часть секунд (для MatLab версии >7)
% 20.06.2018    - расширена для Matlab версии 9
% 17.07.2021    - если файла нет, выводятся NaN

% формируем полный путь к файлу данных
if nargin<2,            % папка с данными по умолчанию
    data_path='tmp\';
end
if isempty(data_path),  % путь указан в имени файла
    file_name=file;
else
    file_name=[data_path file];
end
if ~exist(file_name,'file'),
    disp(['!!! File ' file_name ' not found !!!'])
    f=NaN; T=NaN; qmc=NaN; err=NaN; Lon=NaN; Lat=NaN;
    return
end

if exist('rec_format','var'),   % формат записи задан
    pos_pm_fmt=rec_format;
else                            % определяем формат
    fid=fopen(file_name,'rt');
    str=fgets(fid);
    fclose(fid);
    POS_length_rec=length(str)+1;
    DD=dir(file_name);
    if rem(DD.bytes/POS_length_rec,1)~=0,
        error('!!! Ошибка формата записи в файле POS !!!');
    end
    switch POS_length_rec,
        case 40,                % короткий формат
            pos_pm_fmt='%d %d %2c %8c %2d:%2d:%2d,%2d';
        case 65,                % длинный формат
%             pos_pm_fmt='%d %d %2c %8c %2d:%2d:%2d,%2d %f %f %2c';
            pos_pm_fmt='%d %d %2c %8c %2d:%2d:%2d,%2d %10c %10c %2c';
        otherwise
            error('!!! Неизвестный формат записи файла POS !!!')
    end
end

% Считываем данные в зависимости от версии MATLAB
MLver=version;  % версия MatLab

if str2num(MLver(1))>=7,   % 7-я версия, используем textscan()
    % считываем данные в cell-массив по формату
    fid=fopen(file_name,'rt');
        str=char(fread(fid));
    fclose(fid);
    C=textscan(str,pos_pm_fmt);
    % данные
    f=double(cell2mat(C(1)))/1000;
    qmc=double(cell2mat(C(2)))/1000;
    err=char(C(3));
    date_str=char(C(4));
    T=datenum(str2num(date_str(1,7:8))+2000,...
              str2num(date_str(1,1:2)),...
              str2num(date_str(1,4:5)),...
              double(cell2mat(C(5))),...
              double(cell2mat(C(6))),...
              double(cell2mat(C(7)))+double(cell2mat(C(8)))/100);
else
    [f,qmc,err,DDD,hh,mm,ss,ssf]=textread(file_name,pos_pm_fmt);
    f=f/1000; qmc=qmc/1000;
    T=datenum(str2num(DDD(:,7:8))+2000,str2num(DDD(:,1:2)),...
        str2num(DDD(:,4:5)),hh,mm,ss);
end

% контроль времени в файлах данных POS-1
k=find(diff(T)<=0);   % indeces of false T
if length(k)~=0,
   disp('!!! Ошибка времени в данных POS-1 !!!')
    disp(datestr(T(k)))
    error('!!! Нужно исправить исходные данные !!!')
end

% заполняем поля координат
switch POS_length_rec,
    case 40,                % короткий формат
        Lon=ones(length(f),1)*NaN; Lat=Lon;
    case 65,                % длинный формат
        str=char(C(9));
        Lon=str2num(str(:,1:3))+str2num(str(:,4:10))/100000/60;
        str=char(C(10));
        Lat=str2num(str(:,1:3))+str2num(str(:,4:10))/100000/60;
    otherwise
        error('!!! Неизвестный формат записи файла POS !!!')
end

%f=pos_correct_all(f,err,thp,7);

% для возможной совместимости со старыми программами
if nargout==1,
    f=[datevec(T) f qmc];
end
