Example program for EVAL-TempSense-ARDZ boards.

Dependencies:   platform_drivers

main.cpp

Committer:
malavikasaji
Date:
2019-12-09
Revision:
6:0228e21af1f0
Parent:
5:f92081816fb7

File content as of revision 6:0228e21af1f0:

/*************************************************************************//**
 *   @file   main.cpp
 *   @brief  Main application code for EVAL-TempSense-ARDZ mbed example program
 *   @author ssmith (sean.smith@analog.com)
******************************************************************************
* Copyright (c) 2019 Analog Devices, Inc.  
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions are met:
*   - Redistributions of source code must retain the above copyright notice, 
*     this list of conditions and the following disclaimer.
*   - Redistributions in binary form must reproduce the above copyright notice, 
*     this list of conditions and the following disclaimer in the documentation 
*     and/or other materials provided with the distribution.  
*   - Modified versions of the software must be conspicuously marked as such.
*   - This software is licensed solely and exclusively for use with 
*     processors/products manufactured by or for Analog Devices, Inc.
*   - This software may not be combined or merged with other code in any manner 
*     that would cause the software to become subject to terms and 
*     conditions which differ from those listed here.
*   - Neither the name of Analog Devices, Inc. nor the names of its 
*     contributors may be used to endorse or promote products derived 
*     from this software without specific prior written permission.
*   - The use of this software may or may not infringe the patent rights 
*     of one or more patent holders. This license does not release you from 
*     the requirement that you obtain separate licenses from these patent 
*     holders to use this software.
* 
* THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" 
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
* NON-INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A 
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, 
* INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
* SPECIAL, EXEMPLARY, PUNITIVE OR CONSEQUENTIAL DAMAGES 
* (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF CLAIMS OF 
* INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF SUBSTITUTE 
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
* POSSIBILITY OF SUCH DAMAGE.
* 
* 20180927-7CBSD SLA
*****************************************************************************/
#include <cstdio>
#include <mbed.h>
#include "app_config.h"
#include <cmath>

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))

#define TEMP_MIN                -40
#define TEMP_MAX                150
#define MAX_HYST_TEMP           15
#define MIN_HYST_TEMP           0

#define RESET_DELAY             500
#define WAIT_MENU_TIME          1
#define NOT_USED                0

static void print_title(void);
static void print_prompt(void);
static uint8_t select_device();
static void print_active_device(int ext_int_value);
static int get_menu_select(uint8_t *menu_select);
static uint8_t read_temperature();
static uint8_t set_resolution();
static uint8_t set_op_mode();
static uint8_t bunch_of_temps();
static uint8_t readback_reg();
static uint8_t reset_interface();
static uint8_t write_to_setpoint_reg();
static uint8_t set_fault_queue();
static uint8_t set_ct_int_config();
static void microcontroller_reset();
static int input_check(int input_val,
                       int lowest_accepted_val,
                       int highest_accepted_val, 
                       int invalid_check);

#ifdef __cplusplus
extern "C"
{
#endif
#include "adt7420.h"
#ifdef __cplusplus
}				  
#endif // __cplusplus


/******************************************************************************/
/************************** Variables Declarations ****************************/
/******************************************************************************/

/**
	The following definitions are a requirement for the platform_driver
	Pin are changed if required in the app_config.h file
 ***/
PinName slave_selects[MAX_SLAVE_SELECTS] = { SPI_CS, SPI_CSE };
mbed::SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK);
mbed::I2C i2c(I2C_SDA, I2C_SCL);


i2c_init_param i2c_params = {
	GENERIC_I2C,     // i2c type
    NOT_USED,	     // i2c id
	100000, 		 // i2c max speed (hz)
	INTERNAL_I2C,    // i2c slave address (defined in app_config.h)
}; 

spi_init_param spi_params = {
	MBED,			 //For future ADI use
	GENERIC_SPI,	 //For future ADI use
	NOT_USED,		 //id 
	1000000,		 //SPI frequency (Hz)
	SPI_MODE_3,		 //CPOL/CPHA settings for your device
	INTERNAL_SPI,	 //CS index for PinName (defined in app_config.h)
};

adt7420_init_param init_params = {
	i2c_params, 	// I2C parameters 
	spi_params, 	// SPI parameters 
	NOT_USED,		//Resolution setting
    ACTIVE_DEVICE, //Set this in app_config.h
};

