FUNCTION FC221 : VOID

VAR_OUTPUT
    CAMERA1    :   CAMERA;
    CAMERA2    :   CAMERA;
    CAMERA3    :   CAMERA;
END_VAR

VAR
    s_Buffer    :   STRING[16];
    i           :   INT;
    sbuf1       :   STRING[6];
    sbuf2       :   STRING[6];  
    b_data      :   BOOL; 
END_VAR

 
CAMDATA.compteur        :=0; 
CAMDATA.n_Step          :=0; 
CAMDATA.n_loop          :=0;
CAMDATA.ncurrent_loop   :=0; 
CAMDATA.n_cam           :=0;
DEBUG.n_indexResult     :=0;
DEBUG.n_indexCam        :=0;
DEBUG.n_indexROI        :=0;
DEBUG.n_indexCurrLoop   :=0;
DEBUG.n_indexCurrCam:=0;
i                       :=0;
TAMPON.SBUFFER          :='';
sbuf1                   :='';
sbuf2                   :='';
s_Buffer                :='';
b_data:=false;
                 

// Intrerpéter ce qui provient du buffer BUFFER.BUFTAB[0..63] depuis PC
// Exemple de trame 1,3,100,95.57,73.44,3,1,79.21;!
// 1        : Caméra 1
// 3        : 3 ROIs pour cette caméra
// 100      : 100% de correspondance pour la position du bouchon
// 95.57    : 95.57% de correspondance pour le niveau de liquide
// 73.44    : 73.44% de correspondance pour la pureté et couleur du liquide
// 3        : Caméra 3
// 1        : 1 ROI pour cette caméra
// 79.21    : 79,21% de correspondance pour la propreté du bouchon
// ;        : Fin de trame complète (soit 3B en ASCII)
// ,        : Séparateur (Soit 2C en ASCII)

WHILE BUFFER.BUFTAB[CAMDATA.compteur] <> '$3B' AND CAMDATA.compteur < 64 DO 
        IF BUFFER.BUFTAB[CAMDATA.compteur] <> '$2C' THEN
            s_Buffer        := CONCAT(IN1:=s_Buffer,IN2:=BUFFER.BUFTAB[CAMDATA.compteur]);
            TAMPON.SBUFFER  := s_Buffer;
            b_data:=true;
        ELSE    
            // Décorticage des donnees du buffer.
            s_Buffer                            :=TAMPON.SBUFFER; // Rappel du tampon dans s_buffer car s_Buffer est une variable temporaire
            DEBUG.s_Result[DEBUG.n_indexResult] :=s_Buffer;
            DEBUG.n_indexResult                 :=DEBUG.n_indexResult+1;
            CASE CAMDATA.n_Step OF
            0 :       // ici on stocke le numero de camera  
                      CAMDATA.n_cam             := STRING_TO_INT(s_Buffer);
                      CAMDATA.n_Step            := 1;
                      DEBUG.n_camList[DEBUG.n_indexCam]:=CAMDATA.n_cam;
                      DEBUG.n_indexCam:=DEBUG.n_indexCam+1;
            1 :       // ici on stocke le nombre de ROI
                      CAMDATA.ncurrent_loop     := 0;
                      CAMDATA.n_loop            :=0;
                      CAMDATA.n_loop            := STRING_TO_INT(s_Buffer);
                      CAMDATA.n_Step            := 2;
                      DEBUG.n_ROIList1[DEBUG.n_indexROI]:=CAMDATA.n_loop;
                      DEBUG.n_indexROI:=DEBUG.n_indexROI+1;        
                      DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop]:=0;
                      DEBUG.n_indexCurrLoop:=DEBUG.n_indexCurrLoop+1;
            2 :       // ici on stocke les valeurs des ROIs        
                        DEBUG.n_MaxCam :=DEBUG.n_camList[DEBUG.n_indexCam-1];
                        DEBUG.n_CurrCamList[DEBUG.n_indexCurrCam]:=DEBUG.n_camList[DEBUG.n_indexCam-1];
                        DEBUG.n_indexCurrCam:=DEBUG.n_indexCurrCam+1;
                        CASE DEBUG.n_MaxCam OF
                             1 : // ici on rempli la liste de valeur pour camera 1
                                 CAMERA1.id       :=DEBUG.n_camList[DEBUG.n_indexCam-1];
                                 CAMERA1.nb_ROI   :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
                                 CAMERA1.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
                             2 : // ici on rempli la liste de valeur pour camera 2
                                 CAMERA2.id       :=DEBUG.n_camList[DEBUG.n_indexCam-1];
                                 CAMERA2.nb_ROI   :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
                                 CAMERA2.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
                             3 : // ici on rempli la liste de valeur pour camera 3 
                                 CAMERA3.id       :=DEBUG.n_camList[DEBUG.n_indexCam-1];
                                 CAMERA3.nb_ROI   :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
                                 CAMERA3.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
                        END_CASE;
                        DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]:=DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]+1;
                        IF DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1] >= DEBUG.n_ROIList1[DEBUG.n_indexROI-1]  THEN
                            CAMDATA.n_Step          :=0; 
                        END_IF; 
                END_CASE ;      
            // le buffer est utilise, on le vide.
            s_Buffer := '';
            b_data:=false;
    END_IF;
    CAMDATA.compteur := CAMDATA.compteur  + 1 ;
END_WHILE;

IF b_data=true THEN
     DEBUG.n_CurrCamList[DEBUG.n_indexCurrCam]:=DEBUG.n_camList[DEBUG.n_indexCam-1];
     DEBUG.n_indexCurrCam:=DEBUG.n_indexCurrCam+1;
     CASE DEBUG.n_camList[DEBUG.n_indexCam-1] OF
          1 : // ici on rempli la liste de valeur pour camera 1
             CAMERA1.id        :=DEBUG.n_camList[DEBUG.n_indexCam-1];
             CAMERA1.nb_ROI    :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
             CAMERA1.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
          2 : // ici on rempli la liste de valeur pour camera 2
             CAMERA2.id        :=DEBUG.n_camList[DEBUG.n_indexCam-1];
             CAMERA2.nb_ROI    :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
             CAMERA2.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
          3 : // ici on rempli la liste de valeur pour camera 3 
              CAMERA3.id       :=DEBUG.n_camList[DEBUG.n_indexCam-1];
              CAMERA3.nb_ROI   :=DEBUG.n_ROIList1[DEBUG.n_indexROI-1];
              CAMERA3.values[DEBUG.n_CurrLoopList[DEBUG.n_indexCurrLoop-1]]:=STR_TO_REAL(s_Buffer);
     END_CASE;
   END_IF;

END_FUNCTION
