// JidaTst.cpp ansi_c&windows
// JUMPtec Jida API Demo
// Copyright 1998 JUMPtec AG
// {G)U(2} 1998.10.30 2001.10.19

//***************************************************************************

#include "JidaApp.h"

//***************************************************************************

static TCHAR szAppTitle[]=TEXT("JUMPtec JIDA API Demo");

//***************************************************************************

DeclareMain(jidaTest)
  {
  TCHAR buf[512];

  // Initialize the JIDA API
  if (!JidaDllInitialize()) {
    // The init has failed
    if (MessageBox(0,TEXT("JIDA system driver is incompatible or not installed. Would you like to install it?"),szAppTitle,MB_YESNO)==IDYES) {
      // try to install it
      if (JidaDllInstall(TRUE)) {
        // try another init to find out if the driver was loaded dynamically
        if (!JidaDllInitialize()) {
          MessageBox(0,TEXT("The driver has been installed. Please reboot!"),szAppTitle,0);
          return 0;
          }
        }
      else {
        MessageBox(0,TEXT("The driver could not be installed. Please make sure that you have sufficient rights!"),szAppTitle,0);
        return 0;
        }
      }
    else return 0;
    }

  // General JIDA Info

  DWORD dwTotalBoards;
  dwTotalBoards=JidaBoardCount(NULL,0);

  wsprintf(buf,
    TEXT("JIDA Version: 0x%08x\n")
    TEXT("Total number of available boards: %lu\n")
    TEXT("Number of primary CPU boards: %lu\n")
    TEXT("Number of primary VGA boards: %lu\n")
    TEXT("Number of boards with CPU functionality: %lu\n")
    TEXT("Number of boards with VGA functionality: %lu\n"),
    JidaDllGetVersion(),
    dwTotalBoards,
    JidaBoardCount(JIDA_BOARD_CLASS_CPU,JIDA_BOARD_OPEN_FLAGS_PRIMARYONLY),
    JidaBoardCount(JIDA_BOARD_CLASS_VGA,JIDA_BOARD_OPEN_FLAGS_PRIMARYONLY),
    JidaBoardCount(JIDA_BOARD_CLASS_CPU,0),
    JidaBoardCount(JIDA_BOARD_CLASS_VGA,0)
    );
  MessageBox(0,buf,szAppTitle,0);

  // Board Open and Close

  HJIDA hJida;
  if (!JidaBoardOpen(JIDA_BOARD_CLASS_CPU,0,0,&hJida)) {
    MessageBox(0,TEXT("Could not open a CPU Board"),szAppTitle,0);
    }
  else {
    MessageBox(0,TEXT("CPU Board opened successfully"),szAppTitle,0);
    JidaBoardClose(hJida);
    }

  if (!JidaBoardOpenByName(TEXT("P488"),&hJida)) {
    MessageBox(0,TEXT("Could not open board P488"),szAppTitle,0);
    }
  else {
    MessageBox(0,TEXT("Board P488 opened successfully"),szAppTitle,0);
    JidaBoardClose(hJida);
    }

  if (!JidaBoardOpenByName(TEXT("LEU1"),&hJida)) {
    MessageBox(0,TEXT("Could not open board LEU1"),szAppTitle,0);
    }
  else {
    MessageBox(0,TEXT("Board LEU1 opened successfully"),szAppTitle,0);
    JidaBoardClose(hJida);
    }

  // Iterate thru all available boards

  DWORD dwBoardIndex;
  for (dwBoardIndex=0; dwBoardIndex<dwTotalBoards; dwBoardIndex++) {

    // Open it
    if (!JidaBoardOpen(NULL,dwBoardIndex,0,&hJida)) {
      MessageBox(0,TEXT("Could not open a Board"),szAppTitle,0);
      }
    else {

      // Board info

      JIDABOARDINFO jbi;
      jbi.dwSize=sizeof(jbi);
      if (!JidaBoardGetInfo(hJida, &jbi)) {
        MessageBox(0,TEXT("Could not get board info"),szAppTitle,0);
        }
      else {
        wsprintf(buf,
          TEXT("Board info for #%lu\n")
          TEXT("Size of Structure: %lu\n")
          TEXT("Flags: 0x%x\n")
          TEXT("Primary Class Name: \"%s\"\n")
          TEXT("Class Names: \"%s\"\n")
          TEXT("Board Name: \"%s\"\n")
          TEXT("Board Sub Name: \"%s\"\n")
          TEXT("Manufacturer Name: \"%s\"\n")
          TEXT("Manufacturing Date: %04d.%02d.%02d\n")
          TEXT("Last Repair Date: %04d.%02d.%02d\n")
          TEXT("Serial Number: \"%s\"\n")
          TEXT("Hardware Revision: 0x%04x\n")
          TEXT("Firmware Revision: 0x%04x\n")
          TEXT("Jida Revision: 0x%04x\n")
          TEXT("Feature Number: 0x%04x\n"),
          dwBoardIndex,
          jbi.dwSize,
          jbi.dwFlags,
          jbi.szPrimaryClass,
          jbi.szClasses,
          jbi.szBoard,
          jbi.szBoardSub,
          jbi.szManufacturer,
          jbi.stManufacturingDate.wYear,jbi.stManufacturingDate.wMonth,jbi.stManufacturingDate.wDay,
          jbi.stLastRepairDate.wYear,jbi.stLastRepairDate.wMonth,jbi.stLastRepairDate.wDay,
          jbi.szSerialNumber,
          jbi.wHardwareRevision,
          jbi.wFirmwareRevision,
          jbi.wJidaRevision,
          jbi.wFeatureNumber);
        MessageBox(0,buf,szAppTitle,0);
        }

      // Extended Board Info

      TCHAR szBoardName[JIDA_BOARD_MAX_SIZE_ID_STRING];
      DWORD dwBootCounter;
      DWORD dwRunningTime;
     
      wsprintf(buf,
        TEXT("Board is named: \"%s\"\n")
        TEXT("Boot Counter: %d\n")
        TEXT("Running Time Meter: %d hours\n")
        TEXT("Total Number of Storage Areas: %lu\n")
        TEXT("  Number of EEPROMs: %lu\n")
        TEXT("  Size of first EEPROM: %lu\n")
        TEXT("Number of I2C Buses: %lu\n")
        TEXT("Number of Digital IOs: %lu\n"),
        JidaBoardGetName(hJida,szBoardName,sizeof(szBoardName))?szBoardName:TEXT("?"),
        JidaBoardGetBootCounter(hJida,&dwBootCounter)?(int)dwBootCounter:-1,
        JidaBoardGetRunningTimeMeter(hJida,&dwRunningTime)?(int)dwRunningTime:-1,
        JidaStorageAreaCount(hJida,0),
        JidaStorageAreaCount(hJida,JIDA_STORAGE_AREA_EEPROM),
        JidaStorageAreaSize(hJida,JIDA_STORAGE_AREA_EEPROM),
        JidaI2CCount(hJida),
        JidaIOCount(hJida)
        );
      MessageBox(0,buf,szAppTitle,0);

      // LCD Settings

      DWORD dwContrast,dwBacklight;

      wsprintf(buf,
        TEXT("LCD Contrast: %d\n")
        TEXT("LCD Backlight: %d\n")
        TEXT("\nSetting both to full..."),
        JidaVgaGetContrast(hJida,&dwContrast)?(int)dwContrast:-1,
        JidaVgaGetBacklight(hJida,&dwBacklight)?(int)dwBacklight:-1);
      MessageBox(0,buf,szAppTitle,0);


      JidaVgaSetContrast(hJida,JIDA_VGA_CONTRAST_MAX);
      JidaVgaSetBacklight(hJida,JIDA_VGA_BACKLIGHT_MAX);

      wsprintf(buf,
        TEXT("LCD Contrast: %d\n")
        TEXT("LCD Backlight: %d\n")
        TEXT("\nSetting both to min..."),
        JidaVgaGetContrast(hJida,&dwContrast)?(int)dwContrast:-1,
        JidaVgaGetBacklight(hJida,&dwBacklight)?(int)dwBacklight:-1);
      MessageBox(0,buf,szAppTitle,0);

      JidaVgaSetContrast(hJida,0);
      JidaVgaSetBacklight(hJida,0);

      wsprintf(buf,
        TEXT("LCD Contrast: %d\n")
        TEXT("LCD Backlight: %d\n")
        TEXT("\nSetting back to mid range..."),
        JidaVgaGetContrast(hJida,&dwContrast)?(int)dwContrast:-1,
        JidaVgaGetBacklight(hJida,&dwBacklight)?(int)dwBacklight:-1);
      MessageBox(0,buf,szAppTitle,0);

      JidaVgaSetContrast(hJida,JIDA_VGA_CONTRAST_MAX*2/3);
      JidaVgaSetBacklight(hJida,JIDA_VGA_BACKLIGHT_MAX*2/3);

      // Storage Areas

      if (JidaStorageAreaCount(hJida,JIDA_STORAGE_AREA_EEPROM)) {  // Do we have a EEPROM?
        BYTE bOrg[]="???";
        BYTE bNew[]="***";

        // run a test reading and writing 3 bytes at offset 2

        if (!JidaStorageAreaRead(hJida,JIDA_STORAGE_AREA_EEPROM,2,bOrg,sizeof(bOrg)))
          MessageBox(0,TEXT("Could not read EEPROM"),szAppTitle,0);
        else {
          wsprintf(buf,
            TEXT("Original EEPROM bytes: hex %02x %02x %02x\n"),
            bOrg[0],bOrg[1],bOrg[2]);
          MessageBox(0,buf,szAppTitle,0);

          if (!JidaStorageAreaWrite(hJida,JIDA_STORAGE_AREA_EEPROM,2,(LPBYTE)"A1*",3))
            MessageBox(0,TEXT("Could not write EEPROM"),szAppTitle,0);
          if (!JidaStorageAreaRead(hJida,JIDA_STORAGE_AREA_EEPROM,2,bNew,3))
            MessageBox(0,TEXT("Could not read EEPROM"),szAppTitle,0);
          else {
            wsprintf(buf,
              TEXT("New EEPROM bytes: hex %02x %02x %02x\n"),
              bNew[0],bNew[1],bNew[2]);
            MessageBox(0,buf,szAppTitle,0);
            if (!JidaStorageAreaWrite(hJida,JIDA_STORAGE_AREA_EEPROM,2,bOrg,3))
              MessageBox(0,TEXT("Could not write EEPROM"),szAppTitle,0);
            }

          }
        }

      // I2C Bus

      if (JidaI2CCount(hJida)) {
        BYTE b=0,b4=0;

        if (!JidaI2CReadRegister(hJida,0,JIDA_I2C_ADDR_EEPROM,0,&b))
          MessageBox(0,TEXT("Could not read EEPROM directly from I2C"),szAppTitle,0);
        else {
          JidaI2CReadRegister(hJida,0,JIDA_I2C_ADDR_EEPROM,4,&b4);

          wsprintf(buf,
            TEXT("First byte in EEPROM over I2C: 0x%02x\n")
            TEXT("Fifth byte in EEPROM over I2C: 0x%02x\n"),
            b,b4);
          MessageBox(0,buf,szAppTitle,0);
          }
        }

      // Close the current board and "onto the next"

      JidaBoardClose(hJida);
      }
    }

  // Let the JIDA API clean up
  JidaDllUninitialize();
  MessageBox(0,TEXT("Good bye..."),szAppTitle,0);
  return 0;
  }
