% Creating an output structure similar to the input
%OutputPort1 = InputPort1;
% Defining the parameter if applicable
%Param = Parameter0;
if strcmp(InputPort1.TypeSignal, 'Binary')
    x=1;
    OutputPort1 = InputPort2;% pour dire à la machine que la sortie est du même type que l'entrée 2. En réfléchissant, le générateur de bits de optisystem sert a rien.. bref, à vérifier...
    t_data=randint(1,960);
   % t_data=InputPort1.Sequence;
    taillesequence = length(t_data);
%% ce que moi j'ai fait, j'ai envoyé des bits depuis optisystem mais je génère mes bits dans matlab aussi. et je calcule mon TEB dans matlab. 
%% donc mes bits générés dans optisystem ne me servent à rien. Donc je me
%% sert juste des composants optiques de optisystem mais tous mes calculs
%% se font dans matlab
if (taillesequence==960)
%Codage de données
% Mes données générées ont été divisé en 100 vecteurs uniligne de taille 96
% apelle data
% data_tosend contient les valeurs qui seront envoyés à ma ligne de
% transmission
data_tosend=[];%a la place
        for d=1:10;
        data=t_data(x:x+95);
        x=x+96;
        k=3;
        n=6;
        s1=size(data,2);  % Size of input matrix cela fait 96 utiliser length(data) c'est un vecteur
        % s1 est la taille de mon data
        j=s1/k;% cela fait 32


        %% Juste pour faire la convolution des donnees

        % Convolutionally encoding data 
        constlen=7;
        codegen = [171 133];    % Polynomial
        trellis = poly2trellis(constlen, codegen);
        codedata = convenc(data, trellis);
        % codedata est le data convolutionne
        %%
        %Interleaving coded data
        %Imbrication du codedata. Le codedata devient intlvddata
        s2=size(codedata,2); % s2 est la taille de mon codedata.Il est de 192.deux fois la taille de s1
        j=s2/4;
        matrix=reshape(codedata,j,4);
        intlvddata = matintrlv(matrix',2,2)'; % Interleave.
        intlvddata=intlvddata'; % ici on obtient une matrice de taille (4,48)

        %% Transforme les donnees binaires en donnees decimaux
        % Binary to decimal conversion

        dec=bi2de(intlvddata','left-msb'); % ici on obtient un vecteur composé de nombres decimaux de taille 48
        %%
        %%Je fais une modulation 16-QAM. Il prends en entrée mes donnees decimaux
        %%et me sort des nombres complexes
        %16-QAM Modulation
        M=16;
        y = qammod(dec,M);
        %scatterplot(y); % cela trace la constellation de mon y

        %%
        %%
        % Pilot insertion

        lendata=length(y);
        pilt=3+3j;  % juste un nombre complexe
        nofpits=4; % juste un nombre au hasard

        k=1;
        for i=(1:13:52)% i prends les valeurs 1,14,27,40
            pilt_data1(i)=pilt;

            for j=(i+1:i+12);
                pilt_data1(j)=y(k); % y(k) etait un nombre complexe de taille 48
                k=k+1;
            end
        end
        % on transpose le vecteur pilt_data1. On obtient tjrs un nombre complexe de
        % taille 52
        pilt_data1=pilt_data1';   % size of pilt_data =52
        pilt_data(1:12)=pilt_data1(1:12);    % upsizing to 64 modification de 52 a 12
        pilt_data(13:64)=pilt_data1(1:52);   % upsizing to 64

        for i=1:52

            pilt_data(i+6)=pilt_data1(i); % on recopie pilt_data1 dans plit_data en le decalant de 6 

        end
        % A cette etape j'ai mon pilt_data qui est ma donnee sur laquelle je ferai
        % mon ifft. Remarquons que pilt_data est un nombre complexe de taille 64

        %%
        % Transformee de fourier inverse appliquee à pilt_data transposée
        % IFFT

        ifft_sig=ifft(pilt_data',64);
        %%
        % J'ajoute l'extension cyclique
        % Adding Cyclic Extension

        cext_data=zeros(80,1);
        cext_data(1:16)=ifft_sig(49:64);
        for i=1:64

            cext_data(i+16)=ifft_sig(i);

        end
        % cext_data contient au debut les 16 premiers elts de ifft_sig et à la
        % suite ifft_sig
        % cext_data est mes donnees auxquels on a effectue certaines calculs,
        % appliquee la transformee de fourier inverse et ajoute le code cyclique

        %%
        % je cree deux tableaux de taille 80 contenant la partie reelle et la
        % partie imaginaire de mes donnees transformees cext_data
        %Je cree encore un autre tableau regroupant les valeurs a envoyer à mon LTE
             Fe  =  8e3;
             N  =  32;
             f=2600;
             t  =  (0:N-1)/Fe;
             val=2*pi*f*t;
             a=real(cext_data)*cos(val);
             b=imag(cext_data)*(-sin(val));
             data_send=a+b;
             data_tosend=[data_tosend; data_send];
        end
        % Je transforme la matrice à envoyer en un vecteur uniligne de
        % taille 800*32=4096000
        data_transmis=reshape(data_tosend,1,25600);
    % Je dois réaffecter les valeurs de data_tosend à la sortie Output
            %     t_data=InputPort1.Sequence;
            %     taillesequence = length(t_data);
            %%
            % LE nombre d'échantillons à envoyer sur la fibre doit être une
            % puissance de 2. la de 2 imédiatement supérieur à 25600 est 32768
            % donc je vais completer ta matrice data_tosend par des zéros
            for i=(1:32768)
                if i <= 25600
                data_transmiss(i)=data_transmis(i);
                end
                if i > 25600
                 data_transmiss(i)=0;   
                end
                
            end
              
               OutputPort1.Sampled.Signal=InputPort2.Sampled.Signal.*data_transmiss;
              
end

end