adt7420_dev *device;

registers_e registers;


int32_t connected = -1;
uint8_t device_id = 0;

//Configure and instantiate the UART - PB10/11
Serial pc(USBTX, USBRX, 115200);



int main()
{
	uint8_t menu_select = 0;

   	print_title();

    device_id = select_device();
       
	connected = adt7420_init(&device, init_params);

    if (connected != SUCCESS) {
        pc.printf(EOL EOL "  Connection to device failed :(" EOL);
        pc.printf("  ...Restarting application...  " EOL);
        wait(WAIT_MENU_TIME);
        microcontroller_reset();
    } else {
        pc.printf(EOL EOL "  Connection to device succeeded!" EOL);
    }
    
    while (connected == SUCCESS) {
        menu_select = 0;
        print_active_device(device_id);
		print_prompt();

		if (get_menu_select(&menu_select) == FAILURE)
            pc.printf(EOL "*****   Returning to main menu   *****" EOL);
		else {
			switch (menu_select) {
			case 1:
				read_temperature();
				break;  
			case 2:
				set_resolution();
				break;
			case 3:
				set_op_mode();
				break;
			case 4:
				bunch_of_temps();
				break;
			case 5:
				readback_reg();
				break;
			case 6:
				reset_interface();
				break;
			case 7:
				write_to_setpoint_reg();
				break;
            case 8:
                set_fault_queue();
                break;
            case 9:
                set_ct_int_config();
                break;
            case 10:
				/*Restore device registers to default values before restarting microcontroller*/
                reset_interface();
                microcontroller_reset();
                break;
			default:
				pc.printf("Invalid option" EOL);
				break;
			}
        }
		wait(WAIT_MENU_TIME); //wait 1 second
	}
}


/***************************************************************************//**
 * @brief	Prints the title block.
 *******************************************************************************/
void print_title()
{
	pc.printf("*****************************************************************" EOL);
	pc.printf("* EVAL-TempeSense-ARDZ Demonstration Program -- (mbed)          *" EOL);
	pc.printf("*                                                               *" EOL);
	pc.printf("* This program demonstrates communication with the ADT7xx       *" EOL);
	pc.printf("* High-Accuracy digital temperature sensor family               *" EOL);
	pc.printf("* It will also work with both SPI & I2C versions                *" EOL);
	pc.printf("*                                                               *" EOL);
	pc.printf("* Set the baud rate to 115200 select the newline terminator.    *" EOL);
	pc.printf("*****************************************************************" EOL);
}

/***************************************************************************//**
 * @brief	Prints the "main menu" prompt to the console.
 *******************************************************************************/
void print_prompt()
{
	pc.printf(EOL EOL "Command Summary:" EOL);
	pc.printf("  1  -Read temperature" EOL);
	pc.printf("  2  -Set resolution" EOL);
	pc.printf("  3  -Set operation mode" EOL);
	pc.printf("  4  -Poll temperature" EOL);
	pc.printf("  5  -Read a register" EOL);
	pc.printf("  6  -Reset the interface" EOL);
	pc.printf("  7  -Write to a setpoint register" EOL);
    pc.printf("  8  -Set Fault Queue configuration" EOL);
    pc.printf("  9  -Set CT/INT polarity and mode" EOL);
    pc.printf("  10 -Full System Reset" EOL);
	pc.printf(EOL);
}

static int get_menu_select(uint8_t *menu_select) 
{
    int invalid_check = pc.scanf("%d",(int *) menu_select);
    return input_check(*menu_select, 1, 10, invalid_check);
}

/***************************************************************************//**
 * @brief 	- Select the serial interface (SPI/I2C) and device 
 *				based on the part family.
 *		  	- Only one device and interface can be active. 
 *						Example: ADT7320 - SPI (Internal or Remote device)
 *								 ADT7420 - I2C (Internal or Remote device)
 *
 * @param 	None
 *
 * @return 	new_dev - Return device selected  
 *				 	  Example: 1  - Internal(Main PCB) 
 *							   2  - Remote (External PCB)
 *******************************************************************************/
