stingr lib for v8

Dependents:   PYL_v8

Stingr.cpp

Committer:
jmoreno10
Date:
2019-04-30
Revision:
2:31750bae95c8
Parent:
0:f10ccc94eb8a

File content as of revision 2:31750bae95c8:

/* 
 * mbed STINGR Library
 * Copyright (c) 2018 
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
 
#include "Stingr.h"
#include "mbed.h"
#include "rtos.h"

// Get status stuff
bool get_status_setup_flag = false;
char get_status_setup_buffer[50];

// Serial communications
Serial _stingrUART(p13, p14, 9600);  // tx, rx Comunicación Serial con el STINGR
Serial _pc(USBTX, USBRX, 9600);      // tx, rx Comunicación Serial con la PC

// Pin Digital de entrada "CTS" en modo Pull-Up 
// para encontrarse normalmente a VCC cuando no haya un pulso. 
DigitalIn _CTS(p11, PullUp);         

// Pin Digital de Salida "RTS" 
// Predefinido para valer 1 en su estado inactivo dentro del código.
DigitalOut _RTS(p12, 1);

/** Create Stingr instance
*/
Stingr::Stingr()
{
    incomingByte = 0;
    CTS_flag = 1;
    num = 0;
    
    // This thread is for the Mbed to read and serial print responses from STINGR
    t1.start(callback(this,&Stingr::stingr_Response));
}

/** Get response char 
 */
char Stingr::get_respChar() 
{
    return _respChar;
}

/** Get Status buffer
 */
void Stingr::get_status_resp(char * buf)
{
    for (int i=0; i<50; i++) 
        buf[i] = _packet[i];
}

/** Add each incoming byte to packet array
 *  
 *  @param incomingByte Individual bytes coming from STINGR
 */
void Stingr::setPacketByte(int incoming_Byte)
{
    _packet[num] = incoming_Byte;
    num++;
}

/******************************************************************************/
/*************************<THREAD FUNCTION>************************************/
/******************************************************************************/

/** Thread function for reading STINGR responses
 */
void Stingr::stingr_Response()
{
    while(1)
    {
        // Se esperan datos provenientes del TX del STINGR
        if(_stingrUART.readable()) 
        {             
            incomingByte = _stingrUART.getc();
            setPacketByte(incomingByte);
        }
    }
}

/******************************************************************************/
/********************<SERIAL PACKET PROCESSING FUNCTIONS>**********************/
/******************************************************************************/

/** Clear the packet for the next cycle 
 */
void Stingr::clearResponse()
{
    num = 0;
    for(int i = 0; i < 50 ; i++)
        _packet[i] = 0;
}

/** Print response packet to Serial PC 
 */
void Stingr::printResponse()
{
    _pc.printf("\nResponse(Stingr)dec: \t");
    for(int i = 0; i < 50 ; i++)
    {
        _pc.printf("%u",_packet[i]);  // Format specifier
        _pc.printf(" ");
    }
    _pc.printf("\n");
}

/** Set RTS to LOW and read CTS until HIGH
 */
void Stingr::waitCTS()
{
    Thread::wait(200);      // Se da un tiempo para que el analizador se estabilice
    incomingByte=0;
    _RTS=0;                 // Se manda un pulso en bajo en RTS, para inicial el proceso de transmisión
    
    while(CTS_flag==1)
    {// Flag inicialmente vale 1, así que el ciclo while cambiará hasta que esa condición no se cumpla           
        CTS_flag=_CTS.read();        // Cuando entra el ciclo, se iguala flag a CTS, el cual cuando cambie a 0 provocará que termine el while (máx 125 ms)
        //_pc.printf("El valor de flag es %d\n\r", flag);    // Se imprime el valor de flag, para identificar cuando termina el ciclo while
        Thread::wait(10);
    }
}

/** After sending command to STINGR, raise RTS and set flag to 1
 */
void Stingr::raiseRTS_CTS()
{
    Thread::wait(10);                // Se esperan .1 segundos una vez que se terminaron de hacer las transmisiones
    //El tiempo total de transmisión es; el wait previo a las transmisiones, el tiempo que tarda el Mu en enviar los datos y el wait posterior a la transmisión
    _RTS=1;
    Thread::wait(150);
    CTS_flag=1;
} 

/******************************************************************************/
/***************************<CHECKSUM FUNCTION>********************************/
/******************************************************************************/

/** Calculates CRC-16 in X-25
 */
