//------------------------------------------------------------
// Maxim 6316 Watchdog and reset chip: XJEase device file
// MAX6316.xje Revision: 1.14
// (c)2004-2007 XJTAG Limited
//
// Disclaimer: XJTAG makes no guarantees whatsoever
// about this code.  You use it at your own risk ...
// This code requires XJTAG version 1.4 or later.
//
// This file tests Non-JTAG Watchdog using Test()(INT result)
//------------------------------------------------------------

DEVICE NAME := "MAX6316"
  PINS
    RESET    := 1;
    WATCHDOG := 4;
    SWITCH   := 3;
  END;

  DISABLE DEVICE
    WATCHDOG := Z;
  END;

  TEST COVERAGE
    RESET    := OPEN HI LO;
    WATCHDOG := OPEN HI LO;
  END;

END;

//------------------------------------------------------
// Constants
//------------------------------------------------------

// Result codes
CONST INT PASS := FALSE;
CONST INT FAIL := TRUE;

//------------------------------------------------------
Test()(INT result)
//------------------------------------------------------

  INT value, key;

  result := FAIL;

  PRINT("Press RESET button (press any key to fail).\n");
  DO
    SET value := RESET;
  WHILE value = 1 && (GETKEY() = 0)
  END;

  IF value = 1 THEN
    PRINT("RESET Test failed.\n");
    RETURN;
  END;

  PRINT("RESET test passed, release RESET button (any key to fail).\n");

  DO
    SET value := RESET;
  WHILE value = 0 && (GETKEY() = 0)
  END;

  IF value = 0 THEN
    PRINT("RESET test failed.\n");
    RETURN;
  END;

  WatchDogTest()(result);

END;

//------------------------------------------------------
WatchDogTest()(INT result)
//------------------------------------------------------

  INT res, startTime, timeout, lowTime, endTime;

  result := FAIL;

  SET res := RESET;
  IF res = 0 THEN
    PRINT("nRESET line is stuck at zero.\n");
    RETURN;
  END;

  // Activate the watchdog pin and wait for the reset.
  SET WATCHDOG := 0;
  FLUSH;
  startTime := NOW();

  timeout := NOW() + 2000;
  DO
    SET res := RESET;
  WHILE res = 1 && NOW() < timeout
  END;

  IF res = 1 THEN
    PRINT("Timed out waiting for watchdog to reset.\n");
    RETURN;
  END;

  timeout := NOW() + 2000;
  lowTime := NOW();
  DO
     SET res := RESET;
  WHILE res = 0 && NOW() < timeout
  END;

  IF res = 0 THEN
    PRINT("Timed out waiting for end of reset period.\n");
    RETURN;
  END;

  endTime := NOW();

  PRINT("Reset occurred ", lowTime - startTime, " ms after watchdog kick - reset continued for ", endTime - lowTime, " ms.\n" );

  result := PASS;

END;