function [hh,mm,ss,f,qmc,err]=pos_read_fun(date0,hours,data_path,code_out);
% Считывание данных POS-1 из исходных часовых файлов типа Fdd_hhmm.MMM
% и удаление единичных выбросов и данных с кодом ошибки ~=80
%
%               [hh,mm,ss,f,qmc,err]=pos_read_fun(date0,hours[,data_path[,code_out]]);
%
% date0 - дата (string) в формате 'DD.MM.YYYY'
% hours - интервал времени (UT), для которого требуется извлечь данные.
% data_path     - каталог с суточными ZIP-архивами. Если не указан или
%                   пустой, то по умолчанию = 'd:\users\data\pos-1\'
% code_out      - вывод имен файлов =1 (по умолчанию),
%                   без вывода имен на экран =0
%
% hh mm ss  - час., мин., сек. моментов измерений
% f         - модуль поля F (нТл)
% qmc       - параметр QMC (нТл)
% err       - код ошибки

% 01.05.2010    - Хомутов С.Ю. (адаптировано из pos_read_ini.m)
%               - консольное UNZIP.exe заменено на матлабовскую unzip()
%               - данные считываются для заданного интервала времени
%               - для MatLab вер.7 и выше используетcz textscan()
%
% 23.06.2010    - предусмотрен параметр, управляющий выводом на экран
%                   имен обрабатываемых файлов
%
% 05.08.2010    - при полном отсутствии данных за сутки выход по ошибке
%                   error() замен на return 
%                   с hh=0; mm=0; ss=0; f=NaN; qmc=NaN; err=NaN; 
% 05.03.2012    - параметр err считывается как строка, accept_code тоже
%                   задаются как строки вида ['80'; '84']

POS_length_rec=62;      % длина записи в файл POS-1, включая CR и LF
pos_fmt='%d:%d:%d %f %f %f %d %d'; % формат записи данных POS
ML_ver=version;
% допустимое отклонение единичного выброса (импульса), в нТл
max_diff=4;
% допустимые коды ошибок в форматах [80], [80 84] и т.д.
accept_code=['80'; '84'];

if nargin<3,
    data_path='d:\users\data\pos-1\';   % каталог с архивами часовых файлов
    code_out=1;                         % вывод имен файлов на экран
elseif nargin<4,
    code_out=1;                         % вывод имен файлов на экран
end
if isempty(data_path),
    data_path='d:\users\data\pos-1\';   % каталог с архивами часовых файлов
end
temp_dir='data_hour';    % каталог для извлечения часовых файлов из ZIP-архивов

T0=my_datenum(date0);
[year,mon,day]=datevec(T0);
T0_str=datestr(T0);
t_str=datestr(datenum(year,mon,day,hours,0,0),0);
th1=fix(hours(1)); th2=fix(hours(2));   % начальный и конечный час

% Извлекаем часовые файлы из суточного архива
file_zip=[data_path date0(7:10) '_' date0(4:5)...
                 '\pos_' date0(4:5) date0(1:2) '.zip'];
if ~exist(file_zip),
    disp('!!! Нет данных для POS-1 !!!')
    hh=0; mm=0; ss=0; f=NaN; qmc=NaN; err=NaN;
    return
end
unzip(file_zip,temp_dir)
% Считываем список файлов за нужную дату
D=dir([temp_dir '\F' date0(1:2) '*.' T0_str(4:6)]);
file=char(D.name);

% Выбираем файлы для часов в заданных пределах
kf=find(ismember(str2num(file(:,5:6)),(th1:th2)'));
if isempty(kf), 
%     error('!!! Нет данных для POS-1 !!!') 
    disp('!!! Нет данных для POS-1 !!!')
    hh=0; mm=0; ss=0; f=NaN; qmc=NaN; err=NaN;
    return
end
file=sortrows(file(kf,:)); DD=D(kf);
n_file=length(DD);   % кол-во требуемых файлов

% контроль формата записи (по длине строки)
n_rec=0;
for kf=1:n_file,
    if rem(DD(kf).bytes,POS_length_rec)~=0,
        error(['Ошибка формата записи в файле -> ' file(kf,:)]);
    end
    n_rec=n_rec+DD(kf).bytes/POS_length_rec;   % кол-во записей в файлах
end

% инициализация массивов
hh=zeros(n_rec,1); mm=zeros(n_rec,1); ss=zeros(n_rec,1);
f=zeros(n_rec,1); qmc=zeros(n_rec,1); err=zeros(n_rec,1);

n1=0;
for kf=1:n_file,
    if code_out==1, disp(file(kf,:)), end
    D=dir([temp_dir '\' file(kf,:)]);
    n_rec=D.bytes/POS_length_rec;        % кол-во записей в файле
    fid=fopen([temp_dir '\' file(kf,:)],'r');
    tmp=fread(fid,[POS_length_rec, n_rec]);% считываем бинарно
    tmp=char(tmp');                         % превращаем в символьный массив
    n2=n1+n_rec;
    hh(n1+1:n2)=str2num(tmp(:,38:39));
    mm(n1+1:n2)=str2num(tmp(:,41:42));
    ss(n1+1:n2)=str2num(tmp(:,44:45));
    f(n1+1:n2)=str2num(tmp(:,1:8))/1000;
    qmc(n1+1:n2)=str2num(tmp(:,12:17))/1000;
    err(n1+1:n2)=str2num(tmp(:,23:24));
    n1=n2;
    fclose(fid);
end

thp=dms_deg(hh,mm,ss);

hh=hh(:); mm=mm(:); ss=ss(:); f=f(:); err=err(:); qmc=qmc(:);

% контроль времени в файлах данных POS-1
k=find(diff(thp)<=0);   % indeces of false T
if length(k)~=0,
   disp('!!! Ошибка времени в данных POS-1 !!!')
   for kk=1:length(k),
      disp('-----------> смотри здесь ошибку таймера:')
      [hh,mm,ss,str]=deg_dms([thp(k(kk):k(kk)+2)]);
      disp(str)
   end
   error('!!! Нужно исправить исходные данные !!!')
end

f=pos_correct_all(f,num2str(err),thp,max_diff,accept_code);
% pos=[hh mm ss f qmc err];
