/*2011-01-03T15:23:23-01:00*/

/********************************************************************
 * creation_produit_cov.c
 * 
 * generated by: plcgen 2.1.201
 ********************************************************************/

#include "cb_comp.h"
#include "cb_covs.h"
#include "iec_1131.h"

#include "creation_produit.h"

#include "bibliotheque_epo/functional/caisse/exec/caisse.h"


/**************************** Variables *****************************/

CB_Index creation_produit__num = 0;
CB_Mem_Int *creation_produit_status_act_prod;
CB_Mem_Float *creation_produit_m11;
CB_Mem_Float *creation_produit_m12;
CB_Mem_Float *creation_produit_m13;
CB_Mem_Float *creation_produit_m14;
CB_Mem_Float *creation_produit_m21;
CB_Mem_Float *creation_produit_m22;
CB_Mem_Float *creation_produit_m23;
CB_Mem_Float *creation_produit_m24;
CB_Mem_Float *creation_produit_m31;
CB_Mem_Float *creation_produit_m32;
CB_Mem_Float *creation_produit_m33;
CB_Mem_Float *creation_produit_m34;
CB_Mem_Float *creation_produit_m41;
CB_Mem_Float *creation_produit_m42;
CB_Mem_Float *creation_produit_m43;
CB_Mem_Float *creation_produit_m44;
CB_Mem_Bool *creation_produit_bpArrivee;
CB_Mem_Bool *creation_produit_presenceProduit;
CB_Mem_Int *creation_produit_idProd;
CB_Mem_Int *creation_produit_cptProd;
CB_Mem_Float *creation_produit_tempsAAttendre;
CB_Mem_Int *creation_produit_oldIdProd;
CB_Mem_Float *creation_produit_vitesseGravite;
CB_Mem_Int *creation_produit_nbProdACreer;
CB_Mem_Bool *creation_produit_typeImpulsionnel;
CB_Mem_Float *creation_produit_tempsImpulsion;
CB_Mem_Bool *creation_produit_produitsAlignesEnZ;
CB_Mem_Bool *creation_produit_produitsAlignesEnY;
CB_Mem_Bool *creation_produit_produitsAlignesEnX;

/**************************** Variables *****************************/

#define status_act_prod (creation_produit_status_act_prod->CB_current_value)
#define m11 (creation_produit_m11->CB_current_value)
#define m12 (creation_produit_m12->CB_current_value)
#define m13 (creation_produit_m13->CB_current_value)
#define m14 (creation_produit_m14->CB_current_value)
#define m21 (creation_produit_m21->CB_current_value)
#define m22 (creation_produit_m22->CB_current_value)
#define m23 (creation_produit_m23->CB_current_value)
#define m24 (creation_produit_m24->CB_current_value)
#define m31 (creation_produit_m31->CB_current_value)
#define m32 (creation_produit_m32->CB_current_value)
#define m33 (creation_produit_m33->CB_current_value)
#define m34 (creation_produit_m34->CB_current_value)
#define m41 (creation_produit_m41->CB_current_value)
#define m42 (creation_produit_m42->CB_current_value)
#define m43 (creation_produit_m43->CB_current_value)
#define m44 (creation_produit_m44->CB_current_value)
#define bpArrivee (creation_produit_bpArrivee->CB_current_value)
#define presenceProduit (creation_produit_presenceProduit->CB_current_value)
#define idProd (creation_produit_idProd->CB_current_value)
#define cptProd (creation_produit_cptProd->CB_current_value)
#define tempsAAttendre (creation_produit_tempsAAttendre->CB_current_value)
#define oldIdProd (creation_produit_oldIdProd->CB_current_value)
#define vitesseGravite (creation_produit_vitesseGravite->CB_current_value)
#define nbProdACreer (*((short *)&(creation_produit_nbProdACreer->CB_current_value) + ALIGN_OFFSET_SHORT))
#define typeImpulsionnel (creation_produit_typeImpulsionnel->CB_current_value)
#define tempsImpulsion (creation_produit_tempsImpulsion->CB_current_value)
#define produitsAlignesEnZ (creation_produit_produitsAlignesEnZ->CB_current_value)
#define produitsAlignesEnY (creation_produit_produitsAlignesEnY->CB_current_value)
#define produitsAlignesEnX (creation_produit_produitsAlignesEnX->CB_current_value)


/************************ Components offsets ************************/


/********************* Initialization function **********************/

int _bibliotheque_epo__creation_produit_init(void)
{
	(self.Float+16)->CB_current_value = 10.0; /*tempsAAttendre*/
	(self.Float+17)->CB_current_value = 0.1; /*vitesseGravite*/
	*((short *)&((self.Int+4)->CB_current_value) + ALIGN_OFFSET_SHORT) = 1; /*nbProdACreer*/
	(self.Bool+2)->CB_current_value = 1; /*typeImpulsionnel*/
	(self.Float+18)->CB_current_value = 10.0; /*tempsImpulsion*/
	(self.Bool+3)->CB_current_value = 1; /*produitsAlignesEnZ*/
	self.Bool+=6;
	self.Int+=5;
	self.Float+=19;


	return 0;
}


/************************ Behavior function *************************/

