/* This file was automatically generated by fcc. Do not modify. */

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

#include "heatpump.h"

/* ------------------------------------------------------------ */

#ifndef min
#define min(a,b) ((a) < (b) ? (a) : (b))
#define max(a,b) ((a) > (b) ? (a) : (b))
#endif

#define FC_IS_F    1
#define FC_ISNOT_F 2
#define FC_IS_C    3
#define FC_ISNOT_C 4
#define FLMEMF_InputLOW 0
#define FLMEMF_InputMED 1
#define FLMEMF_InputHIGH 2
#define FLMEMF_ControlMXHEAT 0
#define FLMEMF_ControlHEAT 1
#define FLMEMF_ControlOFF 2
#define FLMEMF_ControlCOOL 3
#define FLMEMF_ControlMXCOOL 4
static int flmemfunc_subsets[2] = {3,5};
#define FLVAR_Temperature 0
#define FLVAR_OldTemperature 1
#define FLVAR_Control 2
#define FL_NUMVARIABLES 3

/* ------------------------------------------------------------ */

static int    flvariable_set[FL_NUMVARIABLES]; 
static double flvariable_val[FL_NUMVARIABLES]; 
static double flvariable_def[FL_NUMVARIABLES] = {0,0,0};
static double flvarTemperature[3];
static double flvarOldTemperature[3];
static double flvarControl[5];
/* ------------------------------------------------------------ */

static void FL_Initialize(int all)

{
  register int i;

  if (all)
     for (i = 0; i < FL_NUMVARIABLES; i++)
         {
          flvariable_set[i] = 0;

         }

  for (i = 0; i < 3; i++)
      flvarTemperature[i] = 0.0;
  for (i = 0; i < 3; i++)
      flvarOldTemperature[i] = 0.0;
  for (i = 0; i < 5; i++)
      flvarControl[i] = 0.0;
}

/* ------------------------------------------------------------ */

static double FL_MemshipInputLOW(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - -50.000000);
  if ((value >= -50.000000) && (delta <= 50.000000))
     result = 1.0 - delta * 0.020000;
  else
  if (value <= -50.000000)
     result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipInputMED(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 0.000000);
  if ((value >= 0.000000) && (delta <= 50.000000))
     result = 1.0 - delta * 0.020000;
  else
    if ((value <= 0.000000) && (delta <= 50.000000))
       result = 1.0 - delta * 0.020000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipInputHIGH(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 50.000000);
  if (value >= 50.000000)
     result = 1.000000;
  else
    if ((value <= 50.000000) && (delta <= 50.000000))
       result = 1.0 - delta * 0.020000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipControlMXHEAT(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - -30.000000);
  if ((value >= -30.000000) && (delta <= 20.000000))
     result = 1.0 - delta * 0.050000;
  else
  if (value <= -30.000000)
     result = 1.000000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipControlHEAT(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - -10.000000);
  if ((value >= -10.000000) && (delta <= 10.000000))
     result = 1.0 - delta * 0.100000;
  else
    if ((value <= -10.000000) && (delta <= 10.000000))
       result = 1.0 - delta * 0.100000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipControlOFF(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 0.000000);
  if ((value >= 0.000000) && (delta <= 10.000000))
     result = 1.0 - delta * 0.100000;
  else
    if ((value <= 0.000000) && (delta <= 10.000000))
       result = 1.0 - delta * 0.100000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipControlCOOL(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 10.000000);
  if ((value >= 10.000000) && (delta <= 10.000000))
     result = 1.0 - delta * 0.100000;
  else
    if ((value <= 10.000000) && (delta <= 10.000000))
       result = 1.0 - delta * 0.100000;
  return(result);
}

/* ------------------------------------------------------------ */

static double FL_MemshipControlMXCOOL(double value)

{
  double result,delta;

  result = 0.0;
  delta  = fabs(value - 30.000000);
  if (value >= 30.000000)
     result = 1.000000;
  else
    if ((value <= 30.000000) && (delta <= 20.000000))
       result = 1.0 - delta * 0.050000;
  return(result);
}

/* ------------------------------------------------------------ */

void FL_SetheatpumpTemperature(double value)

{
  flvariable_val[FLVAR_Temperature] = value;
}

/* ------------------------------------------------------------ */

void FL_SetheatpumpOldTemperature(double value)