uint8_t select_device()
{
    pc.printf("Please select interface by choosing a device:" EOL);
	pc.printf("    1- ADT7320 (SPI)" EOL);
	pc.printf("    2- ADT7420 (I2C)" EOL);
	pc.printf("  Select an option: ");
    
    int invalid_check, new_interface = 0;
    invalid_check = pc.scanf("%d", &new_interface);
	
	//Prompts for user input while correct interface is not selected
    while (input_check(new_interface, 1, 2, invalid_check) == FAILURE) {
        pc.printf("Please select interface by choosing a device:" EOL);
	    pc.printf("    1- ADT7320 (SPI)" EOL);
	    pc.printf("    2- ADT7420 (I2C)" EOL);
	    pc.printf("  Select an option: ");
        invalid_check = pc.scanf("%d", &new_interface);
	}
    pc.printf("%d", new_interface);

    switch (new_interface) {
	case 1:
		pc.printf("  ADT7320 sensor selected!" EOL EOL);
		init_params.act_device = ID_ADT7320;
		break;
	case 2:
		pc.printf(" ADT7420 sensor selected!" EOL EOL);
		init_params.act_device = ID_ADT7420;
		break;
	}

    pc.printf("Available devices:" EOL);
	pc.printf("    1- Internal (Main PCB)" EOL);
	pc.printf("    2- Remote   (External PCB)" EOL);
	pc.printf("  Select an option: ");
    
    int new_dev = 0;
    invalid_check = pc.scanf("%d", &new_dev);
	
	//Prompts for user input while correct device is not selected
    while (input_check(new_dev, 1, 2, invalid_check) == FAILURE) {
        pc.printf("Device select:" EOL);
	    pc.printf("    1- Internal (Main PCB)" EOL);
	    pc.printf("    2- Remote   (External PCB)" EOL);
	    pc.printf("  Select an option: ");
        invalid_check = pc.scanf("%d", &new_dev);
	}

    pc.printf("%d", new_dev);
    
	switch (new_dev) {
	case 1:
		pc.printf("  Internal sensor selected!");
		init_params.mbed_i2c_init.slave_address = INTERNAL_I2C;
		init_params.mbed_spi_init.chip_select = INTERNAL_SPI;
        break;
	case 2:
		pc.printf("  External sensor selected!");
		init_params.mbed_i2c_init.slave_address = EXTERNAL_I2C;
		init_params.mbed_spi_init.chip_select = EXTERNAL_SPI;
		break;
	}
    
     return new_dev;
}

/***************************************************************************//**
 * @brief	- Reads and prints the temperature in Celsius Degree
 *
 * @param None
 *
 * @return	- Return SUCCESS flag - currently unused.
 *******************************************************************************/
static uint8_t read_temperature()
{
	float temp = adt7420_get_temperature(device);

	pc.printf("Current temperature:%.3f C", temp);
	return SUCCESS;
}

/***************************************************************************//**
 * @brief	-Set the device resolution for 13 or 16 bits 
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags 
 *******************************************************************************/
static uint8_t set_resolution()
{
	pc.printf("  Available resolutions:" EOL);
	pc.printf("    1- 13-bit" EOL);
	pc.printf("    2- 16-bit" EOL);
	pc.printf("  Select an option: ");

	int new_res, invalid_check = 0;
    invalid_check = pc.scanf("%d", &new_res);
    
    if (input_check(new_res, 1, 2, invalid_check) == FAILURE) {
		return FAILURE;
	} else {
        pc.printf("%d" EOL, new_res);
        new_res = (new_res == 1) ? 0 : 1;
        adt7420_set_resolution(device, new_res);
        pc.printf("Set resolution to %d-bit", (13 + 3 * new_res));
        return SUCCESS;
    }
}

/***************************************************************************//**
 * @brief	- Set the device operation mode
 *			  (Continuous conversion, One-shot, SPS, Shutdown). 
 *			- Consult datasheet for more information.
 *
 * @param None
 *
 * @return - Return SUCCESS/FAILURE flags 
 *******************************************************************************/