uint16_t Stingr::ModRTU_CRC(char * buf, int len)
{
    unsigned char i;
    unsigned short data;
    uint16_t crc = 0xFFFF;
 
    do{
        data = (unsigned int)0x00FF & *buf++;
        crc = crc ^ data;

        for(i = 8; i > 0; i--)
        {
            if(crc & 0x0001)
                crc = (crc >> 1) ^ 0x8408;
            else
                crc >>=1;  
        }
    
    }while (--len);
  
    crc = ~crc;
  
    // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
    return (crc);  
}

/******************************************************************************/
/*********************<STINGR METACOMMAND FUNCTION>****************************/
/******************************************************************************/

/** Switch case the command for STINGR to execute.
 *
 *  @note The first byte of the string paramater is the command code
 *  @param com Command string from 1-200 characters
 *
 */
void Stingr::command(char* com)  
{ 
    char c = com[0];    

    switch(c) 
    {
        case QUERY_ESN:
            query_ESN();
            break;
            
        case QUERY_BURSTS:
            query_Bursts();
            break;
            
        case QUERY_FIRMWARE:
            query_Firmware();
            break;
            
        case QUERY_SETUP:
            query_Setup();
            break;
            
        case QUERY_HARDWARE:
            query_Hardware();
            break;
            
        case NAK_COMMAND:
            NAK_command();
            break;
            
        case CHANGE_SETUP:
            change_Setup(com);          
            break;
            
        case SEND_DATA:
            send_Data(com);
            break;
            
        case ABORT_TRANSMISSION:
            abort_Transmission();
            break;
                        
        case GET_STATUS:
            get_Status();
            break;
            
        case SELF_TEST:
            self_Test();
            break;
            
        case SOFT_RESET:
            soft_Reset();
            break;
            
        case GET_TEMPERATURE:
            get_Temperature(); 
            break;
            
        case GET_AB_SOFT_VERSION:
            get_Aguila_SF_version();
            break;
        
        case SETUP_RESET:
            setup_Reset();
            break;
    }     
}

/******************************************************************************/
/************************<STINGR COMMAND FUNCTIONS>****************************/
/******************************************************************************/

/** 0x01 Query ESN.
 *  Executes command to ask the Serial Number of the STINGR. 
 */
void Stingr::query_ESN()
{
    _pc.printf("\n\r0x01\t\t\tQuery ESN\n");
    _pc.printf("Command(HEX):\t\tAA 05 01 50 D5\n\r");
    waitCTS();
    Thread::wait(10);
     
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X01);
    _stingrUART.putc(0X50);
    _stingrUART.putc(0XD5);  
    
    raiseRTS_CTS();
    printResponse();
    
// Correct ESN
    if (_packet[3] ==   0 && // 0x00
        _packet[4] ==  41 && // 0x29
        _packet[5] ==  72 && // 0x48      //0x43 STINGR TLE
        _packet[6] == 254)   // 0xFE      //0xB3 STINGR TLE 
    {
        clearResponse();
        _pc.printf("\nQuery ESN is correct\n");
        _respChar = 'y';
    }
// NAK response
    else if (_packet[0] == 170 && // 0xAA
             _packet[1] ==   5 && // 0x05
             _packet[2] == 255 && // 0xFF
             _packet[3] == 161 && // 0xA1
             _packet[4] == 203)   // 0xCB
    {
        clearResponse();   
        _pc.printf("\nNAK response\n"); 
        _respChar = 'X';          // *'X' to denote a NAK response
    }
// Wrong ESN
    else
    {
        clearResponse();
        _pc.printf("\nDifferent ESN\n");    
        _respChar = 'n';
    }
}

/** 0x04 Query Bursts.
 *  Executes command to ask the number of bursts left in the curren transmission. 
 */
void Stingr::query_Bursts()
{
    char bursts = 0; //default value
    
    _pc.printf("\n\r0x04\t\t\tQuery Burst Remaining\n");
    _pc.printf("Command(HEX):\t\tAA 05 04 FD 82\n\r");
    waitCTS();
    Thread::wait(10);
                    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X04);
    _stingrUART.putc(0XFD);
    _stingrUART.putc(0X82);
    
    raiseRTS_CTS();
    printResponse();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {
        clearResponse();   
        _pc.printf("\nNAK response\n"); 
        _respChar = 'X'; // *'X' to denote a NAK response
    }
// ACK response
    else
    {
        bursts = _packet[3];
        clearResponse();
        _pc.printf("\nBursts Remaining: \t");
        _pc.printf("%u \r\n",bursts);                                 
        _respChar = bursts;
    }
}
    
