/****************************************************************************/
/* Copyright 2016 MBARI.                                                    */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/

#include <xc.h>
#include <stdio.h>
#include "HardwareProfile.h"
#include "typedefs.h"
#include "CN.h"

extern uint16_t gPORTA_CN_status;
extern uint16_t gPORTB_CN_status;
extern unsigned short revs;
extern unsigned short CNticks;

void vInitCN( void )
{
 IEC1bits.CNIE = 0; //disable CN inrpt

 //_RP12R = 0;                 // unmap RB12/RP12/CN14/AN12 output, Note may require a PPS unlock.
 //AD1PCFGLbits.PCFG12 = 1;    // make AN12 digital I/O
 TRISAbits.TRISA7 = 1; //make RA7 an input

 //CNPU1bits.CN14PUE = 1;      // enable the weak pull-up on CN14
 CNEN1bits.CN9IE = 1;  // interrupt on CN14
 IPC4bits.CNIP = 3;  // priority 3

 gPORTA_CN_status = PORTA;  // Read all ports with CN inputs
 gPORTB_CN_status = PORTB;  // to update changed latches.
 IFS1bits.CNIF = 0;  // clear CN interrupt request
 IEC1bits.CNIE = 1;  // enable CN interrupt
}


/*
 * Interrupt on change handler
 */
void __attribute__ ((__interrupt__, no_auto_psv)) _CNInterrupt(void)
{
 uint16_t PORTA_CN_status,PORTA_CN_changed;
 uint16_t PORTB_CN_status,PORTB_CN_changed;

 PORTA_CN_status = PORTA; // Read all ports with CN inputs
 PORTB_CN_status = PORTB; // to update changed latches.

 IFS1bits.CNIF = 0; // clear CN interrupt

 PORTA_CN_changed = gPORTA_CN_status ^ PORTA_CN_status;
 PORTB_CN_changed = gPORTB_CN_status ^ PORTB_CN_status;
 gPORTA_CN_status = PORTA_CN_status;
 gPORTB_CN_status = PORTB_CN_status;
 
 if(PORTAbits.RA7 == 1)
 {
  //printf("Rising edge detected\n");
  CNticks++;
  if (CNticks > TicksPerRev)
  {
      revs++;
      CNticks=0;
  }
 }
 if(PORTAbits.RA7 == 0)
 {
  //printf("Falling edge detected\n");
 }
}