/*
__     _______ ____  _____   _    _____
\ \   / | ____|___ \|__  /  / \  |__  /
 \ \ / /|  _|   __) | / /  / _ \   / / 
  \ V / | |___ / __/ / /_ / ___ \ / /_ 
   \_/  |_____|_____/____/_/   \_/____|
 T/R Sequencer for a 10 GHz Transverter-based system
 File:   main.c
 Author: Bert, VE2ZAZ / VA2IW - ve2zaz@myrac.ca
 Website: https://ve2zaz.net
 Created on January 19th, 2024
 Target: Microchip PIC16F1824 (14 pins)
 Environment: MPLABX IDE, using XC8 compiler
*/

#include "mcc_generated_files/mcc.h"        // Uses header and code files generated by the MPLABX MCC tool.
                                            // Those files must be included with this source code file.
#define  TX_INHIBIT LATCbits.LATC0
#define  PWR_AMP_PWR LATCbits.LATC1	
#define  P8_TX_PWR LATCbits.LATC2	
#define  P12_TX_PWR LATCbits.LATC3	
#define  P12_RX_PWR LATCbits.LATC4	
#define  P8_RX_PWR LATCbits.LATC5	
#define  RADIO_PRES (!(PORTAbits.RA0))
#define  RADIO_PTT (!(PORTAbits.RA1))
#define  ON 1
#define  OFF 0
#define  INH_ON 0
#define  INH_OFF 1
#define  SEQ_DELAY 35       // milliseconds (in reality a few more ms) of spacing between each channel. 
                            // Some more delay can be added individually in de code loops

// Timing function based on looping calculated by the compiler
void delay_ms(unsigned int delay) 
{
    for (unsigned int i = 0; i < delay; i++) __delay_ms(1);
}

// Main function
void main(void)
{
    // Initialize the device
    SYSTEM_Initialize();
    
    LATC = 0;           // Shutoff everything
    delay_ms(500);
    while (true)        // Endless loop
    {
        while (RADIO_PRES == ON)
        {   // PTT Active
            while ((RADIO_PTT == ON) && (RADIO_PRES == ON))     // Also checking radio presence throughout the sequence
            {    
                delay_ms(SEQ_DELAY);        // Delay for debouncing
                if (RADIO_PTT == ON)
                {    
                    if (P8_RX_PWR == ON) 
                    {
                        P8_RX_PWR = OFF;
                    }
                    else if (P12_RX_PWR == ON) 
                    {
                        P12_RX_PWR = OFF;
                    }
                    else if (P12_TX_PWR == OFF) 
                    {
                        P12_TX_PWR = ON;
                    }
                    else if (P8_TX_PWR == OFF) 
                    {
                        P8_TX_PWR = ON;
                    }
                    else if (PWR_AMP_PWR == OFF) 
                    {
                        PWR_AMP_PWR = ON;
                    }
                    else if (TX_INHIBIT == INH_ON) 
                    {
                        TX_INHIBIT = INH_OFF;
                    }
                }
            }   // PTT Inactive 
            while ((RADIO_PTT == OFF) && (RADIO_PRES == ON))   // Also checking radio presence throughout the sequence
            {
                delay_ms(SEQ_DELAY);         // Delay for debouncing
                if (RADIO_PTT == OFF)
                {    
                    if (TX_INHIBIT == INH_OFF) 
                    {
                        TX_INHIBIT = INH_ON;
                    }
                    else if (PWR_AMP_PWR == ON) 
                    {
                        PWR_AMP_PWR = OFF;
                    }
                    else if (P8_TX_PWR == ON) 
                    {
                        P8_TX_PWR = OFF;
                    }
                    else if (P12_TX_PWR == ON) 
                    {
                        P12_TX_PWR = OFF;
                    }
                    else if (P12_RX_PWR == OFF) 
                    {
                        P12_RX_PWR = ON;
                    }
                    else if (P8_RX_PWR == OFF) 
                    {
                        P8_RX_PWR = ON;
                    }
                }
            }    
        }
        // Here, the IF radio is disconnected (RADIO_PRES == OFF)
        // Shut off everything in the safest order possible, assuming being in TX
        P8_RX_PWR = OFF;
        delay_ms(SEQ_DELAY);
        P12_RX_PWR = OFF;
        delay_ms(SEQ_DELAY);
        PWR_AMP_PWR = OFF;
        delay_ms(SEQ_DELAY);
        P12_TX_PWR = OFF;
        delay_ms(SEQ_DELAY);
        P8_TX_PWR = OFF;
        delay_ms(SEQ_DELAY);
        TX_INHIBIT = INH_ON;
        delay_ms(SEQ_DELAY);
    }
}
/**
 End of File
*/