/**********************************************
  ROVINT.C  Rover Initialization and Interrupts
**********************************************/

#include "rovint.h"
#include "rovsys.h"
#include "rovlib.h"
#include <stdlib.h>


#ifdef AZTEC_C    /* Include if compiler is Aztec C */
#include <sim.h>
#include <pins.h>
#include <atod.h>
#include <tpu.h>
#include <tt7.h>
#include <timing.h>
#include <excepts.h>
#include "tserial.h"
#include <string.h>
#define IOPORT1   ((uspv) (0xE00000))
#define IOPORT2   ((uspv) (0xE00002))

#else
#include "tt7pclib.h"
#include "conio.h"
#endif


/* Global Variables */

int g_odometer_ticks, g_leadscrew1_ticks, g_leadscrew2_ticks;
int g_cmmot_shaft_ticks, g_cmrotor_ticks, g_alarm_level;


/************************************************
	Tattletale Mod. 7 Initialization
*************************************************/

void tt7init(void){

#ifdef AZTEC_C
  static ExcCFrame      framebuf1, framebuf2, framebuf3, framebuf4, framebuf5;
  short         result;
  short chan;

/*
** DEFINE CHIP SELECT FOR MEMORY MAPPING INTO 0xE00000
*/
   *CSBAR7 = 0xE000 | SZ2K; /* 2K @ E00000, E00002, E00004, E00006 */
   *CSOR7 = 
		M_MDSYNC   &   CLR   /* 0 = async, 1 = synchronous      */
	|       M_BYTEU    &   SET   /* upper byte                      */
	|       M_BYTEL    &   SET   /* lower byte                      */
	|       M_CSWRITE  &   SET   /* write                           */
	|       M_CSREAD   &   SET   /* read                            */
	|       M_DSSTRB   &   SET   /* 0 = address, 1 = data strobe    */
	|       M_WAIT0              /* wait states                     */
	|       M_SPCS     &   SET   /* supervisor                      */
	|       M_SPCU     &   SET   /* user                            */
	|       M_AVEC     &   CLR   /* 0 = ext rupt, 1 = autovector    */
   ;


   *IOPORT1 = 0;   /* Clear Aux. I/O ports */
   *IOPORT2 = 0;

   OptSetLowPower();   /* Set all ports to output in low power mode */

/************* Setup TPU Channels and Interrupts ***********/

   TPUSetPin(0,0);
   TPUSetPin(1,0);
   TPUSetPin(2,1);
   for(chan=3;chan<=6;chan++)
     TPUGetPinES(chan, DetRising);
   TPUGetPinES(7, DetFalling);   /* Transpond-in */
   TPUSetPin(8,1);
   TPUGetPin(9);
   TPUSetPin(10,0);
   TPUSetPin(11,0);

  *CISR &= 0xC000;  /* Clear TPU0-13 interrupts */
  *CIER &= 0xC000;

/******** Setup Interrupt Handlers ****************/

   InstallHandler(odometer, TPU_INT_VECTOR + ODOMETER, OS_VECTOR_BASE,
	&framebuf1);
   *CIER += (1 << ODOMETER);

   InstallHandler(leadscrew1, TPU_INT_VECTOR + LEADSCREW1, OS_VECTOR_BASE,
	&framebuf2);
   *CIER += (1 << LEADSCREW1);

   InstallHandler(leadscrew2, TPU_INT_VECTOR + LEADSCREW2, OS_VECTOR_BASE,
	&framebuf3);
   *CIER += (1 << LEADSCREW2);

   InstallHandler(cmmot_shaft, TPU_INT_VECTOR + CMMOT_SHAFT, OS_VECTOR_BASE,
	&framebuf4);
/*   *CIER += (1 << CMMOT_SHAFT);  */

   InstallHandler(transpond_in, TPU_INT_VECTOR + TRANSPOND_IN, OS_VECTOR_BASE,
	&framebuf5);
/*   *CIER += (1 << TRANSPOND_IN); */



/********* OPEN THE TPU SERIAL DRIVERS *********************/

	if ((result = TSerOpen(13, INP, 100, 9600, 'N', 8, 1)) != tsOK)
		{
		printf(" Failed TSerOpen %d \n", result);
		return;
		}

	if ((result = TSerOpen(12, OUTP, 100, 9600, 'N', 8, 1)) != tsOK)
		{
		printf(" Failed TSerOpen %d \n", result);
		return;
		}


#else     /* Turbo C Dummy Function */
  return;
#endif
}  /* End of tt7init() */

/*************************************************
	Interrupt Handlers 
*************************************************/

void odometer(void){

#ifdef AZTEC_C

  printf("\nOdometer Tick");
  g_odometer_ticks++;
  *CISR ^= (1 << ODOMETER);  /* Acknowledge interrupt */

#else
  g_odometer_ticks++;

#endif
}

/************************************************************/

void leadscrew1(void){

#ifdef AZTEC_C

/*  printf("\nLeadscrew1 Tick"); */
  g_leadscrew1_ticks++;
  *CISR ^= (1 << LEADSCREW1); /* Acknowledge interrupt */

#else
  g_leadscrew1_ticks++;
  return;

#endif
}



/************************************************************/

void leadscrew2(void){

#ifdef AZTEC_C
/*  printf("\nLeadscrew2 Tick"); */
  g_leadscrew2_ticks++;
  *CISR ^= (1 << LEADSCREW2);  /* Acknowledge interrupt */
  return;

#else
  g_leadscrew2_ticks++;
  return;

#endif
}

/************************************************************/

void cmmot_shaft(void){

#ifdef AZTEC_C
  printf("\nCmmot_shaft Tick");
  g_cmmot_shaft_ticks++;
  *CISR ^= (1 << CMMOT_SHAFT);  /* Acknowledge interrupt */
  return;

#else
  g_cmmot_shaft_ticks++;
  return;

#endif
}

/************************************************************/

void currmet(void){

#ifdef AZTEC_C
  static int then;
  int now;

  printf("\nChecking Current Meter");
  TPUSetPin(CMROTOR_PWR, 1);   /* Turn on photo-diode */
  DelayMilliSecs(10);
  now = TPUGetPin(CMROTOR);
  TPUSetPin(CMROTOR_PWR, 0);   /* Turn off photo-diode */

  if(now != then) g_cmrotor_ticks++;
  then = now;

#else
  g_cmrotor_ticks++;

#endif
}

/************************************************************/

void transpond_in(void){

#ifdef AZTEC_C
  int ping;

  printf("\nTranspond-in Tick");

  for(ping = 0; ping <= g_alarm_level; ping++) {
    TPUSetPin(TRANSPOND_OUT, 0);
    DelayMilliSecs(PING_INTERVAL);
    TPUSetPin(TRANSPOND_OUT, 1);
  }
  *CISR ^= (1 << TRANSPOND_IN);  /* Acknowledge interrupt */
  return;

#else
  return;

#endif
}

/******************Misc. Interrupt Functions***************/



/************************************************************
*       Turbo-C Simulation Functions
************************************************************/
#ifdef __TURBOC__

void check_int(void){

  char c;

  if( kbhit() ){
    c = getch();
    switch(c){
      case 'o':
	odometer();
	break;
    }
  }
  return;
}

#endif
