/*2013-01-18T16:22:30-01:00*/

/********************************************************************
 * codeur_gray.c
 * 
 * generated by: plcgen 2.3.253
 ********************************************************************/

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

#include "codeur_gray.h"

#include <math.h>

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

CB_Index codeur_gray__num = 0;
CB_Mem_Int *codeur_gray_entreeBinaire;
CB_Mem_Bool *codeur_gray_figeageCodeur;
CB_Mem_Bool *codeur_gray_sortieBit15;
CB_Mem_Bool *codeur_gray_sortieBit14;
CB_Mem_Bool *codeur_gray_sortieBit13;
CB_Mem_Bool *codeur_gray_sortieBit12;
CB_Mem_Bool *codeur_gray_sortieBit11;
CB_Mem_Bool *codeur_gray_sortieBit10;
CB_Mem_Bool *codeur_gray_sortieBit09;
CB_Mem_Bool *codeur_gray_sortieBit08;
CB_Mem_Bool *codeur_gray_sortieBit07;
CB_Mem_Bool *codeur_gray_sortieBit06;
CB_Mem_Bool *codeur_gray_sortieBit05;
CB_Mem_Bool *codeur_gray_sortieBit04;
CB_Mem_Bool *codeur_gray_sortieBit03;
CB_Mem_Bool *codeur_gray_sortieBit02;
CB_Mem_Bool *codeur_gray_sortieBit01;
CB_Mem_Bool *codeur_gray_sortieBit00;
CB_Mem_Int *codeur_gray_sortieMot;
CB_Mem_Bool *codeur_gray_bitvalide;
CB_Mem_Int *codeur_gray_valeurtest;
CB_Mem_Int *codeur_gray_indice;
CB_Mem_Float *codeur_gray_rang;
CB_Mem_Int *codeur_gray_rang1;
CB_Mem_Int *codeur_gray_valeurentree;
CB_Mem_Bool *codeur_gray_d_forcage;
CB_Mem_Int *codeur_gray_v_d_forcage;

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

#define entreeBinaire (codeur_gray_entreeBinaire->CB_current_value)
#define figeageCodeur (codeur_gray_figeageCodeur->CB_current_value)
#define sortieBit15 (codeur_gray_sortieBit15->CB_current_value)
#define sortieBit14 (codeur_gray_sortieBit14->CB_current_value)
#define sortieBit13 (codeur_gray_sortieBit13->CB_current_value)
#define sortieBit12 (codeur_gray_sortieBit12->CB_current_value)
#define sortieBit11 (codeur_gray_sortieBit11->CB_current_value)
#define sortieBit10 (codeur_gray_sortieBit10->CB_current_value)
#define sortieBit09 (codeur_gray_sortieBit09->CB_current_value)
#define sortieBit08 (codeur_gray_sortieBit08->CB_current_value)
#define sortieBit07 (codeur_gray_sortieBit07->CB_current_value)
#define sortieBit06 (codeur_gray_sortieBit06->CB_current_value)
#define sortieBit05 (codeur_gray_sortieBit05->CB_current_value)
#define sortieBit04 (codeur_gray_sortieBit04->CB_current_value)
#define sortieBit03 (codeur_gray_sortieBit03->CB_current_value)
#define sortieBit02 (codeur_gray_sortieBit02->CB_current_value)
#define sortieBit01 (codeur_gray_sortieBit01->CB_current_value)
#define sortieBit00 (codeur_gray_sortieBit00->CB_current_value)
#define sortieMot (codeur_gray_sortieMot->CB_current_value)
#define bitvalide (codeur_gray_bitvalide->CB_current_value)
#define valeurtest (codeur_gray_valeurtest->CB_current_value)
#define indice (codeur_gray_indice->CB_current_value)
#define rang (codeur_gray_rang->CB_current_value)
#define rang1 (codeur_gray_rang1->CB_current_value)
#define valeurentree (codeur_gray_valeurentree->CB_current_value)
#define d_forcage (codeur_gray_d_forcage->CB_current_value)
#define v_d_forcage (codeur_gray_v_d_forcage->CB_current_value)


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


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

int _bibliotheque_epo__codeur_gray_init(void)
{
	self.Bool+=2;
	self.Int+=5;
	self.Float+=1;


	return 0;
}


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