int bibliotheque_epo__creation_produit(void)
{
	static char *__comp_name = "bibliotheque_epo.creation_produit";
	if (exec_term_node(self_num)) {

		/*********************** Internals variables ************************/

		creation_produit_status_act_prod = self.Int+0;
		creation_produit_m11 = self.Float+0;
		creation_produit_m12 = self.Float+1;
		creation_produit_m13 = self.Float+2;
		creation_produit_m14 = self.Float+3;
		creation_produit_m21 = self.Float+4;
		creation_produit_m22 = self.Float+5;
		creation_produit_m23 = self.Float+6;
		creation_produit_m24 = self.Float+7;
		creation_produit_m31 = self.Float+8;
		creation_produit_m32 = self.Float+9;
		creation_produit_m33 = self.Float+10;
		creation_produit_m34 = self.Float+11;
		creation_produit_m41 = self.Float+12;
		creation_produit_m42 = self.Float+13;
		creation_produit_m43 = self.Float+14;
		creation_produit_m44 = self.Float+15;
		creation_produit_bpArrivee = self.Bool+0;
		creation_produit_presenceProduit = self.Bool+1;
		creation_produit_idProd = self.Int+1;
		creation_produit_cptProd = self.Int+2;
		creation_produit_tempsAAttendre = self.Float+16;
		creation_produit_oldIdProd = self.Int+3;
		creation_produit_vitesseGravite = self.Float+17;
		creation_produit_nbProdACreer = self.Int+4;
		creation_produit_typeImpulsionnel = self.Bool+2;
		creation_produit_tempsImpulsion = self.Float+18;
		creation_produit_produitsAlignesEnZ = self.Bool+3;
		creation_produit_produitsAlignesEnY = self.Bool+4;
		creation_produit_produitsAlignesEnX = self.Bool+5;

		/********************* Pre-conditions execution *********************/

		/*no Pre-conditions*/

		/************************ Actor Myself init *************************/

		setMyselfFor(self_num);

		/************************ Behavior execution ************************/

		{
			/* -------------------------------------------------------------------------------------------------	*/
			/* Modèle de Comportement Opératif											*/
			/* Catégorie Acteurs													*/
			/* Techniques Nouvelles d'Informatique										*/
			/* Date de révision : Octobre 2002											*/
			/* -------------------------------------------------------------------------------------------------	*/
			/* Ce module représente une Creation de Produit									*/
			/* il est soit :													*/
			/* 	- de type impulsionnel											*/
			/*	- à introduction automatique : création cadencée cycliquement						*/
			/* -------------------------------------------------------------------------------------------------	*/
			int i;
			 
			if (!  typeImpulsionnel) {
				tempsAAttendre += CLOCK_PERIOD / 1000000.0;
				if (presenceProduit) tempsAAttendre = 0.0;
			}
			
			/*	Demande du nouveau produit avec superpositionnement sur le module de création		*/
			/*	Pour éviter des empilements intempestifs de produits, si un produit est déjà présent sur	*/
			/*	 la zone de création, on interdit d'en créer un nouveau 					*/
			
			if ((bpArrivee ||  ((tempsAAttendre>= tempsImpulsion) && ! typeImpulsionnel)) && ! presenceProduit) {
				tempsAAttendre = 0.0;
				for (i=0;i<nbProdACreer;i++) {
					if (produitsAlignesEnX) {
						idProd=prodNew(bibliotheque_epo__caisse, getPositionX(myself), getPositionY(myself), getPositionZ(myself), getSizeX(myself), getSizeY(myself), getSizeZ(myself));
						if (idProd >= 0)
							rotateTo(idProd, getAngleX(myself), getAngleY(myself), getAngleZ(myself), getPositionX(idProd), getPositionY(idProd),getPositionZ(idProd));
						if (i>0) moveRelativeAnotherXBy(idProd, oldIdProd , (getSizeX(myself)*i));
			
						oldIdProd = idProd;
					}
					if (produitsAlignesEnY) {
						idProd=prodNew(bibliotheque_epo__caisse, getPositionX(myself), getPositionY(myself), getPositionZ(myself), getSizeX(myself), getSizeY(myself), getSizeZ(myself));
						if (idProd >= 0)
							rotateTo(idProd, getAngleX(myself), getAngleY(myself), getAngleZ(myself), getPositionX(idProd), getPositionY(idProd),getPositionZ(idProd));
						if (i>0) moveRelativeAnotherXBy(idProd, oldIdProd , (getSizeX(myself)*i));
						oldIdProd = idProd;
					}
					if (produitsAlignesEnZ) {
						idProd=prodNew(bibliotheque_epo__caisse, getPositionX(myself), getPositionY(myself), getPositionZ(myself)+(getSizeZ(myself)*i), getSizeX(myself), getSizeY(myself), getSizeZ(myself));
						if (idProd >= 0)
							rotateTo(idProd, getAngleX(myself), getAngleY(myself), getAngleZ(myself), getPositionX(idProd), getPositionY(idProd),getPositionZ(idProd));
					}
					if (idProd >= 0) {
						cptProd++;
						var(idProd, bibliotheque_epo__caisse__vitesseGravite)=vitesseGravite;
						var(idProd, bibliotheque_epo__caisse__numero)=cptProd;
					}
				}
			}
			
			
			/* 	RAZ info presence produit						 	*/
			presenceProduit=0;
			
			/*	RAZ de la demande manuelle  d'introduction 				*/
			bpArrivee=0;
		}


		/******************** Post-conditions execution *********************/

		/*no Post-conditions*/
	}

	/*************************** self update ****************************/

	self.Bool += 6;
	self.Int += 5;
	self.Float += 19;

	return 0;
}

