/*
  Print test status
*/

#include <stdio.h>
#include "pwr.h"
#include "co_cdh.h"
#include "rt_gdh.h"
#include "tst_log.h"

static char item[][80] = {
  "Test01c-Plc-Logic-And",
  "Test01c-Plc-Logic-Or",
  "Test01c-Plc-Logic-XOr",
  "Test01c-Plc-Logic-Inv",
  "Test01c-Plc-Logic-True",
  "Test01c-Plc-Logic-False",
  "Test01c-Plc-Logic-FirstScan",
  "Test01c-Plc-Logic-Edge",
  "Test01c-Plc-Logic-Count",
  "Test01c-Plc-Logic-Wait",
  "Test01c-Plc-Logic-Waith",
  "Test01c-Plc-Logic-Pulse",
  "Test01c-Plc-Logic-Timer",
  "Test01c-Plc-Logic-SR_S",
  "Test01c-Plc-Logic-SR_R",
  "Test01c-Plc-Analog-Add",
  "Test01c-Plc-Analog-Sum",
  "Test01c-Plc-Analog-Minmax",
  "Test01c-Plc-Analog-Max",
  "Test01c-Plc-Analog-Min",
  "Test01c-Plc-Analog-Mul",
  "Test01c-Plc-Analog-Div",
  "Test01c-Plc-Analog-Sub",
  "Test01c-Plc-Analog-Mux",
  "Test01c-Plc-Analog-Demux",
  "Test01c-Plc-Analog-Select",
  "Test01c-Plc-Analog-Limit",
  "Test01c-Plc-Analog-Comph",
  "Test01c-Plc-Analog-Compl",
  "Test01c-Plc-Analog-ScanTime",
  "Test01c-Plc-Analog-GreaterThan",
  "Test01c-Plc-Analog-GreaterEqual",
  "Test01c-Plc-Analog-LessThan",
  "Test01c-Plc-Analog-LessEqual",
  "Test01c-Plc-Analog-Equal",
  "Test01c-Plc-Analog-NotEqual",
  "Test01c-Plc-Analog-DArithm",
  "Test01c-Plc-Analog-AArithm",
  "Test01c-Plc-Analog-CArithm",
  "Test01c-Plc-Analog-DataArithm",
  "Test01c-Plc-Analog-Curve",
  "Test01c-Plc-Analog-Adelay",
  "Test01c-Plc-Analog-Filter",
  "Test01c-Plc-Analog-Ramp",
  "Test01c-Plc-Analog-Random",
  "Test01c-Plc-Analog-Timint",
  "Test01c-Plc-Analog-TimeMean",
  "Test01c-Plc-Analog-Speed",
  "Test01c-Plc-AnalogMath-ACos",
  "Test01c-Plc-AnalogMath-ASin",
  "Test01c-Plc-AnalogMath-ATan",
  "Test01c-Plc-AnalogMath-Cos",
  "Test01c-Plc-AnalogMath-Sin",
  "Test01c-Plc-AnalogMath-Tan",
  "Test01c-Plc-AnalogMath-Exp",
  "Test01c-Plc-AnalogMath-Ln",
  "Test01c-Plc-AnalogMath-Log",
  "Test01c-Plc-AnalogMath-Mod",
  "Test01c-Plc-AnalogMath-Sqrt",
  "Test01c-Plc-AnalogMath-Abs",
  "Test01c-Plc-Integer-IAdd",
  "Test01c-Plc-Integer-IMax",
  "Test01c-Plc-Integer-IMin",
  "Test01c-Plc-Integer-IMul",
  "Test01c-Plc-Integer-IMux",
  "Test01c-Plc-Integer-IDemux",
  "Test01c-Plc-Integer-IDiv",
  "Test01c-Plc-Integer-ISub",
  "Test01c-Plc-Integer-ISel",
  "Test01c-Plc-Integer-IGreaterThan",
  "Test01c-Plc-Integer-IGreaterEqual",
  "Test01c-Plc-Integer-ILessThan",
  "Test01c-Plc-Integer-ILessEqual",
  "Test01c-Plc-Integer-IEqual",
  "Test01c-Plc-Integer-INotEqual",
  "Test01c-Plc-Integer-Even",
  "Test01c-Plc-Integer-Odd",
  "Test01c-Plc-Integer-IAbs",
  "Test01c-Plc-Integer-ILimit",
  "Test01c-Plc-Integer-BwAnd",
  "Test01c-Plc-Integer-BwOr",
  "Test01c-Plc-Integer-BwInv",
  "Test01c-Plc-Integer-BwRotateLeft",
  "Test01c-Plc-Integer-BwRotateRight",
  "Test01c-Plc-Integer-BwShiftLeft",
  "Test01c-Plc-Integer-BwShiftRight",
  "Test01c-Plc-Grafcet-InitStep",
  "Test01c-Plc-Grafcet-Step",
  "Test01c-Plc-Grafcet-Trans",
  "Test01c-Plc-Grafcet-SetCond",
  "Test01c-Plc-Grafcet-Order",
  "Test01c-Plc-Grafcet-SubStep",
  "Test01c-Plc-Grafcet-OrderAct",
  "Test01c-Plc-Grafcet-TransDiv",
  "Test01c-Plc-Grafcet-StepDiv",
  "Test01c-Plc-Other-CSub",
  "Test01c-Plc-Other-CArea",
  "Test01c-Plc-Other-CLoop"
};

int main()
{
  pwr_tStatus sts;
  unsigned int i;
  pwr_tAName aname;

  tst_log *log = new tst_log(&sts, "rt-Plc", "$pwrp_log/plc.log");
  if (EVEN(sts))
    printf("** Unable to open log file");

  sts = gdh_Init("ra_test");
  if (EVEN(sts)) {
    printf("E pwrtest01 status, gdh_Init error status: %u\n", sts);
    exit(0);
  }
  
  for (i = 0; i < sizeof(item)/sizeof(item[0]); i++) {
    pwr_tBoolean val;
    pwr_tInt32 state;

    strcpy(aname, item[i]);
    strcat(aname, "-TestExecuted.ActualValue");
    sts = gdh_GetObjectInfo(aname, &val, sizeof(val));
    if (EVEN(sts)) {
      log->log('E', "Can't find test object", item[i], sts);
      continue;
    }
    if (val != 1) {
      log->log('E', "Not tested", item[i]);
      continue;
    }

    strcpy(aname, item[i]);
    strcat(aname, "-ErrorDetected.ActualValue");
    sts = gdh_GetObjectInfo(aname, &val, sizeof(val));
    if (EVEN(sts)) {
      log->log('E', "gdh_GetObjectInfo", item[i], sts);
      continue;
    }
    if (val == 1) {
      char state_str[80];

      strcpy(aname, item[i]);
      strcat(aname, "-ErrorState.ActualValue");
      sts = gdh_GetObjectInfo(aname, &state, sizeof(state));
      if (EVEN(sts)) {
	log->log('E', "State not found", item[i], sts);
	state = -1;
      }
      sprintf(state_str, "error state %u", state);
      log->log('E', item[i], state_str);
    }
    else
      log->log('I', "Test ok", item[i]);
  }
}