/****************************************************************************/
/* Copyright 2016 MBARI.                                                    */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/

#include <xc.h>
#include <stdio.h>
#include "HardwareProfile.h"
#include "typedefs.h"
#include "timer.h"

extern unsigned short AlarmCnt;//Global incremented in AlarmISR

/*---------------------------------------------------------------------
  Function name: vInitCN
  Description: Initialization of Timer1 
  Input parameters: -
  Output parameters: -
-----------------------------------------------------------------------*/
void vInitTimer1( void )
{
    //__builtin_write_OSCCONL( OSCCONL | 0x02 ); // Enable secondary oscillator
    T1CON = 0;                // Clear control register of Timer 1
    //T1CONbits.TCS = 1;        // Use external secondary oscillator
    T1CONbits.TCS = 0;        // Use internal (FOSC/2) oscillator
    
    //no prescaler
    T1CONbits.TCKPS0 = 0;     //prescaler bit 0.  
    T1CONbits.TCKPS1 = 0;     //prescaler bit 1
    
    PR1 = T1_MS_TICK + SKEW;  // Set Period Register 1
    T1CONbits.TON = 1;	      // Turn On Timer 1
    IFS0bits.T1IF = 0;        // Clear Timer1 Interrupt Flag
    IPC0bits.T1IP = 1;        // Set priority of Timer1 Interrupt
    IEC0bits.T1IE = 1;        // Enable Timer1 Interrupt
}

#define N_WAIT 1200000  // ^^^ wait max so no infinite loops

// *****************************************************************************
void msWait (unsigned long ms)
 { //wait 1 ms
   unsigned long j=0;
   AlarmCnt=0;
   
   while( (AlarmCnt<ms) && j<N_WAIT){j++;};//TODO, could add nop() here to save E
   
   return;
 } 
// *****************************************************************************
void DelaySecs ( int secs )  //delay for secs seconds
 {int i;
  if (secs < 1) return; // ^^^ illegal wait
  for(i=0;i<secs;i++) 
   {msWait(1000);//delay for 1 second
   
   }
  return;
 }  //end DelaySecs 


/*---------------------------------------------------------------------
  Function name: _T1Interrupt
  Description: Timer1 Interrupt Service Routine
  Input parameters: -
  Output parameters: -
-----------------------------------------------------------------------*/
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt( void )
{
    IFS0bits.T1IF = 0;        // Clear Timer1 Interrupt Flag
    //LATAbits.LATA0 ^= 1;
    if(AlarmCnt > N_WAIT)
        {
            AlarmCnt=0;
        }
    else
        {
            AlarmCnt++;        // Incrementing Timer Counter
        }
}