/** 0x05 Query Firmware.
 *  Executes command to ask the Firmware Version (FW) of the STINGR. 
 */
void Stingr::query_Firmware()
{
    _pc.printf("\n\r0x05\t\t\tQuery Firmware Version\n");
    _pc.printf("Command(HEX):\t\tAA 05 05 74 93\n\r");
    waitCTS();
    Thread::wait(10);     
              
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X74);
    _stingrUART.putc(0X93);        
    
    raiseRTS_CTS();
    printResponse();
    
// ACK response
    if (_packet[3] == 1 && // 0x01
        _packet[4] == 3)   // 0x03
    {
        clearResponse();
        _pc.printf("\nQuery Firmware is correct\n");
        _pc.printf(" Firmware Version: 1.3\n");
        _respChar = 'y';
          
    }
// NAK response
    else if (_packet[0] == 170 && // 0xAA
             _packet[1] ==   5 && // 0x05
             _packet[2] == 255 && // 0xFF
             _packet[3] == 161 && // 0xA1
             _packet[4] == 203)   // 0xCB
    {
        clearResponse();   
        _pc.printf("\nNAK response\n"); 
        _respChar = 'X';          // *'X' to denote a NAK response
    }
// Different Firmware
    else
    {
        clearResponse();
        _pc.printf("\nDifferent Firmware\n");
        _respChar = 'n';          // Probably some other firmware version
    }
}

/** 0x07 Query Setup.
 *  Executes command to ask the setup parameters of the STINGR. 
 */
void Stingr::query_Setup()
{
    _pc.printf("\n\r0x07\t\t\tQuery Setup\n");
    _pc.printf("Command(HEX):\t\tAA 05 07 66 B0\n\r");
    waitCTS();
    Thread::wait(10);
                    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X07);
    _stingrUART.putc(0X66);
    _stingrUART.putc(0XB0);
    
    raiseRTS_CTS();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {
        clearResponse();
        _pc.printf("\nNAK response\n");    
    }
// ACK response 
    else
    {
        int rf_chan = _packet[7];
        int bursts  = _packet[8];
        int min_int = _packet[9]*5;
        int max_int = _packet[10]*5;
        
        clearResponse();              // After filling in numSetup, erase packet info
        
        _pc.printf("\nRF: ");
        _pc.printf("%u\n",rf_chan);
        _pc.printf("Bursts: ");
        _pc.printf("%u\n",bursts);
        _pc.printf("Min: ");
        _pc.printf("%u\n",min_int);
        _pc.printf("Max: ");
        _pc.printf("%u\n",max_int); 
        
        get_status_setup_buffer[0] = rf_chan;
        get_status_setup_buffer[1] = bursts;
        get_status_setup_buffer[2] = min_int;
        get_status_setup_buffer[3] = max_int;
        
        for (int i=4; i<50; i++) 
            get_status_setup_buffer[i] = 0;
        
        get_status_setup_flag = true;
    }
}

/** 0x09 Query Hardware.
 *  Executes command to ask the hardware version of the STINGR. 
 */
void Stingr::query_Hardware()
{
    _pc.printf("\n\r0x09\t\t\tQuery Hardware Version\n");
    _pc.printf("Command(HEX):\t\tAA 05 09 18 59\n\r");
    waitCTS();
    Thread::wait(10);                
    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X09);
    _stingrUART.putc(0X18);
    _stingrUART.putc(0X59);
    
    raiseRTS_CTS();
    printResponse();
    
// ACK response
    if (_packet[5] == 143 && // 0x8F
        _packet[6] == 98  && // 0x62
        _packet[7] == 98)    // 0x62
    {
        clearResponse();
        _pc.printf("\nResponse Processing:\tQuery Hardware is correct\n");
        _pc.printf(" Device Code: 01\n");
        _pc.printf(" CPU Revision: 62\n");
        _pc.printf(" Radio Revision: 62\n"); 
        _respChar = 'y';  
    }
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {
        clearResponse();
        _pc.printf("\nNAK response\n");    
        _respChar = 'X';
    }
// Different Hardware
    else
    {
        clearResponse();
        _pc.printf("\nDifferent Hardware Version\n");
        _respChar = 'n';
    }
}

/** 0xFF NAK Command.
 *  Executes an impromperly formatted command. 
 */
