Conexión de un UFS270 al la tarjeta NUCLEO-F091RC, se envia el dato de la altura real del liquido al puerto RS232 del GV300 cada 30seg (Aplicacion para tanques estacionarios)

Dependencies:   BufferedSerial mbed

funciones_UFS270.h

Committer:
mvargas_dtk
Date:
2016-05-26
Revision:
0:d74fc1505b54

File content as of revision 0:d74fc1505b54:

/*
 * - Proyecto:      CH SABMiller.
 * - Lenguaje:      ANSI C/C++ (mbed)
 * - Tarjeta:       Nucleo F091RC
 * - Referencias:
 * - Fecha:         2016/May
 * - Autor(es):     Felícito Manzano /
                    Mario Vargas
 * - Compañia:      V.S.R. de Centroamérica
 * - País:          SV / CR
*/

#include "mbed.h"
#include "BufferedSerial.h"
#include "constantes.hpp"

/* DEFINICIÓN DE FUNCIONES */
/*******************************************************************/
/*******************************************************************/

int ufs270_rtFL(BufferedSerial *puerto_data, char nivel[6], char hw[2], char sw[2])
{
    /*
    Descripción de la función.

    REAL TIME FUEL LEVEL!!

    Esta función recibe un puerto serial Buffered en el que se recibe la trama
    *QL,411D,01,01580,02D0,2205,01551,null#

    +-------------------------------------------------------+
    | PARAMETER            | LENGHT | EXAMPLE | DESCRIPTION |
    +----------------------+--------+---------+-------------+
    | HEADER               |    3   |   *QL,  |             |
    | PROTOCOL             |    1   |     4   |             |
    | FIRMWARE             |    2   |    11   |             |
    | HARDWARE             |    1   |     D,  |             |
    | RESERVED             |    2   |    01,  |             |
    | CALCULATE FUEL LEVEL |    5   | 01580,  | Unit 0.1 mm |
    | SIGNAL STRENG        |    2   |    02   |             |
    | SOFTWARE STATUS CODE |    1   |     D   |             |
    | HARDWARE FAULT CODE  |    1   |     0,  |             |
    | RESERVED             |    4   |  2205,  |             |
    | REAL TIME FUEL LEVEL |    5   | 01551,  | Unit 0.1 mm |
    | RESERVED             |    4   |  null   |             |
    | TAIL                 |    1   |     #   |             |
    +----------------------+--------+---------+-------------+

    Se lee caracter por caracter, al encontrar un asterisco se inicia el conteo
    de caracteres, aprovechando que la longitud de la trama es fija se extrae la
    información de nivel de combustible (REAL TIME FUEL LEVEL) en base al contador
    de caracteres, también se extrae el estatus de software y hardware.

    Si existe información en puerto Serial y es legible se retorna 1.
    Si no existe información para leer en el puerto Serial se retorna 0.
    */

    char ufs270_begin = '*';
    int char_fuel = 29;
    int char_fuel_limit = 33;
    int char_swstatus = 21;
    int char_hwstatus = 22;
    
    int char_counter = 0;
    int z = 0;
    int begin = 0;

    while (puerto_data -> readable()) {
        // If the character on the
        char incoming_char = puerto_data -> getc();
        if (incoming_char == ufs270_begin) {
            char_counter = 1;
            z=0;
            begin = 1;
        } else {
            char_counter++;
        }
        if ((char_counter == char_swstatus) && begin) {
            sw[0] = incoming_char;
        } else if ((char_counter == char_hwstatus) && begin) {
            hw[0] = incoming_char;
        } else if ((char_counter >= char_fuel) && (char_counter <= char_fuel_limit) && begin) {
            nivel[z] = incoming_char;
            z++;
        }
    }

    if (begin) {
        return (1);
    } else {
        return (0);
    }
}



int ufs270_calcFL(BufferedSerial *puerto_data, char nivel[6], char hw[2], char sw[2])
{
    /* Descripción de la función.

    CALCULATE FUEL LEVEL

    Esta función recibe un puerto serial Buffered en el que se recibe la trama
    *QL,411D,01,01580,02D0,2205,01551,null#

    +-------------------------------------------------------+
    | PARAMETER            | LENGHT | EXAMPLE | DESCRIPTION |
    +----------------------+--------+---------+-------------+
    | HEADER               |    3   |   *QL,  |             |
    | PROTOCOL             |    1   |     4   |             |
    | FIRMWARE             |    2   |    11   |             |
    | HARDWARE             |    1   |     D,  |             |
    | RESERVED             |    2   |    01,  |             |
    | CALCULATE FUEL LEVEL |    5   | 01580,  | Unit 0.1 mm |
    | SIGNAL STRENG        |    2   |    02   |             |
    | SOFTWARE STATUS CODE |    1   |     D   |             |
    | HARDWARE FAULT CODE  |    1   |     0,  |             |
    | RESERVED             |    4   |  2205,  |             |
    | REAL TIME FUEL LEVEL |    5   | 01551,  | Unit 0.1 mm |
    | RESERVED             |    4   |  null   |             |
    | TAIL                 |    1   |     #   |             |
    +----------------------+--------+---------+-------------+

    Se lee caracter por caracter, al encontrar un asterisco se inicia el conteo
    de caracteres, aprovechando que la longitud de la trama es fija se extrae la
    información de nivel de combustible en base al contador de caracteres, también
    se extrae el estatus de software y hardware.

    Si existe información en puerto Serial y es legible se retorna 1.
    Si no existe información para leer en el puerto Serial se retorna 0.
    */
    char ufs270_begin = '*';
    int char_fuel = 13;
    int char_fuel_limit = 17;
    int char_swstatus = 21;
    int char_hwstatus = 22;
    
    int char_counter = 0;
    int z = 0;
    int begin = 0;

    if (puerto_data -> readable()) {
        while (puerto_data -> readable()) {
            // If the character on the
            char incoming_char = puerto_data -> getc();
            if (incoming_char == ufs270_begin) {
                char_counter = 1;
                z=0;
                begin = 1;
            } else {
                char_counter++;
            }
            if ((char_counter >= char_fuel) && (char_counter <= char_fuel_limit) && begin) {
                nivel[z] = incoming_char;
                z++;
            } else if ((char_counter == char_swstatus) && begin) {
                sw[0] = incoming_char;
            } else if ((char_counter == char_hwstatus) && begin) {
                hw[0] = incoming_char;
            }
        }
        return (1);
    } else {
        return (0);
    }
}