static uint8_t set_op_mode()
{
	pc.printf("  Available operation modes:" EOL);
	pc.printf("    1- Continuous conversion mode (default)" EOL);
	pc.printf("    2- One-shot mode" EOL);
	pc.printf("    3- 1 SPS mode" EOL);
	pc.printf("    4- Shutdown" EOL);
	pc.printf("  Select a mode: ");

	int new_mode, invalid_check = 0;
	invalid_check = pc.scanf("%d", &new_mode);
    if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) {
		return FAILURE;
	} else { 
	pc.printf("%d" EOL, new_mode);
	switch (new_mode) {
        case 1:
            adt7420_set_operation_mode(device, ADT7420_OP_MODE_CONT_CONV);
            break;
        case 2:
        /*When One shot mode is set completes one conversion and immediately goes to shutdown mode*/
            adt7420_set_operation_mode(device, ADT7420_OP_MODE_ONE_SHOT);
            pc.printf( EOL"       One Shot mode enabled, device will enter shutdown mode once a conversion is complete." EOL);
            pc.printf("         See page 10 in datasheet for details." EOL);
            break;
        case 3:
            adt7420_set_operation_mode(device, ADT7420_OP_MODE_1_SPS);
            break;
        case 4:
            adt7420_set_operation_mode(device, ADT7420_OP_MODE_SHUTDOWN);
            break;
        default:
            pc.printf("Invalid option" EOL);
            break;
	    }
	return SUCCESS;
    }
}

/***************************************************************************//**
 * @brief	- Prints poll of temperature based on the frequency of readings and
 *			  number of samples. 
 *			
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags
 *******************************************************************************/
static uint8_t bunch_of_temps()
{
	pc.printf("  Enter number of desired samples: ");
	int num_samples, invalid_check = 1;

    invalid_check = pc.scanf("%d", &num_samples);
    if (input_check(num_samples, 1, 2000000, invalid_check) == FAILURE) {
		return FAILURE;
	}
    pc.printf("%d" EOL, num_samples);

	pc.printf("  Enter a desired frequency in samples/sec (max 10): ");
	int sample_freq = 1;
    invalid_check = pc.scanf("%d", &sample_freq);
    if (input_check(sample_freq, 1, 10, invalid_check) == FAILURE) {
		return FAILURE;
	}    
	sample_freq = constrain(sample_freq, 1, 10);
	pc.printf("%d", sample_freq);

	uint32_t delay_sec = 1000000 / sample_freq;
       
	pc.printf("  Gathering %d seconds of samples" EOL, num_samples/sample_freq);
    pc.printf("Press enter to continue and then press again to quit" EOL);
	getchar();

    for (int i = 0; i < num_samples; i++) {
        if(pc.readable()) {
            return SUCCESS; 
        } else {
            pc.printf("  Sample:%d: Temperature:", i + 1);
            float temp = adt7420_get_temperature(device);
            pc.printf("%.4f" EOL, temp);
            wait_us(delay_sec);
        } 
    }
	return SUCCESS;
}

/***************************************************************************//**
 * @brief	- Reads back data store in device registers
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags
 *******************************************************************************/

static uint8_t readback_reg()
{
	pc.printf("  Available registers:" EOL);
	pc.printf("    1- Status" EOL);
	pc.printf("    2- Configuration" EOL);
	pc.printf("    3- Temperature" EOL);
	pc.printf("    4- ID" EOL);
	pc.printf("    5- Critical Temperature setpoint" EOL);
	pc.printf("    6- Hysteresis Temperature setpoint" EOL);
	pc.printf("    7- Temperature high setpoint" EOL);
	pc.printf("    8- Temperature low setpoint" EOL);
	pc.printf("  Select a mode: ");

	uint16_t read_value = 0;
	int new_mode, invalid_check = 0;
	invalid_check = pc.scanf("%d", &new_mode);
    if (input_check(new_mode, 1, 8, invalid_check) == FAILURE) {
		return FAILURE;
	}
	pc.printf("%d" EOL, new_mode);

	switch (new_mode) {
	case 1:
		read_value = get_register_value(device, REG_STATUS);
		break;
	case 2:
		read_value = get_register_value(device, REG_CONFIG);
		break;
	case 3:
		read_value = get_register_value(device, REG_TEMP);
		break;
	case 4:
		read_value = get_register_value(device, REG_ID);
		break;
	case 5:
		read_value = get_register_value(device, REG_T_CRIT);
		break;
	case 6:
		read_value = get_register_value(device, REG_HIST);
		break;
	case 7:
		read_value = get_register_value(device, REG_T_HIGH);
		break;
	case 8:
		read_value = get_register_value(device, REG_T_LOW);
		break;
	default:
		break;
	}
	pc.printf("Read value: 0x%x" EOL, read_value);

	return SUCCESS;
}