void Stingr::NAK_command()
{
    _pc.printf("\n\rXxXX\t\t\tNAK\n");
    _pc.printf("Command(HEX):\t\tAA 05 07 66 B1\n\r");
    waitCTS();
    Thread::wait(10);  
                  
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X07);
    _stingrUART.putc(0X66);
    _stingrUART.putc(0XB1);
    
    raiseRTS_CTS();
    printResponse();
    clearResponse();
    
    _pc.printf("\nNAK response\n");
}

/** 0x06 Setup.
 *  Executes a command that changes the setup of the STINGR. 
 */
void Stingr::change_Setup(char* b)
{

    _pc.printf("\n\r0x06\t\t\tChange Setup\n");
    //_pc.printf("Command(HEX):\t\tAA 0E 06 00 00 00 00 XX XX XX XX 00 CC CC\n\r");
    
// RF Channel 
    int rf = b[1];
    _pc.printf("\nrf channel: %u \n",rf);
    
// Bursts
    int brst = b[2];
    _pc.printf("bursts: %u \n", brst);    
    
// Min Interval
    int min_hund = b[3];
    int min_tens = b[4];
    int min_ones = b[5];   
    int min_int = (min_hund*100 + min_tens*10 + min_ones)/5;
    _pc.printf("Min interval: %u seconds\n", min_int*5);

// Max Interval
    int max_hund = b[6];
    int max_tens = b[7];
    int max_ones = b[8];
    int max_int = (max_hund*100 + max_tens*10 + max_ones)/5;
    _pc.printf("Max interval: %u seconds\n", max_int*5);

    char header[12] = {0xAA,0x0E,0x06,0x00,0x00,0x00,0x00,rf,brst,min_int,max_int,0x00};
    
    _pc.printf("Command(HEX):\t\t");
    //Print b characters in HEX
    for(int k = 0; k < 12; k++)   
        _pc.printf("%X ",header[k]); 
    
    // CRC calculation
    char *t = (char *)header;    //a
    char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF;
    char crc2 = ModRTU_CRC(t,t[1]-2)>>8;
    
    _pc.printf("%X ",crc1); //%X print char in HEX format
    _pc.printf("%X ",crc2); //%X print char in HEX format
        
    waitCTS();
    Thread::wait(10);
    
    //Send Command to STINGR
    for(int k = 0; k < 12; k++)
        _stingrUART.putc(header[k]);
    _stingrUART.putc(crc1);
    _stingrUART.putc(crc2);    
        
    raiseRTS_CTS();
    printResponse();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {  
        clearResponse();
        _pc.printf("\nNAK response\n");  
        _respChar = 'n';
    }
// ACK response
    else
    {
        clearResponse();
        _pc.printf("\nChange Setup successful\n");
        _respChar = 'y';
    }    
}
                           
/** 0x00 Send Data.
 *  Executes command to transmit data packets. 
 */
void Stingr::send_Data(char* b)
{    
    int stingr_msg_size = 0;
    
// Print command info and input                    
    _pc.printf("\n0x00\t\t\tSend Data\n\r");
    _pc.printf("Data Packet length: \t%d\n", b[1]);    
     
// Port b array to rx_buff, but without first character 'h'                    
    char rx_buff[144];  //Declare rx_buff array. rx_buff will copy buf but without 'h'
    for (int k = 0; k < 144; k++)
        rx_buff[k] = b[k+2]; //Starts 2 bytes after: command 'h' (1 byte) and msg size (1 byte).
    
    char * str;
    
    switch (b[1])
    {
        case PYL_MSG_1_PKT:
            str = (char *) malloc(PYL_MSG_1_PKT * sizeof(char));
            stingr_msg_size = PYL_MSG_1_PKT;
            break;
        
        case PYL_MSG_2_PKT:
            str = (char *) malloc(PYL_MSG_2_PKT);
            stingr_msg_size = PYL_MSG_2_PKT;
            break;

        case PYL_MSG_4_PKT:
            str = (char *) malloc(PYL_MSG_4_PKT);
            stingr_msg_size = PYL_MSG_4_PKT;
            break;

        case PYL_MSG_8_PKT:
            str = (char *) malloc(PYL_MSG_8_PKT);
            stingr_msg_size = PYL_MSG_8_PKT;
            break;            
            
        case PYL_MSG_16_PKT:
            str = (char *) malloc(PYL_MSG_16_PKT);
            stingr_msg_size = PYL_MSG_16_PKT;
            break;            
    }
    
    for (int k = 0; k < stingr_msg_size; k++)
        str[k] = rx_buff[k];
    
    // Print Data Packet  
    /*          
    _pc.printf("Data Packet: \t\t");
    for (int k = 0; k < stingr_msg_size; k++)
        _pc.printf("%X ",str[k]);
    _pc.printf("\n");
    */
        
    waitCTS();
    Thread::wait(10);                

// Put str "data" into Serial packet array (to send to STINGR)
    size_t n = stingr_msg_size;
    int number = n+3;
    int len = n+5;
    char header[3] = {0xAA,len,0x00};  //Define header information
    char vec[number];
    //pc.printf("number = %u\n",number);
    
    //store all in vec
    for(int k = 0; k < 3; k++)
       vec[k] = header[k];
    for(int k = 3; k < number; k++)
       vec[k] = str[k-3];//!replaced
       
    _pc.printf("Command(HEX):\t\t");
    //Print b characters in HEX
    for(int k = 0; k < number; k++)   
        _pc.printf("%X ",vec[k]);
    //_pc.printf("End of command\n");

// CRC calculation
    char *t = (char *)vec;    //a
    char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF;
    char crc2 = ModRTU_CRC(t,t[1]-2)>>8;
    
    //_pc.printf("CRC 16-bit calculation bytes: ");
    _pc.printf("%X ",crc1); //%X print char in HEX format
    _pc.printf("%X ",crc2); //%X print char in HEX format
    
//Send Command to STINGR
    for(int k = 0; k < number; k++)
        _stingrUART.putc(vec[k]);
    _stingrUART.putc(crc1);
    _stingrUART.putc(crc2);
          
    raiseRTS_CTS();
    //printResponse();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {  
        clearResponse();
        _pc.printf("\nNAK response\n");  
        _respChar = 'X';
    }