{
  flvariable_val[FLVAR_OldTemperature] = value;
}

/* ------------------------------------------------------------ */

void FL_SetheatpumpControl(double value)

{
  flvariable_val[FLVAR_Control] = value;
}

/* ------------------------------------------------------------ */

double FL_GetheatpumpTemperature(void)

{
  if (flvariable_set[FLVAR_Temperature])
     return(flvariable_val[FLVAR_Temperature]);
  return(flvariable_def[FLVAR_Temperature]);
}

/* ------------------------------------------------------------ */

double FL_GetheatpumpOldTemperature(void)

{
  if (flvariable_set[FLVAR_OldTemperature])
     return(flvariable_val[FLVAR_OldTemperature]);
  return(flvariable_def[FLVAR_OldTemperature]);
}

/* ------------------------------------------------------------ */

double FL_GetheatpumpControl(void)

{
  if (flvariable_set[FLVAR_Control])
     return(flvariable_val[FLVAR_Control]);
  return(flvariable_def[FLVAR_Control]);
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule1(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputHIGH(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputHIGH(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlMXCOOL]     = max(result,flvarControl[FLMEMF_ControlMXCOOL]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule2(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputHIGH(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlMXCOOL]     = max(result,flvarControl[FLMEMF_ControlMXCOOL]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule3(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputHIGH(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlCOOL]     = max(result,flvarControl[FLMEMF_ControlCOOL]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule4(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlOFF]     = max(result,flvarControl[FLMEMF_ControlOFF]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule5(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputLOW(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlHEAT]     = max(result,flvarControl[FLMEMF_ControlHEAT]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule6(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputLOW(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputMED(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlMXHEAT]     = max(result,flvarControl[FLMEMF_ControlMXHEAT]); 
}

/* ------------------------------------------------------------ */

static void FL_RuleMainRule7(void)

{
  double result,degree,temp; 
 
   result = 1.0;

     degree = 0.0;
     temp = FL_MemshipInputLOW(flvariable_val[FLVAR_Temperature]);
     degree  = max(temp,degree);

   result = min(degree,result);

     degree = 0.0;
     temp = FL_MemshipInputLOW(flvariable_val[FLVAR_OldTemperature]);
     degree  = max(temp,degree);

   result = min(degree,result);


   flvariable_set[FLVAR_Control] = 1; 
   flvarControl[FLMEMF_ControlMXHEAT]     = max(result,flvarControl[FLMEMF_ControlMXHEAT]); 
}

/* ------------------------------------------------------------ */

static void FL_ObjectMain(void)

{
   register int    i,defuzzify;
   register double sum,value;

   /* Reset Variable Control */
   flvariable_set[FLVAR_Control] = 0;
   for (i = 0; i < 5; i++)
      flvarControl[i] = 0.0;
   FL_RuleMainRule1();
   FL_RuleMainRule2();
   FL_RuleMainRule3();
   FL_RuleMainRule4();
   FL_RuleMainRule5();
   FL_RuleMainRule6();
   FL_RuleMainRule7();
   /* Evaluate Variable Control */
   for (defuzzify = 0, i = 0; ((i < 5) && (!defuzzify)); i++)
       if (flvarControl[i] > 0.0)
          defuzzify = 1;

   if (defuzzify)
      {
       sum = 0;
       for (i = 0; i < 5; i++)
           sum += flvarControl[i];
       value = 0;
       value += (flvarControl[0] * -30.000000);
       value += (flvarControl[1] * -10.000000);
       value += (flvarControl[2] * 0.000000);
       value += (flvarControl[3] * 10.000000);
       value += (flvarControl[4] * 30.000000);
       flvariable_val[FLVAR_Control] = value/sum;
      }
}
void FL_Runheatpump(void)

{
   FL_ObjectMain();
}


/* ------------------------------------------------------------ */

int main(int argc, char **argv)

{
  register int i;
  if (argc != FL_NUMVARIABLES+1)
     {
      printf("Error: Need 3 inputs\n");
      return(1);
     }

  for (i = 1; i < argc; i++)
      flvariable_val[i-1] = atof(argv[i]);
  FL_Runheatpump();
  for (i = 0; i < FL_NUMVARIABLES; i++)
      printf("%g ",flvariable_val[i]);
  printf("\n");
  return(0);
}