/***************************************************************************//**
 * @brief	- Resets device interface (SPI/I2C) (power-on reset)
 *
 * @param None
 *
 * @return	- Return SUCCESS flag - currently unused.
 *******************************************************************************/
static uint8_t reset_interface()
{
	pc.printf("  Resetting interface..." EOL);
	adt7420_reset_interface(device);
    wait_us(RESET_DELAY);
    return SUCCESS;
}

/***************************************************************************//**
 * @brief	- Write to setpoint registers THIGH, TLOW, TCRIT and THYST.
			- Values entered in Celsius and rounded to a near integer value.
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags
 *******************************************************************************/
static uint8_t write_to_setpoint_reg()
{
	pc.printf("  Available registers:" EOL);
	pc.printf("    1- Critical setpoint" EOL);
	pc.printf("    2- Hystersis setpoint" EOL);
	pc.printf("    3- Temperature high setpoint" EOL);
	pc.printf("    4- Temperature low setpoint" EOL);
	pc.printf("  Select a mode: ");

	int new_mode, invalid_check = 0;
	invalid_check = pc.scanf("%d", &new_mode);
    if (input_check(new_mode, 1, 4, invalid_check) == FAILURE) {
		return FAILURE;
	}
	pc.printf("%d" EOL, new_mode);
    
    float temp_c;

    if(new_mode == 2) {
        pc.printf("Enter value to write (0 to 15) Celsius:");
        invalid_check = pc.scanf("%f", &temp_c);
        if(input_check(temp_c, MIN_HYST_TEMP, MAX_HYST_TEMP, invalid_check) == FAILURE) {
            return FAILURE;
        }
    } else {
        pc.printf("Enter value to write (in Celsius):");
        invalid_check = pc.scanf("%f", &temp_c);
        if(input_check(temp_c, TEMP_MIN, TEMP_MAX, invalid_check) == FAILURE){
            return FAILURE;
        }
    }
	    
    pc.printf(" %.2f", temp_c);
	
    int16_t write_value;

    if(new_mode == 2) 
        write_value = round(temp_c);
    else 
        write_value = round(128 * temp_c);

	switch (new_mode) {
	case 1:
		if (adt7420_wr_setpoint_reg(device, REG_T_CRIT, write_value) == SUCCESS)
			pc.printf(EOL "0x%x successfuly written" EOL, write_value);
		else
			pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value);
		break;
	case 2:
		if (adt7420_wr_setpoint_reg(device, REG_HIST, write_value) == SUCCESS)
			pc.printf(EOL "0x%x successfuly written (bits 7:4 are fixed at 0)" EOL, write_value);
		else
			pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value);
		break;
	case 3:
		if (adt7420_wr_setpoint_reg(device, REG_T_HIGH, write_value) == SUCCESS)
			pc.printf(EOL "0x%x successfuly written" EOL, write_value);
		else
			pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value);
		break;
	case 4:
		if (adt7420_wr_setpoint_reg(device, REG_T_LOW, write_value) == SUCCESS)
			pc.printf(EOL "0x%x successfuly written" EOL, write_value);
		else
			pc.printf(EOL "0x%x NOT successfuly written" EOL, write_value);
		break;
	default:
		pc.printf("Invalid selection - try again." EOL);
		wait(2);
		break;
	}
	return SUCCESS;
}

/***************************************************************************//**
 * @brief	- Set the number of undertemperature/overtemperature faults 
 *			that can occur before setting the INT and CT output pins
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags
 *******************************************************************************/
static uint8_t set_fault_queue()
{
    pc.printf("  Available fault queue options:" EOL);
	pc.printf("    1- 1 fault (default) " EOL);
	pc.printf("    2- 2 faults" EOL);
	pc.printf("    3- 3 faults" EOL);
	pc.printf("    4- 4 faults" EOL);
	pc.printf("  Select a mode: ");

	int new_fault, invalid_check = 0;
	invalid_check = pc.scanf("%d", &new_fault);
    if (input_check(new_fault, 1, 4, invalid_check) == FAILURE) {
		return FAILURE;
	} else {
	pc.printf("%d" EOL, new_fault);

 	switch (new_fault)
	     {
        case 1:
            adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_1_FAULT);
            break;
        case 2:
            adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_2_FAULTS);
            break;
        case 3:
            adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_3_FAULTS);
            break;
        case 4:
            adt7420_set_fault_queue(device, ADT7420_FAULT_QUEUE_4_FAULTS);
            break;
        default:
            pc.printf("Invalid option" EOL);
            break;
	    }   return SUCCESS;
    } 
}