// ACK response
    else if (_packet[0] == 170 && // 0xAA
             _packet[1] ==   5 && // 0x05
             _packet[2] ==   0 && // 0x00
             _packet[3] == 217 && // 0xD9
             _packet[4] == 196)   // 0xC4
    {
        clearResponse();
        _pc.printf("\nSend Data successful\n");
        _respChar = 'y';
    }
// Other Response
    else
    {
        clearResponse();
        _pc.printf("\nOther Response\n");
        _respChar = 'n';
    } 
}

/** 0x03 Abort Transmission.
 *  Executes command to cancel the current transmission. 
 */
void Stingr::abort_Transmission()
{
    _pc.printf("\n\r0x03\t\t\tAbort Transmission\n");
    _pc.printf("Command(HEX):\t\tAA 05 03 42 F6\n\r");
    waitCTS();
    Thread::wait(10);               
    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X05);
    _stingrUART.putc(0X03);
    _stingrUART.putc(0X42);
    _stingrUART.putc(0XF6);
    
    raiseRTS_CTS();
    printResponse();

// ACK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] ==   3 && // 0x03
        _packet[3] ==  66 && // 0x42
        _packet[4] == 246)   // 0xF6
    {
        clearResponse();
        _pc.printf("\nTransmission aborted\n");
        _respChar = 'y';
    }
// NAK response
    else
    {
        clearResponse();
        _pc.printf("\nNAK response\n");   
        _respChar = 'n';
    }
}

/** Get Status.
 *  Executes command to get the status of the STINGR. 
 */
void Stingr::get_Status()
{
    _pc.printf("\n\r\t\t\tGet Status\n");
    _pc.printf("Command(HEX):\t\tAA 0C 52 00 00 00 00 00 00 00 95 29\n\r");
    waitCTS();
    Thread::wait(10); 
                  
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X0C);
    _stingrUART.putc(0X52);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X00);
    _stingrUART.putc(0X95);
    _stingrUART.putc(0X29);
    
    raiseRTS_CTS();
    get_status_resp(get_status_setup_buffer);
    get_status_setup_flag = true;
    //printResponse();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {  
        clearResponse();
        _pc.printf("\nNAK response\n");  
        _respChar = 'n';
    }
// ACK response
    else
    {
        clearResponse();        
        _pc.printf("\nGet Status successful\n");
        _respChar = 'y';
    }
}

/** 0xFD Self Test.
 *  Executes command to make STINGR run a self test. 
 *  Takes about 7-8 seconds
 */
void Stingr::self_Test()
{
    _pc.printf("\n\r0xFD\t\t\tSelf Test Command\n");
    _pc.printf("Command(HEX):\t\tAA 06 FD 0E 9A 71\n\r");
    waitCTS();
    Thread::wait(10);                
    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X06);
    _stingrUART.putc(0XFD);
    _stingrUART.putc(0X0E);
    _stingrUART.putc(0X9A);
    _stingrUART.putc(0X71);
    
    raiseRTS_CTS();
    // Here it may be a good idea to add an 8-sec delay (self test in progress)
    Thread::wait(8000);
    printResponse();
    
