Proyecto ABInBev para la tarjeta Guaria 1/2.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers teltonika_fmu130.cpp Source File

teltonika_fmu130.cpp

Go to the documentation of this file.
00001 /**
00002  * @file teltonika_fmu130.cpp
00003  * @author Felícito Manzano (felicito.manzano@detektor.com.sv)
00004  * @brief 
00005  * @version 0.1
00006  * @date 2020-09-28
00007  * 
00008  * @copyright Copyright (c) 2020
00009  * 
00010  */
00011 
00012 #include "BufferedSerial.h"
00013 #include "mbed.h"
00014 #include "teltonika_crc.hpp "
00015 
00016 // extern Serial //myPC_debug.
00017 
00018 // COMMANDS
00019 /**
00020  * @brief 
00021  * 
00022  */
00023 const int   FMU130_COMMAND          = 65;
00024 const int   SERVER_COMMAND          = 64;
00025 const char  FMU130_HEADER[]         = {0x42, 0x54, 0x46, 0x4D, '\0'};
00026 const int   DESTINATION_SERVER      = 0x01;
00027 const int   DESTINATION_FMU130      = 0x00;
00028 
00029 /**
00030  * @brief 
00031  * 
00032  * @param puertoCOM 
00033  * @param m_buffer 
00034  * @return int 
00035  */
00036 int read_avl_uart (BufferedSerial *puertoCOM, char m_buffer[1024]) {
00037     int w = 0;
00038     wait_us(10000);
00039     while (puertoCOM -> readable()) {
00040         char incoming_char = puertoCOM -> getc();
00041         m_buffer[w] = incoming_char;
00042         w++;
00043     }
00044     wait_us(600000);
00045     while (puertoCOM -> readable()) {
00046         char incoming_char = puertoCOM -> getc();
00047         m_buffer[w] = incoming_char;
00048         w++;
00049     }
00050     m_buffer[w] = '\0';
00051     return(w);
00052 }
00053 
00054 /**
00055  * @brief 
00056  * 
00057  * @param m_buffer 
00058  * @return int 
00059  */
00060 int identify_fmu130_payload (char m_buffer[1024]) {
00061     int type_of_payload = -1;
00062     char *pch;
00063 
00064     pch = strchr(m_buffer, FMU130_COMMAND);
00065     if (pch!=NULL) {
00066         type_of_payload = 1;
00067     } 
00068 
00069     pch = strchr(m_buffer, SERVER_COMMAND);
00070     if (pch!=NULL) {
00071         type_of_payload = 2;
00072     }
00073     return(type_of_payload);
00074 }
00075 
00076 
00077 
00078 
00079 /**
00080  * @brief 
00081  * 
00082  * @param m_buffer 
00083  * @param puertoCOM 
00084  * @return true 
00085  * @return false 
00086  */
00087 
00088 bool tx_fmu130_message (char m_buffer[64], BufferedSerial *puertoCOM) {
00089     
00090    
00091     /**
00092      * @brief   Nota sobre el Formateador %04hhX 
00093      *          Se utiliza el 0 para indicar que se deben mostrar los ceros a la izquierda
00094      *          Se utiliza el 4 para indicar que se deben mostrar cuatro caracteres en total
00095      *          Se utilizan las dos letras h para indicar que el argumento es unsigned char
00096      *          Se utiliza la X en mayúsculas para indicar que se utilizará mayúsculas para héxadecimal
00097      */
00098     
00099     int  j = (strlen(m_buffer));
00100     int  k = j+3;
00101     char i = 0x00;
00102     char tx_message[128];
00103     char middle_message[128];
00104     int my_buff_length = 0;
00105     
00106     // Ensamble de cadena parcial desde Length hasta el Payload
00107     //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer);
00108     //myPC_debug.printf("Longitud Payload: %d\r\n", j);
00109     
00110     sprintf(middle_message, "%c%c%c%s", DESTINATION_SERVER, i , j, m_buffer);
00111     
00112     int resultCRC = teltonika_crc16(middle_message,k);
00113     //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC);
00114     
00115     int hi_CRC = ((resultCRC & 0xFF00)>>8);
00116     int lo_CRC = resultCRC & 0x00FF;
00117     
00118     // Ensamble de trama final
00119     my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_SERVER, i , j, m_buffer, hi_CRC, lo_CRC);
00120     puertoCOM->write(tx_message, my_buff_length);
00121     return(true);
00122 }
00123 
00124 bool tx_fmu130_command(const char m_buffer[64], BufferedSerial *puertoCOM) {
00125     int  j = (strlen(m_buffer));
00126     int  k = j+3;
00127     char i = 0x00;
00128     char tx_message[128];
00129     char middle_message[128];
00130     int my_buff_length = 0;
00131     
00132      // Ensamble de cadena parcial desde Length hasta el Payload
00133     //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer);
00134     //myPC_debug.printf("Longitud Payload: %d\r\n", j);
00135     
00136     k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer);
00137     
00138     int resultCRC = teltonika_crc16(middle_message,k);
00139     //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC);
00140 
00141     int hi_CRC = ((resultCRC & 0xFF00)>>8);
00142     int lo_CRC = resultCRC & 0x00FF;
00143     
00144     // Ensamble de trama final
00145     my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_FMU130, i , j, m_buffer, hi_CRC, lo_CRC);
00146     puertoCOM->write(tx_message, my_buff_length);
00147     return(true);
00148 }
00149 
00150 bool tx_fmu130_var_command(char m_buffer[30], BufferedSerial *puertoCOM) {
00151     int  j = (strlen(m_buffer));
00152     int  k = j+3;
00153     char i = 0x00;
00154     char tx_message[128];
00155     char middle_message[128];
00156     int my_buff_length = 0;
00157     
00158      // Ensamble de cadena parcial desde Length hasta el Payload
00159     //myPC_debug.printf("\r\nPayload: %s\r\n", m_buffer);
00160     //myPC_debug.printf("Longitud Payload: %d\r\n", j);
00161     
00162     k = sprintf(middle_message, "%c%c%c%s", DESTINATION_FMU130, i , j, m_buffer);
00163     
00164     int resultCRC = teltonika_crc16(middle_message,k);
00165     //myPC_debug.printf("CRC = %d - %04x\r\n", resultCRC, resultCRC);
00166 
00167     int hi_CRC = ((resultCRC & 0xFF00)>>8);
00168     int lo_CRC = resultCRC & 0x00FF;
00169     
00170     // Ensamble de trama final
00171     my_buff_length = sprintf(tx_message, "%s%c%c%c%s%c%c", FMU130_HEADER, DESTINATION_FMU130, i , j, m_buffer, hi_CRC, lo_CRC);
00172     puertoCOM->write(tx_message, my_buff_length);
00173     return(true);
00174 }