/***************************************************************************//**
 * @brief	- Set INT/CT Outputs pins to Comparator or Interrupt mode
 *
 * @param None
 *
 * @return	- Return SUCCESS/FAILURE flags
 *******************************************************************************/
static uint8_t set_ct_int_config()
{
    int new_polarity = 0;
    int new_mode, invalid_check = 0;

    pc.printf("  Choose INT/CT mode:" EOL);
    pc.printf("    1- Interrupt (default) " EOL);
    pc.printf("    2- Comparator " EOL);
    pc.printf("  Select a mode: ");
    invalid_check = pc.scanf("%d", &new_mode);
    if (input_check(new_mode, 1, 2, invalid_check) == FAILURE) {
        return FAILURE;
    } else {
        pc.printf("%d" EOL, new_mode);
        new_mode = (new_mode == 1) ? 0 : 1;
        adt7420_set_ct_int_mode(device, new_mode);    
    }

    pc.printf(EOL " Set output polarity for Critical and Over/Under Temperature pin:" EOL);
    pc.printf("   (Feature available only for internal sensors)." EOL);

    if(init_params.mbed_i2c_init.slave_address == INTERNAL_I2C ||
        init_params.mbed_spi_init.chip_select == INTERNAL_SPI) {

        pc.printf("    1- Active Low (default) " EOL);
        pc.printf("    2- Active High" EOL);
        pc.printf("  Select a mode: ");
        
        invalid_check = pc.scanf("%d", &new_polarity);
        if (input_check(new_polarity, 1, 2, invalid_check) == FAILURE) {
            return FAILURE;
        } else {
            pc.printf("%d" EOL, new_polarity);
            new_polarity = (new_polarity == 1) ? 0 : 1;
            adt7420_set_ct_int_polarity(device, new_polarity);
        }
    }
    return SUCCESS;    
}

/***************************************************************************//**
 * @brief Reset microcontroller
 *
 * @param None
 *
 * @return None.
 *******************************************************************************/
static void microcontroller_reset()
{
    NVIC_SystemReset();    
}   
       
/***************************************************************************//**
 * @brief Prints the active device every time the main menu is redrawn
 *
 * @param external_internal_selection - External or Internal Chip Selected
 *
 * @return None.
 *******************************************************************************/
static void print_active_device(int external_internal_selection)
{
    const char* devices[7] = {EOL EOL "   Active Device: ADT7410 I2C" ,
                        EOL EOL "   Active Device: ADT7420 I2C",
                        EOL EOL "   Active Device: ADT7422 I2C",
                        EOL EOL "   Active Device: ADT7310 SPI",
                        EOL EOL "   Active Device: ADT7311 SPI",
                        EOL EOL "   Active Device: ADT7312 SPI",
                        EOL EOL "   Active Device: ADT7320 SPI"};

    const char* external_internal_print[] = {" - Internal Chip " EOL,
                                             " - External Chip " EOL };

    pc.printf("%s %s", devices[init_params.act_device], external_internal_print[external_internal_selection - 1]);
}

/***************************************************************************//**
 * @brief Checks is an input is a digit and within valid range
 *
 * @param input_val - Value inputed by user
 * @param lowest_accepted_val - Lowest acceptable value
 * @param highest_accepted_val - Highest acceptable value
 * @param invalid_check - Checks if unexpected type of data was entered in scanf
 *
 * @return SUCCESS/FAILURE Flags.
 *******************************************************************************/
 static int input_check(int input_val, 
                        int lowest_accepted_val,
                        int highest_accepted_val, 
                        int invalid_check)
 {
        if(invalid_check == 0 || input_val < lowest_accepted_val || input_val > highest_accepted_val) {
            pc.printf(EOL EOL "*****   Invalid entry: No changes made *****" EOL );
            wait(WAIT_MENU_TIME);
            return FAILURE;
        } 
        return SUCCESS;
}