int bibliotheque_epo__codeur_gray(void)
{
	if (exec_term_node(self_num)) {

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

		codeur_gray_bitvalide = self.Bool+0;
		codeur_gray_valeurtest = self.Int+0;
		codeur_gray_indice = self.Int+1;
		codeur_gray_rang = self.Float+0;
		codeur_gray_rang1 = self.Int+2;
		codeur_gray_valeurentree = self.Int+3;
		codeur_gray_d_forcage = self.Bool+1;
		codeur_gray_v_d_forcage = self.Int+4;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Capteurs							*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module represente le comportement					*/
			/*   d un codeur Gray							*/
			/* -----------------------------------------------------------------	*/

			/* -----------------------------------------------------------------	*/
			/* Traitement defaut forcage						*/
			/* -----------------------------------------------------------------	*/
			if (d_forcage) valeurentree = v_d_forcage;
			else valeurentree = entreeBinaire;


			/* -----------------------------------------------------------------	*/
			/* Gestion du codeur								*/
			/* -----------------------------------------------------------------	*/
			if (d_forcage) valeurentree = v_d_forcage;
			else valeurentree = entreeBinaire;

			if (!figeageCodeur) {
				if(valeurentree < 65535) {
					sortieMot = 0;
					for (indice = 0;indice<=15;indice++) {
						rang = pow(2.0,(2.0+indice));
						rang1 = rang;
						valeurtest = valeurentree % rang1;
						bitvalide = 0;
						if (  (( rang /4) <= valeurtest  ) && ( valeurtest  < ( rang * 3 /4 ) )  ) bitvalide = 1;
						switch (indice) {
							case 0:
								sortieBit00 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,0.0);
								break;
							case 1:
								sortieBit01 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,1.0);
								break;
							case 2:
								sortieBit02 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,2.0);
								break;
							case 3:
								sortieBit03 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,3.0);
								break;
							case 4:
								sortieBit04 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,4.0);
								break;
							case 5:
								sortieBit05 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,5.0);
								break;
							case 6:
								sortieBit06 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,6.0);
								break;
							case 7:
								sortieBit07 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,7.0);
								break;
							case 8:
								sortieBit08 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,8.0);
								break;
							case 9:
								sortieBit09 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,9.0);
								break;
							case 10:
								sortieBit10 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,10.0);
								break;
							case 11:
								sortieBit11 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,11.0);
								break;
							case 12:
								sortieBit12 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,12.0);
								break;
							case 13:
								sortieBit13 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,13.0);
								break;
							case 14:
								sortieBit14 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,14.0);
								break;
							case 15:
								sortieBit15 = bitvalide;
								if (bitvalide) sortieMot = sortieMot +pow(2.0,15.0);
								break;
						}
					}
				}
				else {
					sortieBit00 = 0;
					sortieBit01 = 0;
					sortieBit02 = 0;
					sortieBit03 = 0;
					sortieBit04 = 0;
					sortieBit05 = 0;
					sortieBit06 = 0;
					sortieBit07 = 0;
					sortieBit08 = 0;
					sortieBit09 = 0;
					sortieBit10 = 0;
					sortieBit11 = 0;
					sortieBit12 = 0;
					sortieBit13 = 0;
					sortieBit14 = 0;
					sortieBit15 = 0;
					sortieMot = 0;
				}
			}
		}

		CB_post_bool(codeur_gray_sortieBit15);
		CB_post_bool(codeur_gray_sortieBit14);
		CB_post_bool(codeur_gray_sortieBit13);
		CB_post_bool(codeur_gray_sortieBit12);
		CB_post_bool(codeur_gray_sortieBit11);
		CB_post_bool(codeur_gray_sortieBit10);
		CB_post_bool(codeur_gray_sortieBit09);
		CB_post_bool(codeur_gray_sortieBit08);
		CB_post_bool(codeur_gray_sortieBit07);
		CB_post_bool(codeur_gray_sortieBit06);
		CB_post_bool(codeur_gray_sortieBit05);
		CB_post_bool(codeur_gray_sortieBit04);
		CB_post_bool(codeur_gray_sortieBit03);
		CB_post_bool(codeur_gray_sortieBit02);
		CB_post_bool(codeur_gray_sortieBit01);
		CB_post_bool(codeur_gray_sortieBit00);
		CB_post_int(codeur_gray_sortieMot);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 2;
	self.Int += 5;
	self.Float += 1;

	return 0;
}