// ACK response
    if (_packet[4] == 1 &&      // 0x01
        _packet[5] == 232 &&    // 0xE8
        _packet[6] == 198)      // 0xC6
    {
        clearResponse();
        _pc.printf("\nResponse Processing:\tSelf Test Passed. VALID\n");  
        _respChar = 'y';  
    }
// NAK response
    else
    {
        clearResponse();
        _pc.printf("\nNAK Response\n");
        _respChar = 'n';
    }
}

/** Get Temperature.
 */
void Stingr::get_Temperature()
{   
    char temperature = 0; //default value
    
    _pc.printf("\n\r0x0?\t\t\tGet Temperature\n");
    _pc.printf("Command(HEX):\t\tAA 06 FD 17 DA FC\n\r");
    waitCTS();
    Thread::wait(10);
                    
    _stingrUART.putc(0XAA);      
    _stingrUART.putc(0X06);
    _stingrUART.putc(0XFD);
    _stingrUART.putc(0X17);
    _stingrUART.putc(0XDA);
    _stingrUART.putc(0XFC);
    
    raiseRTS_CTS();
    printResponse();
    
// NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {
        clearResponse();
        
        _pc.printf("\nNAK response\n"); 
        _respChar = 'X'; // *'X' to denote a NAK response
    }
// ACK response
    else
    {
        temperature = _packet[3];
        clearResponse();
                                        
        _pc.printf("\nTemperature: \t deg C");
        _pc.printf("%u \r\n",temperature); 
        _respChar = temperature;
    }
}

void Stingr::get_Aguila_SF_version()
{
    _pc.printf("\r0x0?\t\t\tGet AguilaBoard Software Version\n");
    _pc.printf("\r0x0?\t\t\t PYL_v9_1");
    _respChar = 9;
}

/** Self Test.
 *  Causes a reset on the LPC1768 MCU
 */
void Stingr::soft_Reset()
{
    NVIC_SystemReset();
}

/** Setup Reset.
 *  Resets STINGR's setup to default: channel C, 1 burst, 5s min int, 10s max int
 */
void Stingr::setup_Reset()
{
    _pc.printf("\n\r0x06\t\t\tSetup Reset\n");
    
// RF Channel 
    int rf = 2;
    _pc.printf("rf channel: %u \n",rf);
    
// Bursts
    int brst = 1;
    _pc.printf("bursts: %u \n", brst);    
    
// Min Interval
    int min_int = 5/5;
    _pc.printf("Min interval: %u seconds\n", min_int*5);

// Max Interval
    int max_int = 10/5;
    _pc.printf("Max interval: %u seconds\n", max_int*5);

    char header[12] = {0xAA,0x0E,0x06,0x00,0x00,0x00,0x00,rf,brst,min_int,max_int,0x00};
    
    _pc.printf("Command(HEX):\t\t");
    //Print b characters in HEX
    for(int k = 0; k < 12; k++)   
        _pc.printf("%X ",header[k]); 
    
    // CRC calculation
    char *t = (char *)header;    //a
    char crc1 = ModRTU_CRC(t,t[1]-2)&0xFF;
    char crc2 = ModRTU_CRC(t,t[1]-2)>>8;
    
    _pc.printf("%X ",crc1); //%X print char in HEX format
    _pc.printf("%X ",crc2); //%X print char in HEX format
    
    //_pc.printf("\nResponse(Stingr)HEX:\t");
    
    waitCTS();
    Thread::wait(10);
        
    //Send Command to STINGR
    for(int k = 0; k < 12; k++)
        _stingrUART.putc(header[k]);
    _stingrUART.putc(crc1);
    _stingrUART.putc(crc2);    
        
    raiseRTS_CTS();
    printResponse();
    
    // NAK response
    if (_packet[0] == 170 && // 0xAA
        _packet[1] ==   5 && // 0x05
        _packet[2] == 255 && // 0xFF
        _packet[3] == 161 && // 0xA1
        _packet[4] == 203)   // 0xCB
    {  
        clearResponse();
        _pc.printf("\nNAK response\n");  
        _respChar = 'X';
    }
// ACK response
    else
    {
        clearResponse();
        _pc.printf("\nSetup Reset successful\n");
        _respChar = 'y';
    }
}